背景
我已经阅读了很多网站,包括这个解决方案。我有一个水印脚本,直到几个月前完美无瑕地工作。我的托管服务提供商执行了例行更新并且我的脚我做了一个调整,它工作。随着时间的推移,水印脚本似乎在系统资源上非常沉重,导致我的网站出现各种问题,包括图像无法随机加载等等。目前,似乎我可以在PHP版本5.4或上面的一个或两个版本上运行该网站在它下面。目前运行在5.4,如果这应该有帮助。
解释
该脚本旨在查找特定位置的图像文件,等待大小,在运行时与多个png图像中的一个结合,而不会覆盖原始图像。
脚本
我在过去一周内对我的剧本进行了重大修改,但性能略有提升。我的智慧结束了,这个脚本是否有进一步改进或更清晰的代码。非常感谢任何帮助。
文件 .htaccess,三个jpg(s)和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();
?>
我在这个剧本中没有反映的一些事情是以下&#34;未成年人&#34;变化
if(preg_match('/.gif/i',$src))
至if(preg_match('/\.gif$/i',$src))
preg_match中尝试的另一个变体是jpe$g
和jp(|e)g$
。无论如何,这些改变似乎没有任何帮助,似乎进一步损害了表现。
同样,任何指导都将不胜感激。提前谢谢。
答案 0 :(得分:1)
为什么不为所有人创建所有图像的水印版本?每次在您的网站上显示图像时,它都会避免服务器工作,并且您将获得性能。
如果出于任何原因需要显示原始图像,请执行检查查看器凭据的脚本,然后返回图像。
答案 1 :(得分:0)
首先,那些正则表达式不是性能值。真正的性能问题来自图像处理。
将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);
?>
这应该会显着降低服务器上的负载。