CentOS 7.4.1708下PHP 7.1.13启动卡顿(2-10秒)的解决咨询
调试与解决PHP CLI卡顿问题的建议
你的PHP CLI启动明显存在阻塞等待的情况——从time输出能看到real时间远大于user+sys时间,说明大部分耗时都耗在了内核态的等待上(比如网络请求、磁盘IO阻塞、系统服务调用超时等),而非PHP本身的代码执行。结合你的环境(CentOS 7.4 + PHP 7.1.13),给你以下逐步排查的思路:
1. 定位卡顿的核心系统调用(最关键的第一步)
用strace跟踪PHP启动时的系统调用,能直接看到到底卡在了哪个环节:
strace -tt php -v
-tt参数会显示精确到毫秒的时间戳,你可以对比每一行的时间差,找到耗时最长的调用(比如getaddrinfo、open、connect这类操作)。
常见卡顿点及对应解决:
- DNS解析超时:如果看到
gethostbyname或getaddrinfo耗时几秒,说明PHP在尝试解析主机名时卡住了。
解决:在/etc/hosts中添加本机IP与hostname的映射(比如127.0.0.1 your-hostname),避免PHP发起外部DNS请求。 - 文件访问阻塞:如果
open、stat某个文件耗时久,检查该文件所在磁盘的IO状态,或者文件权限(比如SELinux是否阻止了访问)。可以临时关闭SELinux测试:setenforce 0,如果问题消失,再调整SELinux的上下文规则。
2. 排查PHP扩展与OPcache的问题
空脚本或php -v也卡顿,可能是扩展初始化时出了问题:
- 先禁用OPcache测试:
如果不卡了,说明OPcache缓存目录权限异常或缓存文件损坏。可以清理OPcache缓存目录(默认是php -d opcache.enable=0 -v/tmp下的opcache相关文件),或者检查php.ini中opcache.dir的权限。 - 禁用所有扩展测试:
php -n -v-n参数会让PHP不加载任何php.ini和扩展,如果此时不卡顿,再逐个启用扩展(比如php -d extension=xxx.so -v),找到导致卡顿的扩展后,更新或替换该扩展。
3. 系统服务层面排查
- nscd服务异常:nscd是系统名称服务缓存 daemon,如果它卡住,会导致用户/主机名解析变慢。尝试重启nscd:
systemctl restart nscd - PAM配置问题:PHP CLI可能会触发PAM认证检查,检查
/etc/pam.d/php是否有异常配置(如果存在的话),可以临时注释掉非必要的规则测试。
4. 其他小众排查点
- 检查系统的
/tmp目录是否满了或权限异常:PHP很多扩展会在/tmp创建临时文件,如果/tmp不可写或inode耗尽,可能导致卡顿。 - 检查CPU的频率调度:如果系统开启了节能模式,CPU频率可能被限制,但你的系统负载很低,这个可能性不大,但可以用
cpupower frequency-info确认。
内容的提问来源于stack exchange,提问作者fbas
相关产品推荐
相关产品推荐

