2010-03-10 64 views
4

我正在用PDF2SWF转换PDF并用XPDF索引..用exec ..只有这样才需要执行时间非常高。PHP后台进程完成后启动脚本?

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

回答

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'; 

+0

请提供downvote的反馈意见。 – 2010-03-10 04:34:30

+0

对不起,这是一个意外。我已经标记了它。 – Cetra 2010-03-11 04:07:53

+0

感谢这看起来非常好,但如果有Windows支持也会很好.. – Chris 2010-03-22 09:28:27

-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. 

} 
0

尝试使用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"); 

三个催生的shell脚本将同时运行,只要你不要做一个函数,pclose( $ p1)(或$ p2或$ p3)或尝试从这些管道中读取数据,它们不会阻止您的PHP执行。

当您完成其他任务(您正在使用PHP脚本执行的任务)时,您可以在管道上调用pclose(),这将暂停脚本执行,直到您正在执行的进程完成。然后你的脚本可以做别的事情。

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

+0

这似乎并不适用于我的Windows? – Chris 2010-03-22 10:05:49

+0

其实我现在看到,它确实工作..除非PHP exectute包含exec X_x然后它不起作用,并没有在我的Apache日志中...如果我做了像fwrite这样的事情,它确实有效。 – Chris 2010-03-23 02:28:37