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

StackOverflow https://stackoverflow.com/questions/1985354

Вопрос

Мне нужен был способ создания эскизов (с использованием 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;
}
?>
Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top