位置: 编程技术 - 正文

php5.2的curl-bug 服务器被php进程卡死问题排查(php_curl.dll)

编辑:rootadmin

推荐整理分享php5.2的curl-bug 服务器被php进程卡死问题排查(php_curl.dll),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php curl_multi_init,php curl_exec,php curl命令详解,php curl_init,php_curl.dll,php curl ua,php curl_multi_init,php curl_init,内容如对您有帮助,希望把文章链接给更多的朋友!

前几天东政同学反馈说Linode服务器快卡死了,今天有时间排查了一下具体原因,最终原因稍微有点悲壮:file_get_contents没有设置超时时间,加上我用的php5.2关于curl的代码有个bug,于是导致PHP进程进入死循环。

今天下午又发现系统负载很高,于是上去看了一下,发现一大坨PHP进程没有退出,占用了很多CPU,如图:

问题进程:

后面运行的脚本是我的RSS定时更新任务,看来PHP代码什么地方有问题,于是strace -p 看了一下:

在4号fd上面死循环了,于是看看FD是什么:ll /proc//fd

lrwx—— 1 wuhaiwen wuhaiwen 7月 : 4 -> socket:[]

再看了一下原来是在请求CSDN的一个网页的时候死循环了,但不知道什么地方请求的,想到GDB一下php进程看看,bt显示:

(gdb) bt#0 0xff8f in __select_nocancel () at ../sysdeps/unix/syscall-template.S:#1 0× in php_curl_stream_read (stream=0×, buf=0xea5d0 “2Fwww.laruence.com%2Ftag%2F%e6%ad%a3%e5%%%+class%3D%tag-link-%+title%3D%+topics%+style%3D%font-size%3A+9.pt%3B%%3E%E6%AD%A3%E5%%%3C%2Fa%3E%3C%2Ftags%3E”"…, count=) at /home/wuhaiwen/install/php-env/src/php/php-5.2.8/ext/curl/streams.c:#2 0xf9 in php_stream_fill_read_buffer (stream=0×, size=) at /home/wuhaiwen/install/php-env/src/php/php-5.2.8/main/streams/streams.c:#3 0xc in _php_stream_read (stream=0×, buf=0xfd5 “f=' class='tag-link-′ title='3 topics' style='font-size: 9.pt;'>json</a>n<a href=' class='tag-link-′ title='2 topics' “…, size=) at /home/wuhaiwen/install/php-env/src/php/php-5.2.8/main/streams/streams.c:#4 0xc in _php_stream_copy_to_mem (src=0×, buf=0x7fffed, maxlen=<optimized out>, persistent=0)at /home/wuhaiwen/install/php-env/src/php/php-5.2.8/main/streams/streams.c:#5 0xfdb in zif_file_get_contents (ht=<optimized out>, return_value=0xda0, return_value_ptr=<optimized out>, this_ptr=<optimized out>, return_value_used=<optimized out>)at /home/wuhaiwen/install/php-env/src/php/php-5.2.8/ext/standard/file.c:#6 0xc2a in zend_do_fcall_common_helper_SPEC (execute_data=0x7fffedc) at /home/wuhaiwen/install/php-env/src/php/php-5.2.8/Zend/zend_vm_execute.h:#7 0xcf in execute (op_array=0x1f) at /home/wuhaiwen/install/php-env/src/php/php-5.2.8/Zend/zend_vm_execute.h:·············# 0xd8e in main (argc=4, argv=0x7ffff) at /home/wuhaiwen/install/php-env/src/php/php-5.2.8/sapi/cli/php_cli.c:

看一下当前PHP执行的脚步是什么:

找到了问题代码位置,原来是一个file_get_contents($url)调用,没有设置超时时间,于是PHP卡死在网络请求了。于是用stream_context_create 设置超时时间搞定。

php5.2的curl-bug 服务器被php进程卡死问题排查(php_curl.dll)

到这里 似乎问题解决了,但是,为什么没有设置超时时间就导致php进程占用CPU,系统负载那么高?按理说应该等待I/O才是呀?看上面CPU情况,完全是进入了死循环的节奏。

根据上面的bt堆栈,首先看倒数第二个函数的调用:

#1 0× in php_curl_stream_read (stream=0×, buf=0xea5d0 “2Fwww.laruence.com%2Ftag%2F%e6%ad%a3%e5%%%+class%3D%tag-link-%+title%3D%+topics%+style%3D%font-size%3A+9.pt%3B%%3E%E6%AD%A3%E5%%%3C%2Fa%3E%3C%2Ftags%3E”"…, count=) at /home/wuhaiwen/install/php-env/src/php/php-5.2.8/ext/curl/streams.c:

看一下代码,我用的事5.2.8版本的PHP,比较老。代码如下:

GDB进去发现,代码一直在里面的do-while里面循环了!心想curl_multi_fdset怎么不用先FD_ZERO 清空FD呢?一般做法都是会先清空的。

莫非是PHP的bug, 于是网上找了一下发现了这个Pierrick-Charron的commit,确实是一个bug, 其实curl_multi_fdset 的文档开头写了的:

好吧,最后用GDB验证一下,我在上面的do下面,curl_multi_fdset调用之前,手动将fd清空,看看能否退出循环:

(gdb) print FD_ZERO(&curlstream->readfds)No symbol “FD_ZERO” in current context.

FD_ZERO竟然没有,不管了,其本来是个宏定义,展开就行:#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))

直接用call修改curl_muti_fdset的三个参数数组如下:

然后GDB单步执行,如期的由于curlstream->pending变为0,从而退出了循环,回到php_stream_fill_read_buffer的大函数了

到此基本结束。有问题的PHP版本应该是5.2. 具体没有细看,读者可以参考下上面的这个提交改动或者直接看自己的版本代码是否有问题。

PHP mysqli_free_result()与mysqli_fetch_array()函数详解 PHPmysqli_free_result()与mysqli_fetch_array()函数mysql_free_result()仅需要在考虑到返回很大的结果集时会占用多少内存时调用。在脚本结束后所有关联的内存都会被

php简单压缩css样式示例 本文实例讲述了php简单压缩css样式的方法。分享给大家供大家参考,具体如下:$css='';//找css目录$root=$_SERVER['DOCUMENT_ROOT'].'/css/';//directorywherethecsslives$files

php实现压缩合并js的方法【附demo源码下载】 本文实例讲述了php实现压缩合并js的方法。分享给大家供大家参考,具体如下:test.php文件如下:require_once('jsmin.php');$files=glob("js/*.js");$js="";foreach($filesas$

标签: php_curl.dll

本文链接地址:https://www.jiuchutong.com/biancheng/301841.html 转载请保留说明!

上一篇:PHP实现生成带背景的图形验证码功能(php生成guid)

下一篇:PHP mysqli_free_result()与mysqli_fetch_array()函数详解

  • 餐饮业小规模开发票开什么
  • 毛利率在餐饮中表示什么意思?
  • 没有支付运费会怎样
  • 企业所得税季度预缴怎么计算
  • 收到代发工资的信息
  • 个体工商户增值税申报操作流程
  • 收到跨境分红的会计处理怎么做?
  • 让渡资产使用权是指资产的所有者将
  • 所得税汇算清缴表在哪里打印
  • 购买理财产品是不是非法集资
  • 销售固定资产可以开专票吗
  • 冲红的电子发票要怎么处理
  • 为什么餐费不能计入在差旅费
  • 涉农产品税率
  • 纳税退税申请表的基本情况如何写
  • 机动车发票认证了的发票怎么红冲
  • 进口商品买卖的关键环节
  • 上海中级会计报名入口
  • 递延所得税年初数和期末数
  • 进项税和销项税借贷方向
  • 企业在国内采购并运往境外作为投资的货物
  • 收到的出口退税款需要并入利润总额吗
  • 王者荣耀如何更改战区
  • 如何修复电脑上qq对话过期视频
  • cpu性能排行榜天梯图快科技
  • 公司私户利息收入怎么算
  • msqry32.exe进程是什么文件 作用是什么 msqry32进程查询
  • 认缴制注册资金不交可以吗
  • php实现定时任务
  • 稀释性每股收益计算例题
  • 米尔巴特之战
  • 委托证券公司发行股票的手续费计入什么科目
  • 高新企业技术服务成本核算
  • GCN经典论文笔记:Semi-Supervised Classification with Graph Convolutional Networks
  • 人工智能导论论文2000字
  • vue3.0动态路由
  • 用python编写素数
  • php读取excel数据
  • vue虚拟domdiff算法
  • 企业收到企业借款需要交税
  • 淘宝运费险费用很高
  • 所得税申报资产总额平均值
  • PostgreSQL教程(一):数据表详解
  • 制造费用哪些是变动的哪些是固定的
  • 社保公司承担部分怎么做账
  • 工会其他支出包括哪些
  • 汇算清缴思路
  • MYSQL administrator 使用
  • 以摊余成本计量的债权投资与以公允价值计量且其变动
  • 招待客人有什么讲究
  • 代扣代缴境外增值税怎么申报
  • 应收账款在贷方为负数表示什么
  • 小规模纳税人结转增值税的账务处理
  • 办公室租赁费摊销分录
  • 银行汇票使用方法
  • 样品费计入
  • 失业保险稳岗返还计入什么科目
  • 往来核算是指会计核算中的资金往来业务
  • 销售折扣怎么制定
  • 应交税费借方余额填列资产负债表
  • 视同销售的几种情况
  • Ubuntu下MySQL安装及配置远程登录教程
  • sql获取guid
  • innodb 结构
  • mysql查看当前执行的sql
  • macos mysql
  • win7系统最佳性能
  • freebsd版本选择
  • surface 优惠
  • sesvc.exe是什么进程
  • javascript definitive guide
  • 批处理for命令详解
  • shell脚本解压tar文件
  • 网页设计绿色
  • python数据类型有
  • 土地增值税按什么价格
  • 宁夏地税局局长
  • 广西电子税务局电话人工客服电话
  • 2021沈阳车船税
  • 吉林省耕地面积有多少万亩
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设