仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1859|回复: 18
打印 上一主题 下一主题

[学习教程] PHP编程:PHP-CGI 历程 CPU 100% 与 file_get_co...

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-16 00:23:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
左手拿着MOTOLOLA右手拿着NOKIA,要多潇洒,有多潇洒,哈哈,终于学会了,但是可能这个时候,又会有人不经意的拍拍肩膀对你说:哥们,别高兴的太早,你还是菜鸟,离学会还差着一大截呢!     有时分,运转 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 设置装备摆设文件中的以下参数: 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'  
<value name="request_terminate_timeout">0s</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 恳求。如果感觉费事,可以自即将以下代码封装成一个函数。 <?php  
$ctx = stream_context_create(array(  
    'http' => array(  
        'timeout' => 1 //设置一个超不时间,单元为秒  
        )  
    )  
);  
file_get_contents("http://example.com/", 0, $ctx);  
?>  
  固然,招致 php-cgi 历程 CPU 100% 的缘由不只要这一种,那末,怎样肯定是 file_get_contents() 函数招致的呢?
  起首,利用 top 号令检查 CPU 利用率较高的 php-cgi 历程。 top - 10:34:18 up 724 days, 21:01,  3 users,  load average: 17.86, 11.16, 7.69
Tasks: 561 total,  15 running, 546 sleeping,   0 stopped,   0 zombie
Cpu(s):  5.9%us,  4.2%sy,  0.0%ni, 89.4%id,  0.2%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   8100996k total,  4320108k used,  3780888k free,   772572k buffers
Swap:  8193108k total,    50776k used,  8142332k free,   412088k cached
   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                               
10747 www       18   0  360m  22m  12m R 100.6 0.3    0:02.60 php-cgi                                                                                                              
10709 www       16   0  359m  28m  17m R 96.8  0.4    0:11.34 php-cgi                                                                                                               
10745 www       18   0  360m  24m  14m R 94.8  0.3    0:39.51 php-cgi                                                                                                               
10707 www       18   0  360m  25m  14m S 77.4  0.3    0:33.48 php-cgi                                                                                                               
10782 www       20   0  360m  26m  15m R 75.5  0.3    0:10.93 php-cgi                                                                                                               
10708 www       25   0  360m  22m  12m R 69.7  0.3    0:45.16 php-cgi                                                                                                               
10683 www       25   0  362m  28m  15m R 54.2  0.4    0:32.65 php-cgi                                                                                                               
10711 www       25   0  360m  25m  15m R 52.2  0.3    0:44.25 php-cgi                                                                                                               
10688 www       25   0  359m  25m  15m R 38.7  0.3    0:10.44 php-cgi                                                                                                               
10719 www       25   0  360m  26m  16m R  7.7  0.3    0:40.59 php-cgi

  找个中一个 CPU 100% 的 php-cgi 历程的 PID,用以下号令跟踪一下: strace -p 10747 select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(7, [6], [6], [], {15, 0})        = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0)     = 0 (Timeout)
  那末,就能够肯定是 file_get_contents() 招致的成绩了。
<P style="TEXT-INDENT: 2em">
对于PHP的语法结构,刚开始真的很不习惯,真搞不懂为什么每个变量之前都要加个“$”符号,每个语句写完之后都必须加上“分号”来表示此句已经结束,还有,PHP对字母的大小写是敏感的,写的时候一定要注意大小写的区别。
若天明 该用户已被删除
沙发
发表于 2015-2-16 00:38:31 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
小女巫 该用户已被删除
板凳
发表于 2015-3-11 20:49:53 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
精灵巫婆 该用户已被删除
地板
发表于 2015-3-11 21:16:07 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
蒙在股里 该用户已被删除
5#
发表于 2015-3-14 11:33:23 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
第二个灵魂 该用户已被删除
6#
发表于 2015-3-21 04:38:41 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-27 04:09:24 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
小妖女 该用户已被删除
8#
 楼主| 发表于 2015-3-30 19:10:56 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
海妖 该用户已被删除
9#
发表于 2015-4-3 01:49:37 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
兰色精灵 该用户已被删除
10#
发表于 2015-4-9 09:09:21 | 只看该作者
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
只想知道 该用户已被删除
11#
发表于 2015-4-12 15:32:13 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
分手快乐 该用户已被删除
12#
发表于 2015-4-16 12:09:29 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
老尸 该用户已被删除
13#
发表于 2015-4-17 21:25:41 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
活着的死人 该用户已被删除
14#
发表于 2015-4-18 22:15:54 | 只看该作者
本文当是我的笔记啦,遇到的问题随时填充
金色的骷髅 该用户已被删除
15#
发表于 2015-4-19 00:20:06 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
16#
发表于 2015-4-22 08:03:09 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
小魔女 该用户已被删除
17#
发表于 2015-4-24 11:17:27 | 只看该作者
实践是检验自己会不会的真理。
柔情似水 该用户已被删除
18#
发表于 2015-5-1 03:50:24 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
谁可相欹 该用户已被删除
19#
发表于 2015-5-1 18:10:44 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-20 17:32

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表