PHP现在回复,稍后处理

时间:2015-10-19 14:07:59

标签: php symfony

我目前正在尝试从外部导入大量的学生。我在Controller中暴露一条路线。我收到错误消息Error: Maximum execution time of 30 seconds exceeded。我想避免设置set_time_limit(0)。还有另一种方法可以避免这种错误并继续这个过程吗?如果我构建一个命令,一切都很好,因为时间限制设置为0.我也尝试从控制器运行命令,但这会导致相同的错误。我需要从控制器那里做到这一点,这就是为什么我还在寻找解决方案。

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

2 个答案:

答案 0 :(得分:0)

这里有几个选项,具体取决于您返回的数据的更新频率,以及处理它的实际时间。

首先,如果数据可以每天或每周更新,您可以使命令将其输出保存在Web应用程序可访问的某个位置,并添加一个cron作业以便每隔一段时间生成一次输出。接下来,只需确保用户可以访问结果。

第二个选项更难实现,但也更灵活。您可以使用RabbitMQ和RabbitMQBundle或类似的队列服务器,这样当用户请求数据时,您只需将消息提交到队列中,然后工作人员会以某种方式更新Web应用程序数据(运行)你的命令),表示进程已经完成并以某种方式缓存结果。通过这种方式,您可以立即获得新的结果,但负载将无法预测(这就是您应该考虑缓存的原因)。

答案 1 :(得分:0)

您可以使用StreamedResponse,它允许您使用回调将响应流回流到客户端。

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