后台进程完成后启动PHP脚本?

时间:2010-03-10 04:23:59

标签: php process background-process pdf2swf

我正在使用PDF2SWF转换PDF并使用XPDF转换索引..只有这需要执行时间非常高。

是否可以将其作为后台进程运行,然后在转换完成后启动脚本?

3 个答案:

答案 0 :(得分:2)

一般来说,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';

答案 1 :(得分:0)

尝试使用popen()而不是exec()。

这个hack适用于任何标准的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");

三个衍生的shell脚本将同时运行,只要你不执行pclose($ p1)(或$ p2或$ p3)或尝试读取任何这些管道,它们就不会阻止你的PHP执行。

当你完成其他东西(你正在使用PHP脚本的那个)时,你可以在管道上调用pclose(),这将暂停你的脚本执行,直到你正在完成的过程结束。然后你的脚本可以做其他事情。

请注意,在这些脚本完成之前,您的PHP不会结束或死亡()。到达脚本的末尾或调用die()将使它等待。

答案 2 :(得分:-1)

如果从命令行运行它,可以使用pcntl_fork

分叉php进程

还有一些守护进程类可以执行相同的操作:

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.

}