PHP Запуск скрипта после завершения фонового процесса? - PullRequest
4 голосов
/ 10 марта 2010

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

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

Ответы [ 3 ]

2 голосов
/ 10 марта 2010

в общем, 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';

.

0 голосов
/ 10 марта 2010

Попробуйте использовать 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 () заставит его ждать.

0 голосов
/ 10 марта 2010

Если вы запускаете его из командной строки, вы можете разветвить процесс 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.

}
...