2012-06-05 3 views
0

У меня есть сценарий, который создает уменьшенные изображения больших изображений, и он работает нормально, проблема в том, что он помещается в начале страницы, где просматриваются оба изображения, и, насколько мне известно, будет запускаться каждый раз, когда кто-то посещает страницу. Это не очень показательно.Как создать фоновый скрипт автоматизации php для Windows и Unix?

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

Как бы я решил настроить или улучшить его каким-то образом?

нашел это, не уверен, как он работает. что $ CMD: создание

/*I combined several efforts in this topic into one function: 
This will execute $cmd in the background (no cmd window) 
without PHP waiting for it to finish, on both Windows and Unix.*/ 
    function execInBackground($cmd) { 
     if (substr(php_uname(), 0, 7) == "Windows"){ 
      pclose(popen("start /B ". $cmd, "r")); 
     } 
     else { 
      exec($cmd . " > /dev/null &"); 
     } 
    } 
+1

Вам нужен скрипт, который сканирует каталог и создает миниатюру для каждого добавленного файла (автоматически)? –

+0

Как изображения попадают на сервер в первую очередь? Если они загружены, вы можете сгенерировать их при загрузке, иначе используйте croned scripts для создания эскизов. – Devraj

+0

на домкрате, да. @Devraj настроен, поэтому я могу просто сбрасывать изображения в папку, как я их делаю. пока еще нет загрузчика клиентской стороны. – expiredninja

ответ

4

Временная база: Возможно (если у вас есть доступ к оболочке), вы можете создать "хрон":

В '' /etc/crond.d/'' Создайте файл следующим образом:

0 6-18 * * * root /path/to/your/script.php >> /dev/null 2>&1 

Он будет выполняться каждый час с 6.00 до 18.00.

См.: http://en.wikipedia.org/wiki/Cron для более подробной информации.

Автоматическое создание: Если у вас есть «процедура загрузки», просто добавьте «Генератор миниатюр» после загрузки.

Hook Creation: Действительно, это зависит от процедуры, которую вы используете для добавления новых изображений в свой каталог.

Возможно, вы также можете сделать крючок для выполнения сценария после обновления каталога.

Но я думаю, что первое решение, основанное на времени (cron), является самым простым в реализации.

+0

Это cron вещи выглядит потрясающе. нет эквивалентов окон? – expiredninja

+1

Я думаю, вы можете использовать «Задачу расписания»: http://support.microsoft.com/kb/308569, но я больше знаком с Liux :) – Akarun

+0

опоздать, примет этот ответ, если я смогу реализовать это позже. – expiredninja

1

Как указано в другом ответе, cron будет вашим лучшим выбором, но он доступен только для Linux (возможно, у Windows есть другая альтернатива). Однако, если вам требуется независимое от платформы решение или у вас нет доступа к конфигурации вашего сервера, вы можете придерживаться своего исходного решения (генерировать эскиз на каждой загрузке страницы), но модифицируйте его для эффективности с использованием класса CronExpression: https://github.com/mtdowling/cron-expression

Используя этот класс, вы бы просто определить выражение выполнения хрон, как этот:

0 6-18 * * * 

, а затем проверить, если задача регенерации эскизов должна быть выполнена:

$cron_expression = Cron\CronExpression::factory($cron_schedule); 
$next_run_date = $cron_expression->getNextRunDate(); 
if ($next_run_date <= new DateTime()) { 
    //execute task 
} 
1

Вы можете сделать это несколькими способами.

Лучший способ, 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(), которые довольно быстры. Если вы не запускаете тысячи изображений, вам не о чем беспокоиться.

Смежные вопросы