我正在使用PDF2SWF转换PDF并使用XPDF转换索引..只有这需要执行时间非常高。
是否可以将其作为后台进程运行,然后在转换完成后启动脚本?
答案 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.
}