Php 如何在Zend Framework中运行一个长的后台进程

Php 如何在Zend Framework中运行一个长的后台进程,php,zend-framework,Php,Zend Framework,我试图运行一个后台进程,当用户向某个操作发送表单时,告诉他该进程已启动,并且在十分钟内更新数据。但是我有一些麻烦。 我的行动如下: public function actualizarLineasAction() { $this->view->titulo = $this->_helper->x->lang("Actualizar el número de líneas de todos los clientes"); if(

我试图运行一个后台进程,当用户向某个操作发送表单时,告诉他该进程已启动,并且在十分钟内更新数据。但是我有一些麻烦。 我的行动如下:

public function actualizarLineasAction()
    {
        $this->view->titulo = $this->_helper->x->lang("Actualizar el número de líneas de todos los clientes");
        if($this->getRequest()->isPost())
        {
            if($this->_getParam('start'))
            {
                $descriptorspec = array(
                    array('pipe', 'r'),
                    array('file', 'myfile.txt', 'a'),
                    array('pipe', 'w'),
                 );
               $proc = proc_open("php ".APPLICATION_PATH."/../scripts/update_clientes_lineas.php > ".APPLICATION_PATH."/../scripts/update_lines.log", $descriptorspec, $pipes);
               proc_close($proc);
                $this->view->message = $this->_helper->x->__("El proceso empezó en unos minutos habrá terminado y los contadores de líneas de los clientes estarán actualizados");

            }
        }
    }
脚本文件(在这个脚本中,我想解析一个包含12500行验证和检查的大型文件并将其插入数据库),因此对于测试,一个简单的脚本:

<?php 
//It is only for test
for ($index = 1; $index < 1800; $index++) {
    $x = $index * 18;
    sleep(10);
}
echo "El resultado ".$x;
?>

我将init、define和botstrap运行等放入这个脚本中。。我得到了同样的结果(现在我尝试不使用它们),这是:

X-Powered-By:PHP/4.4.9
内容类型:text/html

解析错误:语法错误,第9行的/homez.636/innovaco/fenix/public/index.php中出现意外的T_OBJECT_运算符
我担心服务器php的版本,在通过htaccess的应用程序中,它设置为5_4,但在comand line中,我不能这样做

这就是这个错误的问题吗?如果没有,发生了什么

在Zend框架中进行后台处理而不维护客户端等待响应的最佳方式是什么

我非常感谢你的帮助

多谢各位


您好。

对于我将使用的后台进程

在PHP手册中,请参见注释部分和第一个白色注释

如果使用此函数启动程序,为了使其在后台继续运行,程序的输出必须重定向到文件或其他输出流。否则将导致PHP挂起,直到程序执行结束


您可以在下面的用户贡献部分找到一些示例。

好吧,最后我可以在命令行下运行PHP5.3,并且可以使用exec()函数来完成。一切正常,我运行了一个后台进程,在finalize中大约需要12分钟,用户被重定向到另一个视图,等待进程结束时的结果

exec("php.5.3 ".APPLICATION_PATH."/../scripts/update_clientes_lineas.php  > ".APPLICATION_PATH."/../scripts/update.log 2>&1 &");
//2>&1 redirect STDERR to STDOUT and STDOUT to /null, & allows to run a process in background.

非常感谢Tim和Adrian,你的回答非常有用

Zend不支持PHP4。是的,我知道,但我不明白这对Zend应用程序有什么影响,我正在运行一个comand。。。你的意思是,如果服务器在5.4中运行,那么这个错误不会出现,并且一切正常吗?index.php的第9行是什么?好的,你不能在PHP4中链接对象方法调用(
bootstrap()->run()
),所以这就是为什么你会得到那个特定错误的原因,但是ZF应用肯定不会在PHP4中运行。另外,我非常确定
proc\u open
在脚本完成之前不会返回。如果您的服务器有多个PHP版本,则需要找到5.4版的PHP CLI路径。然后调用
exec('php…')
而不是调用
exec('/path/to/php5.4/php…')
。你可能需要和你的主持人核实一下。谢谢你,阿德里安,我已经仔细阅读了这些文档,你说得对。我要用exec()来做这件事。@jortsc总是很乐意帮忙
exec("php.5.3 ".APPLICATION_PATH."/../scripts/update_clientes_lineas.php  > ".APPLICATION_PATH."/../scripts/update.log 2>&1 &");
//2>&1 redirect STDERR to STDOUT and STDOUT to /null, & allows to run a process in background.