如何在Zend Framework中运行长后台进程

时间:2013-05-08 15:53:18

标签: 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($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,定义了&botstrap等等。我得到了相同的结果(现在我没有他们尝试),这个:

X-Powered-By: PHP/4.4.9
Content-type: text/html

<br />
<b>Parse error</b>:  syntax error, unexpected T_OBJECT_OPERATOR in <b>/homez.636/innovaco/fenix/public/index.php</b> on line <b>9</b><br />

我很担心服务器php的版本,在应用程序中通过htaccess它设置为5_4但是在命令行中我不能这样做。

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

Zend Framework在没有让客户端等待响应的情况下执行后台进程的最佳方法是什么?

我很感激任何帮助。

非常感谢!

问候。

2 个答案:

答案 0 :(得分:2)

对于后台流程,我会使用exec()

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

  

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

您可以在用户贡献部分找到以下几个示例。

答案 1 :(得分:0)

好吧,最后我可以在命令行下运行PHP 5.3,并且使用exec()函数我可以做到。一切正常,我运行一个后台进程,最终完成大约需要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,你的答案非常有用!