2015-10-19 28 views
1

我目前正在尝试从外部地方导入巨大数字的学生。我在控制器中暴露一条路线。我收到一条错误消息Error: Maximum execution time of 30 seconds exceeded。我想避免设置set_time_limit(0)。是否有另一种方法来避免这种错误并继续进行?如果我建立一个命令,一切正常,因为时间限制设置为0.我也尝试从控制器运行一个命令,但是这导致相同的错误。我需要从控制器来完成,这就是我仍然在寻找解决方案的原因。PHP现在回复,稍后处理

此外,有没有办法返回一个响应,仍然有进程在后台运行?

+1

我要推荐你的文档有关的RabbitMQ和组件的方法纳入Symfony的2.好运 – rommct

回答

0

这里有几个选项,具体取决于您返回的数据应该更新的频率以及实际需要处理的时间。首先,如果可以每天或每周更新数据,则可以使命令将其输出保存在某个可供Web应用程序访问的位置,然后添加一个cron作业以每隔一段时间生成一次输出。接下来,只需确保用户可以访问结果。

第二种方法实施起来更加困难,但也更加灵活。您可以利用RabbitMQ和RabbitMQBundle或类似的队列服务器,以便在用户请求数据时,只向队列中提交消息,然后由工作人员以某种方式接收消息,以更新Web应用程序数据(运行您的命令),表示该过程已完成并以某种方式缓存结果。这样,你马上就会得到新的结果,但是负载不会是可预测的(这就是为什么你应该考虑缓存)。

0

您可以使用StreamedResponse,它允许您使用回调将Response流传输回客户端。

use Symfony\Component\HttpFoundation\StreamedResponse; 

$response = new StreamedResponse(); 
$response->setCallback(function() { 
    var_dump('Hello World'); 
    flush(); 
    sleep(2); 
    var_dump('Hello World'); 
    flush(); 
}); 
$response->send(); 

在这里看到更多的信息:

http://symfony.com/doc/current/components/http_foundation/introduction.html#streaming-a-response

+0

试过了。我仍然收到'错误:超过30秒的最大执行时间'消息。 –

+0

您仍然必须允许脚本运行更长时间,但使用此方法至少可以让用户保留过程进度 –

+0

不幸的是,我不允许将默认值更改为30秒。而且,我也不需要告知用户有关进度。我只是想让命令在后台运行而无需知道。 –