You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Symfony脚本在浏览器中执行1-2小时避免超时?

解决长时运行Symfony脚本的超时问题

一、PHP及Web服务器端的超时配置

这是核心环节,浏览器超时往往是后端先断开连接导致的:

  1. PHP全局执行时间

    • 修改php.ini中的max_execution_time,默认30秒,改成7200(2小时);测试环境可设为0(无限制)。
    • 若用PHP-FPM,需修改php-fpm.conf(或对应pool配置文件)中的request_terminate_timeout,值要大于max_execution_time,比如设为7300,避免FPM提前终止进程。
    • 也可在脚本开头加set_time_limit(0);,前提是PHP未开安全模式且该函数未被禁用。
  2. Web服务器超时设置

    • Apache:修改httpd.conf的Timeout指令为7200;若用mod_fcgid,额外设置FcgidIOTimeout 7200和FcgidConnectTimeout 7200。
    • Nginx:在配置文件的location块中添加proxy_read_timeout 7200;(反向代理场景)或fastcgi_read_timeout 7200;(FastCGI模式)。

二、浏览器端的补充说明

你修改的Firefox配置仅影响HTTP响应等待时间,但如果后端先断开连接,浏览器仍会触发超时。另外:

  • Chrome默认请求超时约5分钟,就算改了浏览器设置,长时间挂起请求的用户体验极差——用户不能关闭页面、不能断网,完全不实用。

三、脚本本身的优化与异步方案(面向普通用户的可行方案)

直接在浏览器中同步执行1-2小时的脚本本身就不合理,建议改成以下方式:

  1. 修复现有脚本逻辑问题
    原代码中的dd($values['left'], $values2->getVar());会直接终止脚本,找到第一个匹配项就停止,根本无法完成找5个匹配的需求。需去掉dd,改成把匹配结果存入数据库或Session,再继续循环直到$t达到$limit。

  2. 分阶段执行(无后端队列的简易方案)
    把长任务拆成多个短请求:

    • 用Session或数据库记录当前的$dateTo和已找到的匹配数$t;
    • 每次请求只处理1天的数据,判断是否匹配,更新进度后返回页面,让用户点击“继续”或自动跳转发起下一个请求;
    • 直到找到5个匹配项,显示最终结果。
  3. Symfony异步队列(推荐)
    用Symfony Messenger组件把任务放入队列,再通过以下方式处理:

    • 若服务器允许,设置Cron定时执行bin/console messenger:consume async;
    • 若无法用Shell,可借助第三方Web Cron服务(定时访问触发队列消费的接口),或在用户访问时后台启动消费进程(需注意服务器限制)。
      这种方式用户发起请求后即可关闭页面,任务在后台执行,完成后可通过邮件或站内通知告知结果。

内容的提问来源于stack exchange,提问作者Vince

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:01:28