#php #image-processing #gd
#php #обработка изображений #gd
Вопрос:
Я создавал галерею на php в качестве учебного упражнения, а также потому, что она мне понадобится для показа моих свадебных фотографий через пару месяцев.
Я написал функцию, которая обрабатывает изображения. Он проверяет, какие изображения находятся в исходной папке, и создает эскиз и предварительный просмотр для каждого. До сих пор он работал нормально, поскольку я тестировал небольшие партии изображений.
Теперь у меня есть 24 изображения в исходной папке, которые обрабатывают только первые 18. Я не получаю никаких отображаемых ошибок, кажется, он просто останавливается.
Функция
function processImgs($previewWidth, $thumbWidth, $thumbPath, $previewPath, $originalPath) {
$images = glob($originalPath."*");
foreach($images as $image){
$path_parts = pathinfo($image);
// setup filenames
$thumbFile = $thumbPath . "thumb_" . $path_parts['filename'] . ".jpg";
$previewFile = $previewPath . "preview_" . $path_parts['filename'] . ".jpg";
// calculate new images sizes
$size = getimagesize($image);
$originalWidth = $size['0'];
$originalHeight = $size['1'];
$previewHeight = $originalHeight / ($originalWidth / $previewWidth);
$thumbHeight = $originalHeight / ($originalWidth / $thumbWidth);
//create new images
$original = imagecreatefromjpeg($image);
$preview = imagecreatetruecolor($previewWidth, $previewHeight);
$thumb = imagecreatetruecolor($thumbWidth, $thumbHeight);
imagecopyresampled($preview, $original, 0, 0, 0, 0, $previewWidth, $previewHeight, $originalWidth, $originalHeight);
imagecopyresampled($thumb, $original, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $originalWidth, $originalHeight);
// save images to their new folders
imagejpeg($preview, $previewFile);
imagejpeg($thumb, $thumbFile);
imagedestroy($original);
imagedestroy($preview);
imagedestroy($thumb);
// give some feedback when the script runs
if (file_exists($thumbFile) amp;amp; file_exists($previewFile)) {
echo ". " . $path_parts['filename'] . " processed successfully.<br>";
} else {
echo ". " . $path_parts['filename'] . " <strong>failed.</strong><br>";
}
}
}
Я вызываю функцию следующим образом
processImgs(1200, 400, "thumb/", "preview/", "original/");
Я не знаю, почему он не работает с большим количеством файлов. Есть ли ограничение по времени, которое я мог бы использовать? Это занимает некоторое время. В настоящее время я создаю это локально на MAMP.
Обновить
Майк был прав, время ожидания функции истекло. Его решение гораздо более подходящее.
Теперь я создал скрипт, который делает то, что он предложил, и он решил проблему. Спасибо за помощь. Я добавил приведенный ниже скрипт на случай, если он пригодится другим.
$newWidth = 400;
if (isset($_GET['img'])) {
$img = $_GET['img'];
$filename = $img . ".jpg";
if (file_exists($filename)) {
$fp = fopen($filename, 'rb');
header("Content-Type: image/jpeg");
header("Content-Length: " . filesize($filename));
fpassthru($fp);
exit;
} else {
$originalFile = "../original/" . $filename;
$original = imagecreatefromjpeg($originalFile);
$size = getimagesize($originalFile);
$newHeight = $size['1'] / ( $size['0'] / $newWidth);
$new = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($new, $original, 0, 0, 0, 0, $newWidth, $newHeight, $size['0'], $size['1']);
imagejpeg($new, $filename);
imagedestroy($original);
imagedestroy($new);
$fp = fopen($filename, 'rb');
header("Content-Type: image/jpeg");
header("Content-Length: " . filesize($filename));
fpassthru($fp);
}
}
Комментарии:
1. PHP имеет ограничение по времени выполнения по умолчанию, после которого он просто … остановится. Вы можете изменить значение, отредактировав PHP. INI, если у вас есть к этому доступ. Лучший подход — проверить, был ли сгенерирован эскиз при запросе, и затем сгенерировать его. Последующие запросы получат уже созданную версию.
2. Я не получаю никаких отображаемых ошибок , вы включили сообщение об ошибках?
error_reporting(E_ALL); ini_set('display_errors', 'on');