Вы можете сделать это несколькими способами.
Лучший способ, IMHO, состоит в том, чтобы разбить скрипт на часть «сканирование каталогов», которая решает, какие изображения нуждаются в миниатюре, сравнивая временную метку источника и существования и временную метку места назначения.
Вторая часть уменьшает изображение только по одному изображению за раз.
Затем вы можете запустить вторую часть сценария и только уменьшенное изображение при запросе миниатюры:
<?php
...
$run = true;
if (file_exists($thumbnail))
if (filemtime($thumbnail) > filemtime($source))
$run = false;
if ($run)
{
// run, say, ImageMagick and convert $source to $thumbnail
if (!$success)
$thumbnail = './images/sorry-error-in-thumbnailing.jpg';
}
Header("Content-Type: image/jpeg");
Header("Content-Length: " . filesize($thumbnail));
readfile($thumbnail);
?>
Конечно, если вы склонны иметь генерировать много миниатюр в то время, , это опасно, потому что вы можете запускать много копий эскиза, забивая процессор вашего сервера.
Let me clarify: you put the above script in place of IMG SRC="thumbnail1234.jpg"
request. Then the user viewing the page with the thumbnails will start several
requests for thumbnail.php?source=image123, ...?source=image235 and so on. They
will run in parallel, and most of them (if the thumb is there) can read the thumbnail
or issue a 302 Redirect to it, both very fast and with little server load.
ONLY IF the thumbnail isn't there, THAT image will appear after a delay because it
is generated and served directly. The user will see most, maybe all, images loading
instantly, and some of them lag behind a little (ideally).
В этом случае вы можете запустить проверку загрузки системы до того popening, или вы можете сохранить текущий счет процессов запускаемых.
Вы можете ограничить один номер, который будет запущен за один раз, установив, существует ли «tempthumbnail.jpg» и не старше $ SECONDS секунд, перетаскивая $ source на tempthumbnail.jpg, а затем переименовывая tempthumbnail в $ thumbnail; и/или используя flock(), если система позволяет надежно. Или вы можете сохранить количество процессов, выполняемых в базе данных:
query("UPDATE sysvars SET runner = runner + 1;");
shell_exec("...");
query("UPDATE sysvars SET runner = runner - 1;");
В противном случае вы можете запустить скрипт каждый сейчас и потом, через хроны или же в начале вашего скрипта, когда вы видите, что предыдущий запуск был более $ TIME секунд назад. Или вы можете проверить флаг (или файлmtime() исходного каталога), когда вы загружаете изображение для печати.
В последнем случае, если вы контролируете закачки, запустите thumber сразу же после завершения загрузки. Загрузка пользователя будет сериализовать процессы большого пальца, и маловероятно, что любая операция, выполняемая для «показа» новых изображений, будет активирована так вскоре после загрузки; поэтому, наоборот, очень важно, что, когда пользователь говорит: «ОК, активируйте изображение 12345», эскиз 12345 уже сделан и готов к «мгновенному» показу.
Многое зависит от того, как работает скрипт thumbing. если он всегда восстанавливает все миниатюры, неэффективность там. Если он проверяет, то «сухой прогон» - это просто чтение целого каталога и множество вызовов stat(), которые довольно быстры. Если вы не запускаете тысячи изображений, вам не о чем беспокоиться.
Вам нужен скрипт, который сканирует каталог и создает миниатюру для каждого добавленного файла (автоматически)? –
Как изображения попадают на сервер в первую очередь? Если они загружены, вы можете сгенерировать их при загрузке, иначе используйте croned scripts для создания эскизов. – Devraj
на домкрате, да. @Devraj настроен, поэтому я могу просто сбрасывать изображения в папку, как я их делаю. пока еще нет загрузчика клиентской стороны. – expiredninja