[英]PHP watermark images on the fly
背景
我已经通读了许多站点,包括此站点,以寻求解决方案。 我有一个水印脚本,直到几个月前它都可以正常工作。 我的托管服务提供商执行了例行更新并清除了我的脚本。 我对其进行了一次调整,此方法奏效了。 随着时间的流逝,水印脚本似乎占用了大量系统资源,导致我的网站出现各种问题,包括图像无法随机加载等。目前,看来我可以在PHP 5.4或以上版本中运行该网站。和它下面。 如果有帮助,当前以5.4运行。
说明
该脚本旨在从特定位置查找大小不等的图像文件,并与多个png图像之一实时组合,而不会覆盖原始图像。
剧本
在过去一周中,我对脚本进行了重大修改,但性能略有改善。 我不知所措,是否需要对该脚本进行进一步的改进或使代码更简洁。 任何帮助将不胜感激。
文件.htaccess,三个jpg和watermark.php脚本。
的.htaccess
RewriteRule ^(.*)wp-content/uploads/(.*) $1watermark.php?src=wp-content/uploads/$2
watermark.php
<?php
$src = $_GET['src'];
if(preg_match('/.gif/i',$src)) { $image = imagecreatefromgif($src); }
if(preg_match('/.png/i',$src)) { $image = imagecreatefrompng($src); }
if(preg_match('/.jpeg/i',$src)||preg_match('/.jpg/i',$src)) { $image = imagecreatefromjpeg($src); }
if (!$image) exit();
// if (empty($images)) die();
if (imagesx($image) > 301 ) { $watermark = imagecreatefrompng('watermark.png'); } // height greater than 301 then apply watermark 600x600
elseif (imagesx($image) > 175 ) { $watermark = imagecreatefrompng('watermarksm.png'); } // height greater than 175 then apply small watermark 200x200
else { $watermark = imagecreatefrompng('empty.png'); } // apply a dummy watermark resulting in none. 1x1
$dest_x = imagesx($image) - imagesx($watermark) - 0;
$dest_y = imagesy($image) - imagesy($watermark) - 0;
imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, imagesx($watermark), imagesy($watermark));
header('content-type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
//die();
?>
我尝试过的未在此脚本中反映的几件事是以下“较小”更改。
if(preg_match('/.gif/i',$src))
到if(preg_match('/\\.gif$/i',$src))
在preg_match中尝试的另一个变体是jpe$g
和jp(|e)g$
。 这些变化似乎无济于事,而且似乎进一步损害了性能。
再次,任何指导将不胜感激。 先感谢您。
为什么不一次为所有图像创建带水印的版本? 它将避免服务器每次在您的网站上显示图像时都无法工作,从而提高性能。
如果出于任何原因需要显示原始图像,请执行一个脚本来检查查看器的凭据,然后返回图像。
首先,那些正则表达式不是性能消耗。 真正的性能问题来自图像处理。
保存结果来自imagejpeg($image);
放入世界上“隐藏”的磁盘文件中。 您可以使用.htaccess
限制对该文件夹的访问。
逻辑应该是这样的:
<?php
// Implement getTempFile to get a path name to the hidden folder.
$tempsrc = getTempFile($src)
$tempsrcexists = file_exists($tempsrc);
if (!$tempsrcexists)
{
// Create image on disk.
...
}
// At this point, the temporary file must exist.
$fp = fopen($tempsrcexists, 'rb');
// Output data to the client from the temporary file
header("Content-type: image/jpeg");
fpassthrough($fp);
fclose($fp);
?>
这将大大减少服务器上的负载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.