PHP-CGI 进程 CPU …

转载自http://blog.s135.com/file_get_contents/

有时候,运行 Nginx、PHP-CGI(php-fpm) Web服务的 Linux 服务器,突然系统负载上升,使用 top 命令查看,很多 php-cgi 进程 CPU 使用率接近100%。后来,我通过跟踪发现,这类情况的出现,跟 PHP 的 file_get_contents() 函数有着密切的关系。

大、中型网站中,基于 HTTP 协议的 API 接口调用,是家常便饭。PHP 程序员们喜欢使用简单便捷的 file_get_contents(“http://example.com/”) 函数,来获取一个 URL 的返回内容,但是,如果 http://example.com/ 这个网站响应缓慢,file_get_contents() 就会一直卡在那儿,不会超时。

我们知道,在 php.ini 中,有一个参数 max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的以下参数:

1
2
3
4
5
The timeout ( in seconds) for serving a single request after which
the worker process will be terminated Should be used when
'max_execution_time' ini option does not stop script execution for
some reason '0s' means 'off'
"request_terminate_timeout">0s<</code>/value>

默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 30s,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免“502 Bad Gateway”。

要做到彻底解决,只能让 PHP 程序员们改掉直接使用 file_get_contents(“http://example.com/”) 的习惯,而是稍微修改一下,加个超时时间,用以下方式来实现 HTTP GET 请求。要是觉得麻烦,可以自行将以下代码封装成一个函数。

1
2
3
4
5
6
7
8
9
0
0

参考知识库

猜你在找
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
快速回复 TOP
    个人资料
    PHP-CGI&nbsp;进程&nbsp;CPU&nbsp;…_第1张图片
    senlin1202
    • 访问:11198次
    • 积分:79
    • 等级:
    • 排名:千里之外
    • 原创:376篇
    • 转载:46篇
    • 译文:1篇
    • 评论:0条
    文章分类
  • LINUX(99)
  • js(29)
  • php(187)
  • mongoDB(4)
  • PHP高级工程师面试题(2)
  • C语言(5)
  • http(4)
  • mysql(45)
  • jquery(8)
  • memcache(5)
  • CSS3(4)
  • Redis(15)
  • 管理开发(4)
  • flash插件(1)
  • mac-pc(1)
  • nginx(1)
    文章存档
  • 2016年04月(7)
  • 2016年03月(415)
  • 2015年12月(1)
    阅读排行
  • Sersync2完全安装配置说明(2892)
  • js&nbsp;前加分号和感叹号是什么意思?(68)
  • 异步消息的传递-回调机制(56)
  • Redis&nbsp;pub/sub(Publish,Subsc…(53)
  • Emoji表情符号兼容方案(50)
  • nginx&nbsp;获取源IP(45)
  • Nginx配置性能优化(44)
  • LINUX 段错误查找记录 -- segfault at fffffffffffffff9 ip 0000003c97e7b81c sp 00007fffad7c0638 error 4 in lib(43)
  • localForage——轻松实现&nbsp;Web&amp;n…(40)
  • 程序员技术练级攻略(39)
    评论排行
  • Sersync2完全安装配置说明(0)
  • PHP中extract()函数的妙用(0)
  • php学习笔记之--函数的声明与应用(0)
  • php学习笔记之&nbsp;函数声明--自…(0)
  • php&nbsp;的自动载入(0)
  • php在线处理视频&nbsp;(在线视频转…(0)
  • 百度地图API详解之地图坐标系统(0)
  • PHP&nbsp;XML操作的各种方法解析(…(0)
  • appendChild()(0)
  • etElementByID&nbsp;getElementsBy…(0)
    推荐文章
    • *4月28--30日:一起去北展揭开电信网络诈骗的神秘面纱
    • *Binder工作机制
    • * Java Web基础知识之Filter:过滤一切你不想看到的事情/a>
    • *Untiy Native Render Plugin在VR中的绘制(二): 透明排序
    • *随机过程--Metropolis-Hastings算法
    • *Fresco图片库研读分析

你可能感兴趣的:(PHP-CGI 进程 CPU …)