contents() 函数有着紧凑的关联,程序猿们欣赏使用

作者:澳门娱乐

运行 Nginx、PHP-CGI(php-fpm) Web服务的 Linux 服务器,忽然系统负荷回升,使用 top 命令查看,很多php-cgi 进度 CPU 使用率临近百分之百。后来,作者通过追踪开采,那类情状的产出,跟 PHP 的 file_get_contents() 函数有着紧凑的关联。

新兴,笔者经过追踪开掘,那类情形的面世,跟 PHP 的 file_get_contents() 函数有着紧凑的涉嫌。
  大、中型网址中,基于 HTTP 公约的 API 接口调用,是不认为奇。PHP 技士们喜欢使用简便便捷的 file_get_contents("") 函数,来收获一个 U冠道L 的回到内容,不过,如若 那个网站响应缓慢,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 GET 央浼。若是以为劳累,能够活动将以下代码封装成一个函数。

大、中型网址中,基于 HTTP 左券的 API 接口调用,是不乏先例。PHP 程序员们喜欢使用简便方便的 file_get_contents(“) 函数,来收获叁个 U奥德赛L 的归来内容,不过,尽管 那些网址响应缓慢,file_get_contents() 就能一贯卡在那儿,不会晚点。

复制代码 代码如下:

小编们理解,在 php.ini 中,有三个参数 max_execution_time 能够安装 PHP 脚本的最大施行时间,不过,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够调节 PHP 脚本最大实践时间的是 php-fpm.conf 配置文件中的以下参数:

<?php
$ctx = stream_context_create(array(
'http' => array(
'timeout' => 1 //设置三个逾期时间,单位为秒
)
)
);
file_get_contents("", 0, $ctx);
?>

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>

  当然,导致 php-cgi 进度 CPU 100%的因由不止有这一种,那么,怎么规定是 file_get_contents() 函数导致的吧?
  首先,使用 top 命令查看 CPU 使用率较高的 php-cgi 进程。

暗许值为 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 GET 央求。借使以为费劲,可以自动将以下代码封装成一个函数。

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 百分之百 的 php-cgi 进度的 PID,用以下命令跟踪一下:

<?php
$ctx = stream_context_create(array(
‘http’ => array(
‘timeout’ => 1 //设置二个过期时间,单位为秒
)
)
);
file_get_contents(“, 0, $ctx);
?>

复制代码 代码如下:

 

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)

本来,导致 php-cgi 进度 CPU 百分之百 的原因不独有有这一种,那么,怎么规定是 file_get_contents() 函数导致的啊?

  那么,就足以明确是 file_get_contents() 导致的主题材料了。

第一,使用 top 命令查看 CPU 使用率较高的 php-cgi 进度。

您恐怕感兴趣的作品:

  • 深入php函数file_get_contents超时管理的议程详解
  • 解析PHP中的file_get_contents获取远程页面乱码的难题
  • file_get_contents("php://input", "r")实例介绍
  • php读取当麻芋果件常用函数(fopen与file_get_contents)
  • PHP file_get_contents设置超时管理方式
  • php 使用file_get_contents读取大文件的艺术
  • PHP使用fopen与file_get_contents读取文件实例共享

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 cachedPID 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 百分之百 的 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() 导致的主题素材了。

 

本文由澳门娱乐6165发布,转载请注明来源

关键词: