PHP 脚本超时但常规页面运行正常

PHP 脚本超时但常规页面运行正常

我在使用 nginx 和 PHP-FPM 时遇到了一个奇怪的问题。我设置了一台服务器来为我的网站提供下载服务。它不是很强大,只有 Celeron G530 和 4GB RAM,因此,我运行 nginx 是因为它的开销很低。该服务器通常以 30-40Mbps 的速度持续传输,端口为 100Mbps。

问题是,当我通过 HTTP 从服务器请求一些 PHP 脚本时,请求经常超时。我知道 nginx 中的时间限制是 60 秒,并且我已通过日志验证它正在达到该时间并关闭连接。

我也有穆宁在服务器上运行以监控事物,虽然这仍然通过 HTTP,但在同一服务器上和在相同条件下,它非常快速且敏捷,页面加载时间不超过 150 毫秒。

在我看来,问题出在 PHP-FPM 上是合乎逻辑的(据我所知,Munin 使用 Perl),但我该如何检查呢?我该怎么做才能深入研究问题并找出实际的瓶颈是什么?

如果是 PHP-FPM,我可以做些什么来加快速度?它不会占用大量 CPU 或 RAM,并且设置为使用套接字连接,而不是使用 nginx 的 TCP 连接。

谢谢你的帮助。

答案1

您应该将慢速日志记录添加到您的 php-fpm 配置中:

request_slowlog_timeout = 10
slowlog = /var/log/php-fpm/slow.$pool.log

这将记录所有耗时超过 10 秒的请求,这样您就可以看到哪些脚本不够“敏捷”。它提供了在达到慢速记录时间限制时代码所处位置的完整堆栈跟踪。

您还可以设置 PHP-FPM 状态页面。将其添加到您的 PHP-FPM 池配置中:

pm.status_path = /www-status

并将请求通过 nginx 传递到 PHP-FPM

location ~ ^/(www-status)$ {
    include       %mysite.root.directory%/conf/fastcgi.conf;
    fastcgi_pass   unix:%phpfpm.socket%/php-fpm-www.sock;

    # or IP address
    # fastcgi_pass 127.0.0.1:9000;


    fastcgi_index index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

    allow 127.0.0.1;
    allow stats_collector.localdomain;
    allow watchdog.localdomain;
    deny all;
}

然后转到 yoursite.com/www-status?full 将为你提供每个 php-fpm 进程的详细打印输出,例如:

pool:                 www
process manager:      dynamic
start time:           18/Mar/2013:20:17:21 +1100
start since:          243
accepted conn:        3
listen queue:         0
max listen queue:     0
listen queue len:     0
idle processes:       3
active processes:     1
total processes:      4
max active processes: 1
max children reached: 0
slow requests:        0

************************
pid:                  6233
state:                Idle
start time:           18/Mar/2013:20:17:21 +1100
start since:          243
requests:             1
request duration:     631
request method:       GET
request URI:          /www-status
content length:       0
user:                 -
script:               /documents/projects/intahwebz/intahwebz/basereality/www-status
last request cpu:     0.00
last request memory:  262144

答案2

当我通过 HTTP 从服务器请求一些 PHP 脚本时,请求经常超时

这意味着并非所有脚本都会发生这种情况 - 对于受影响的脚本来说,这种情况只会在某些时候发生 - 因此解决方案就是简单地查看脚本工作时与不工作时有什么不同,并将工作脚本与不工作脚本进行比较。另外,检查您的日志。

(如果您还没有安装,您可能需要向 munin 添加对 php-fpm 进程数量和 HTTP 连接的监控)。

相关内容