PHP Запуск скрипта после завершения фонового процесса?

Я конвертирую PDF с PDF2SWF и индексирую с XPDF.. с exec.. только это требует очень большого времени выполнения.

Можно ли запустить его как фоновый процесс, а затем запустить скрипт, когда он завершит конвертацию?

3 ответа

Решение

В общем, php не реализует потоки.

Но есть ZF-класс, который может подойти вам:

http://framework.zend.com/manual/en/zendx.console.process.unix.overview.html

ZendX_Console_Process_Unix позволяет разработчикам порождать объект как новый процесс, а также выполнять несколько задач параллельно в консольных средах. Благодаря своей специфике, он работает только на системах на основе nix, таких как Linux, Solaris, Mac/OSx и тому подобное. Кроме того, для работы этого компонента требуются модули shmop_, pcntl_ * и posix_*. Если одно из требований не выполнено, оно создаст исключение после создания экземпляра компонента.

подходящий пример:

class MyProcess extends ZendX_Console_Process_Unix
{
    protected function _run()
    {
        // doing pdf and flash stuff
    }
}

$process1 = new MyProcess();
$process1->start();

while ($process1->isRunning()) {

    sleep(1);

}

echo 'Process completed';

,

Попробуйте использовать popen () вместо exec().

Этот хак будет работать на любой стандартной установке PHP, даже на Windows, никаких дополнительных библиотек не требуется. Вы действительно не можете контролировать все аспекты процессов, которые вы запускаете таким образом, но иногда этого достаточно:

$p1 = popen("/bin/bash ./some_shell_script.sh argument_1","r");
$p2 = popen("/bin/bash ./some_other_shell_script.sh argument_2","r");
$p2 = popen("/bin/bash ./yet_other_shell_script.sh argument_3","r");

Три порожденных сценария оболочки будут работать одновременно, и пока вы не сделаете pclose ($ p1) (или $ p2 или $ p3) или не попробуете прочитать ни один из этих каналов, они не будут блокировать ваше выполнение PHP.

Когда вы закончите с другими вещами (теми, что вы делаете со своим PHP-скриптом), вы можете вызвать pclose () на каналах, и это приостановит выполнение вашего скрипта, пока процесс, который вы закрываете, не завершится. Тогда ваш скрипт может сделать что-то еще.

Обратите внимание, что ваш PHP не завершит или не умрет (), пока эти сценарии не будут завершены. Достижение конца скрипта или вызов die () заставит его ждать.

Если вы запускаете его из командной строки, вы можете разветвить процесс php, используя pcntl_fork

Есть также классы демонов, которые сделали бы то же самое:

http://pear.php.net/package/System_Daemon

$pid = pcntl_fork();
if ($pid == -1) {
     die('could not fork');
} else if ($pid) {

     //We are the parent, exit
exit();

} else {

// We are the child, do something interesting then call the script at the end.

}
Другие вопросы по тегам