4

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

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

4

3 回答 3

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

.

于 2010-03-10T04:27:24.147 回答
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()。到达脚本末尾或调用 die() 将使其等待。

于 2010-03-10T06:35:20.257 回答
-1

如果你从命令行运行它,你可以使用pcntl_fork 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.

}
于 2010-03-10T04:30:41.213 回答