0

当用户将表单发送到操作时,我正在尝试运行后台进程,并告诉他该进程已启动并在十分钟内更新数据。但我有一些麻烦。在我的行动中看起来像这样:

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's、define's 和 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 中执行后台进程而不让客户端等待响应的最佳方法是什么?

我会很感激任何帮助。

非常感谢!

问候。

4

2 回答 2

2

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

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

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

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

于 2013-05-08T17:03:41.210 回答
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.

非常感谢蒂姆和阿德里安,您的回答非常有用!

于 2013-05-09T19:12:12.343 回答