0

我有一个简单的脚本,它为盗链添加水印。最近它开始消耗 CPU(有时一位用户的 CPU 使用率达到 12%!)。我能做些什么来最小化 CPU 使用率?

set_time_limit ( 3 );
if(!empty($_GET['e'])){
   $data = getimagesize("images/".$_GET['e']);

   // create base image
   $base_image = imagecreatetruecolor($data[0],$data[1]);
   $photo = imagecreatefromjpeg("images/".$_GET['e']);
   $top_image = imagecreatefrompng('watermark.png');
   imagesavealpha($top_image, true);
   imagealphablending($top_image, true);
   imagesavealpha($base_image, true);
   imagealphablending($base_image, true);
   $data2 = getimagesize('watermark.png');

   // merge images
   imagecopy($base_image, $photo, 0, 0, 0, 0, $data[0], $data[1]);
   imagecopy($base_image, $top_image, 0, 0, 0, 0, $data2[0], $data2[1]);

   // return file
   header('Content-Type: image/png');
   imagepng($base_image);
} else 
    header('Location: http://www.mydomain.com/');
4

1 回答 1

2

正如@mikew 击败我所说的那样......缓存带水印的图像。

一个简单的实现是

// get the file extension and set some convience variables
$ext = substr($_GET["e"], strrpos($_GET["e"], ".")+1);
$cacheFile = "images/wm/".$_GET['e'];
$srcFile  = "images/".$GET["e"];
// check to see if the file exists in the watermark directory
if (!file_exists($cacheFile)){
    // do sweet image processing magic if cache file doesn't exist and create the cache file
    $data = getimagesize($srcFile);
    // create base image
    $base_image = imagecreatetruecolor($srcFile);
    $photo = imagecreatefromjpeg($srcFile);
    $top_image = imagecreatefrompng('watermark.png');
    imagesavealpha($top_image, true);
    imagealphablending($top_image, true);
    imagesavealpha($base_image, true);
    imagealphablending($base_image, true);
    $data2 = getimagesize('watermark.png');

    // merge images
    imagecopy($base_image, $photo, 0, 0, 0, 0, $data[0], $data[1]);
    imagecopy($base_image, $top_image, 0, 0, 0, 0, $data2[0], $data2[1]);

    switch($ext){
        case "jpg":
        case "jpeg":
            header("Content-Type: image/jpeg");
            imagejpeg($base_image, $cacheFile);
            break;
        case "png":
            header("Content-Type: image/png");
            imagepng($base_image, $cacheFile);
            break;
    }
}
// output the cached file. 
readfile($cacheFile);
于 2013-07-20T04:23:36.153 回答