Reputation: 1135
I have a simple script which watermarks hotlinking. Recently it has started eating up CPU (sometimes reaching 12% CPU usage from one user!). What can i do to minimize CPU usage?
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/');
Upvotes: 0
Views: 158
Reputation: 24655
As @mikew beat me to saying ... cache the watermarked image.
A simple implementation of this would be
// 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);
Upvotes: 2