当用户将表单发送到某个操作时,我尝试运行后台进程,并告诉他该进程已启动,并在十分钟内更新数据。但我有一些麻烦。 在我的行动中看起来像这样:
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在没有让客户端等待响应的情况下执行后台进程的最佳方法是什么?
我很感激任何帮助。
非常感谢!
问候。
答案 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,你的答案非常有用!