Изображения водяных знаков PHP на лету

Фон

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

Опять же, любое руководство будет оценено. Заранее спасибо.

0

Решение

Почему бы вам не раз и навсегда создать версию всех ваших изображений с водяными знаками? Это позволит избежать работы сервера каждый раз, когда изображение будет отображаться на вашем веб-сайте, и вы повысите производительность.

Если по какой-либо причине вам необходимо отобразить исходное изображение, выполните сценарий, который проверяет учетные данные зрителя, а затем верните изображение.

1

Другие решения

Во-первых, эти регулярные выражения не являются падениями производительности. Настоящие проблемы с производительностью связаны с манипуляциями с изображениями.

Сохранить результат из 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);

?>

Это должно значительно снизить нагрузку на сервер.

0

По вопросам рекламы [email protected]