Apache 和 FPM 链接因脚本超时而中断

Apache 和 FPM 链接因脚本超时而中断

我正在尝试设置 Apache + PHP-FPM,但是,我们有一个长时间运行的脚本被执行并最终超时,这切断了 Apache 和 FPM 之间的链接,最终导致整个站点瘫痪......

如果达到 --idle-timeout,是否有办法防止整个站点崩溃?

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -idle-timeout 18000 -pass-header Authorization

答案1

Apache 向 php-fpm 发出请求当达到超时时将被中止。对于用户来说也是如此。如果您希望最终客户得到响应,可以想到三种可能性:

  1. 增加你的超时值(因为你的 PHP 应用程序比这个慢)
  2. 尝试让您的 PHP 应用程序更快地满足该请求
  3. 让您的 PHP 应用程序计算其所花费的时间,如果所花费的时间超过您的超时值,则以错误消息进行响应

恕我直言,解决方案 #2 是开发人员通常的选择。

答案2

长时间运行的脚本不应从浏览器/Apache 运行。您应该使用 PHP CLI 而不是 FPM 在后台运行它。 CLI 脚本不会超时,也不会干扰 Apache 操作。

您可以使用 cronjobs 安排脚本定期运行,也可以通过编写临时文件之类的操作使其从浏览器触发(例如,将一个名为的文件放在run_script您的网站目录中,然后在脚本末尾将其删除) )在数据库或其他后端设置标志。

当采用第二种方式时,您仍然需要一个 cronjob(可以每分钟运行一次)来检查此文件/数据库条目是否存在,并在找到时触发脚本(您还可以创建一个侦听器来监视此文件/数据库条目)不断地而不是每分钟一次,但这相当密集,并且对于大多数用例来说可能是过度的)。

一旦它被触发,您发回给用户的只是一条通知,例如“稍等,我们正在处理您的请求。请在几分钟后回来查看。”。这样,他们也不需要保持浏览器打开来保持请求运行,并且可以同时执行其他操作。

相关内容