PHP水印图像即时

时间:2014-12-05 23:39:55

标签: php image .htaccess watermark

背景

我已经阅读了很多网站,包括这个解决方案。我有一个水印脚本,直到几个月前完美无瑕地工作。我的托管服务提供商执行了例行更新并且我的脚我做了一个调整,它工作。随着时间的推移,水印脚本似乎在系统资源上非常沉重,导致我的网站出现各种问题,包括图像无法随机加载等等。目前,似乎我可以在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$gjp(|e)g$。无论如何,这些改变似乎没有任何帮助,似乎进一步损害了表现。

同样,任何指导都将不胜感激。提前谢谢。

2 个答案:

答案 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);

?>

这应该会显着降低服务器上的负载。