Фон
Я прочитал много сайтов, в том числе этот для решения. У меня есть сценарий с водяными знаками, который до нескольких месяцев назад работал безупречно. Мой хостинг-провайдер выполнил обычные обновления и использовал мой скрипт. Я сделал одну настройку, это сработало. Со временем сценарий с водяными знаками, кажется, очень сильно загружает системные ресурсы, вызывая всевозможные проблемы с моим сайтом, включая случайную загрузку изображений и т. Д. В настоящее время кажется, что я могу запустить сайт на 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);
?>
Это должно значительно снизить нагрузку на сервер.