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

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

Вопрос

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

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

Это было полезно?

Решение

как правило, 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.

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