使用 PHP-fpm 的慢执行日志 slow_log 来分析 PHP 性能问题

file

如果你是一个资深的 PHP 工程师,你一定在有些情景下使用过 PHP 的 error_log 方法。但是,PHP 没有提供一种发现脚本执行慢原因的方法。执行慢的脚本不会破坏你的网站,但它会使一切减慢。使用 FPM,我们能够为执行慢的脚本提供 slow_log。接下来让我们一起了解如何使用这些日志来调试和分析 PHP 脚本执行效率。我们也会顺便了解到在 FPM 和 Nginx 运行之后 PHP 的 error_log 将如何被转发处理的。

为 PHP 脚本设置慢日志

打开... vim /etc/php5/fpm/pool.d/www.conf ,参考下面的例子做配置:

slowlog = /var/log/php5/slow.log
request_slowlog_timeout = 10s

你可以把 10s 改成其他值。 它可以帮助我们找到执行缓慢的脚本。 调整图像尺寸的方法, 网络 I/O 相关的一些功能都经常出现在 PHP 慢日志中。你可以根据自己的情况来选择调整或者忽略。

为 PHP 设置 error_log

当使用 FPM 解析运行中的 PHP,我们能够覆盖 php.ini 中关于 FPM 的任何设置。打开。。。vim /etc/php5/fpm/pool.d/www.conf 滑动滚动条到文件的底部,然后取消注释/更改与下面 3 行所匹配配置项的值:

php_admin_value[error_log] = /var/log/php5/error.log
php_admin_flag[log_errors] = on

需要注意的是,开启 display_errors 可能会破坏基于 ajax 的应用程序。因此,开启时要非常小心。

Nginx 用户须知

你可能会找不到 /var/log/php5/error.log 日志文件或者在日志文件中没有任何错误信息。站点中由 PHP 脚本产生的错误信息将会被记录在 nginx 的 error_log 中(nginx 的 error_log 可以在 nginx 配置文件中指定)。最有可能是 :/var/www/example.com/logs/error.log 文件(如果你没有为站点具体指定任何 error_log 的路径,PHP 的错误信息将会被写入 Nginx 的默认 error_log 中。最有能是 /var/log/nginx/error.log 文件)你可以 在这里找到有关使用Nginx进行调试的更多细节

设置 FPM 错误日志方便调试

FPM 是一个独立的进程。在运行时难免会出错! FPM 的错误日志默认启动,我们只需要修改它存放的路径 。 打开... vim /etc/php5/fpm/php-fpm.conf 修改 error_log  的值:

error_log = /var/log/php5/fpm.log

值得一提的是这儿的 error_log 与之前描述的 PHP error_log 函数无关。

确认变更...

创建一个名为 php5 的日志文件来存放所有的 php 日志:

mkdir /var/log/php5/

重启 PHP-FPM 使修改生效...

service php5-fpm restart

监听日志文件

在服务器上,我们一般打开 shell 用 tail -f 命令来监听日志文件的运行状态... 因为我们有多个需要监听的日志文件,你可以使用下面的命令...

tail -f /var/log/php5/*.log

slow_log 可以帮助我们定位到运用程序里的瓶颈。

 切记 调试结束后,务必将其关闭。让它持续运行并不是一个好主意。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://easyengine.io/tutorials/php/fpm-...

译文地址:https://learnku.com/laravel/t/14539/use-...

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3
阿麦

好东西

5年前 评论

service php5-fpm restart 木有 php5-fpm

vi restart.sh

#! /bin/bash
pid=`ps aux | grep fpm | grep php | awk '{print $2}'`
for p in $pid
do
        kill -9 $p
done
/usr/local/php5/sbin/php-fpm
5年前 评论

@lovecn 我一般kill方式关fpm,再直接重启nginx

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!