Фоновый скрипт на общем хосте с установленными несколькими версиями PHP

Мне нужно было создать эскизы (используя PHP5) для сценария управления изображениями и возникла проблема, когда у моего хоста было несколько версий PHP, установленных (4 и 5), причем PHP4 установлен по умолчанию. Это означало, что любые вызовы php из CLI будут запускать PHP4. Я придумал следующее, как я надеюсь, что это кросс-платформенное решение. Я размещаю его здесь в первую очередь, так как у меня было много проблем с поиском какой-либо помощи с помощью Google, так что это может помочь кому-то в будущем, у меня также есть следующие вопросы.

  1. Вы видите что-то явно неправильное?
  2. Есть ли другие пути к двоичному файлу php5, который вы знаете или знаете лучший порядок, чтобы иметь массив для оптимизации?
  3. Если хост отключен exec или shell_exec, будет ли сценарий EGalleryProcessQueue.php работать как отдельное задание cron? У меня нет доступа к cron, чтобы проверить это. Я не слишком беспокоюсь об этом вопросе, так как в любом случае я все равно испытаю его.
  4. Есть ли у кого-нибудь какие-либо предложения относительно способа, с помощью которого я могу получить некоторую обратную связь о том, как далеко через изображения обрабатывается? См. Раздел TODO в EGalleryProcessQueue.php. Я хочу отобразить индикатор выполнения, когда он находится в разделе администратора.

Основной скрипт

/** * Writes the array to a text file in /path/to/gallery/needsThumbs.txt for batch processing. * Runs the thumbnail generator script in the background. * * @param array $_needsThumbs the array of images needing thumbnails */ private function generateThumbnails($_needsThumbs) { file_put_contents($this->_realpath.DIRECTORY_SEPARATOR.'needsThumbs.txt',serialize($_needsThumbs)); $Command = realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'EGalleryProcessQueue.php '.$this->_realpath.' '.$this->thumbnailWidth.' '.$this->thumbnailHeight; if(PHP_SHLIB_SUFFIX == 'so')// *nix (aka NOT windows) { /* * We need to make sure we are using the right PHP version * (problems with shared hosts that have PHP4 and PHP5 installed, * but PHP4 set as default). */ $phpPaths = array('php', '/usr/local/bin/php', '/usr/local/php5/bin/php', '/usr/bin/php', '/usr/bin/php5'); foreach($phpPaths as $path) { exec("echo '<?php echo version_compare(PHP_VERSION, \"5.0.0\", \">=\"); ?>' | $path", $result); if($result) { shell_exec("nohup $path $Command 2> /dev/null > /dev/null &"); break; } } } else // Windows { $WshShell = new COM("WScript.Shell"); $WshShell->Run("php.exe $Command", 0, false); } } 

EGalleryProcessQueue.php

 #!/usr/bin/php <?php if ($argc === 4 && strstr($argv[0], basename(__FILE__))) { // File is being called by the CLI and has not been included by another script if(!file_exists($argv[1].DIRECTORY_SEPARATOR.'needsThumbs.txt')) { // Either no thumbnails need to be created or a wrong directory has been supplied exit; } include(realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'EGalleryThumbGenerator.php'); $generator = new EGalleryThumbGenerator; $generator->directory = $argv[1]; $generator->thumbnailWidth = is_int($argv[2]) ? $argv[2] : 128; $generator->thumbnailHeight = is_int($argv[3]) ? $argv[3] : 128; // $generator->processImages() returns the number of images left to process (it does them in blocks of 10) while (($i = $generator->processImages()) > 0) { /* * TODO Can we get some sort of feedback to the user here? * Possibly so that we can display a progress bar in the management section. * Probably have to write $i to a file to be read by the main script. */ } exit; } ?> в #!/usr/bin/php <?php if ($argc === 4 && strstr($argv[0], basename(__FILE__))) { // File is being called by the CLI and has not been included by another script if(!file_exists($argv[1].DIRECTORY_SEPARATOR.'needsThumbs.txt')) { // Either no thumbnails need to be created or a wrong directory has been supplied exit; } include(realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR.'EGalleryThumbGenerator.php'); $generator = new EGalleryThumbGenerator; $generator->directory = $argv[1]; $generator->thumbnailWidth = is_int($argv[2]) ? $argv[2] : 128; $generator->thumbnailHeight = is_int($argv[3]) ? $argv[3] : 128; // $generator->processImages() returns the number of images left to process (it does them in blocks of 10) while (($i = $generator->processImages()) > 0) { /* * TODO Can we get some sort of feedback to the user here? * Possibly so that we can display a progress bar in the management section. * Probably have to write $i to a file to be read by the main script. */ } exit; } ?> 

Solutions Collecting From Web of "Фоновый скрипт на общем хосте с установленными несколькими версиями PHP"

Вы видите что-то явно неправильное?

Нет, код выглядит хорошо.

Есть ли другие пути к двоичному файлу php5, который вы знаете или знаете лучший порядок, чтобы иметь массив для оптимизации?

На это трудно ответить, поскольку PHP можно установить где угодно на сервере. Пути, которые у вас кажутся мне очень логичными, но может быть любое количество других мест, которые могут быть установлены.

Вместо того, чтобы предоставлять кучу каталогов, в которых может быть установлен PHP5, как насчет наличия параметра, который пользователь должен установить, чтобы предоставить путь к исполняемому файлу PHP5, если он не находится в их $ PATH?

Если хост отключен exec или shell_exec, можно ли запустить скрипт EGalleryProcessQueue.php через задание cron?

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

Есть ли у кого-нибудь какие-либо предложения относительно способа, с помощью которого я могу получить некоторую обратную связь о том, как далеко через изображения обрабатывается? См. Раздел TODO в EGalleryProcessQueue.php. Я хочу отобразить индикатор выполнения, когда он находится в разделе администратора.

Храните количество изображений, заполненных где-нибудь (файл, db, может быть, даже session var) и каждый раз вызывайте огонь AJAX для функции, которая обеспечивает выполнение vs total. Затем используйте что-то вроде http://docs.jquery.com/UI/Progressbar