Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP现在响应,稍后处理_Php_Symfony - Fatal编程技术网

PHP现在响应,稍后处理

PHP现在响应,稍后处理,php,symfony,Php,Symfony,我目前正试图从外部引进大量的学生。我在一个控制器中做这件事,它暴露了一条路线。我收到一条错误消息错误:超过了30秒的最长执行时间。我想避免设置设置时间限制(0)。是否有其他方法可以避免该错误并继续该过程?如果我构建了一个命令,那么一切都很好,因为时间限制设置为0。我还尝试从控制器运行命令,但这导致了相同的错误。我需要从一个控制器开始,这就是为什么我仍然在寻找解决方案 另外,是否有一种方法可以返回一个响应,并且仍然可以在后台运行该过程?根据您返回的数据的更新频率以及实际处理该数据所需的时间,这里有

我目前正试图从外部引进大量的学生。我在一个控制器中做这件事,它暴露了一条路线。我收到一条错误消息
错误:超过了30秒的最长执行时间
。我想避免设置
设置时间限制(0)
。是否有其他方法可以避免该错误并继续该过程?如果我构建了一个命令,那么一切都很好,因为时间限制设置为0。我还尝试从控制器运行命令,但这导致了相同的错误。我需要从一个控制器开始,这就是为什么我仍然在寻找解决方案


另外,是否有一种方法可以返回一个响应,并且仍然可以在后台运行该过程?

根据您返回的数据的更新频率以及实际处理该数据所需的时间,这里有几个选项

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


第二个选项更难实现,但也更灵活。您可以使用RabbitMQ和/或类似的队列服务器,这样当用户请求数据时,您只需向队列中提交一条消息,然后该消息就会被工作程序接收,该工作程序会以某种方式更新web应用程序数据(运行您的命令),表示该过程已经完成,并以某种方式缓存结果。这样,你就可以马上得到新的结果,但是负载不会是可预测的(这就是为什么你应该考虑缓存)。

这里有几个选项,取决于你返回的数据应该多久更新一次,以及处理它需要多长时间。 首先,如果可以每天或每周更新数据,则可以让命令将其输出保存到web应用程序可以访问的某个位置,并每隔一段时间添加一个cron作业以生成输出。接下来,只需确保用户可以访问结果


第二个选项更难实现,但也更灵活。您可以使用RabbitMQ和/或类似的队列服务器,这样当用户请求数据时,您只需向队列中提交一条消息,然后该消息就会被工作程序接收,该工作程序会以某种方式更新web应用程序数据(运行您的命令),表示该过程已经完成,并以某种方式缓存结果。这样,您就可以立即得到新的结果,但是负载将不可预测(这就是为什么您应该考虑缓存)。

< P>可以使用<代码> StreamedResponse < /C> >,它允许您使用回调将响应流回客户端。
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();
请参见此处的更多信息:


您可以使用
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();
请参见此处的更多信息:


我向您推荐关于Symfony 2中包含的RabbitMQ和组件过程的文档。Good lucki向您推荐Symfony 2中包含的RabbitMQ和组件过程文档。真幸运。我仍然收到一条
错误:超过了最长30秒的执行时间
消息。您仍然需要允许脚本运行更长时间,但使用此方法至少可以让用户了解进程的进度。不幸的是,我不允许更改默认值30秒。而且,我不知道;不需要通知用户进度。我只是想让命令在后台运行,而不让他知道。好吧,然后看看另一个答案,只是想提出一些更容易实现的建议我们所做的是:我们只是在amazon sqs上对命令进行排队,让几个工作人员拿起并运行这些命令(从技术上讲是rabbit所做的)。我仍然收到一条
错误:超过了最长30秒的执行时间
消息。您仍然需要允许脚本运行更长时间,但使用此方法至少可以让用户了解进程的进度。不幸的是,我不允许更改默认值30秒。而且,我不知道;不需要通知用户进度。我只是想让命令在后台运行,而不让他知道。好吧,然后看看另一个答案,只是想建议一些更容易实现的方法我们所做的是:我们只是在amazon sqs上对命令进行排队,然后让几个工作人员拾取并运行这些命令(从技术上讲,就是rabbit所做的)