2014-12-05 1 views
0

фон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

Кэш модифицированного файла? – symcbean

+0

Вы можете проверить один из моих ответов [здесь] (http://stackoverflow.com/questions/7933262/how-to-prevent-having-the-is-not-a-valid-image-file-error-when -using-gd-functi/7933349 # 7933349) - таким образом вы можете открывать изображения без проверки типов файлов. – Mikk

+0

Это был интересный подход для очистки всех строк кода preg_match, но, к сожалению, он не улучшил производительность. – canon

ответ

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

?> 

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