函数的涉嫌深入分析

享用三个其实在用的函数:

新兴,小编经过跟踪发掘,那类情状的面世,跟 PHP 的 file_get_contents() 函数有着紧凑的涉及。
  大、中型网址中,基于 HTTP 公约的 API 接口调用,是无独有偶。PHP 程序猿们欣赏使用简便方便的 file_get_contents("") 函数,来收获三个 UTucsonL 的归来内容,然而,假若 这些网址响应缓慢,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 诉求。假若认为麻烦,能够自动将以下代码封装成三个函数。

file_get_contents() 函数是用来将文件的开始和结果读入到叁个字符串中的首选办法。如若操作系统支撑,还有大概会接纳内部存款和储蓄器映射才干来拉长品质。

复制代码 代码如下:

/*比file_get_contents牢固的多!$timeout为超时时间,单位是秒,默感到1s。*/

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

 代码如下

  当然,导致 php-cgi 进程 CPU 百分之百的缘故不唯有这一种,那么,怎么显明是 file_get_contents() 函数导致的吧?
  首先,使用 top 命令查看 CPU 使用率较高的 php-cgi 进度。

function curl_get_contents($url,$timeout=1) {
  $curlHandle = curl_init();
  curl_setopt( $curlHandle , CURLOPT_URL, $url );
  curl_setopt( $curlHandle , CURLOPT_RETURNTRANSFER, 1 );
  curl_setopt( $curlHandle , CURLOPT_TIMEOUT, $timeout );
  $result = curl_exec( $curlHandle );
  curl_close( $curlHandle );
  return $result;
}
$hx = curl_get_contents('');

复制代码 代码如下:

深信不疑使用过file_get_contents函数的仇敌都知道,当获得的$url访谈不了时,会变成页面漫长的等候,以至还是可以导致PHP进度占用CPU达100%,因而那一个函数就出生了。

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

通过php.ini中的default_socket_timeout设置,暗中认可超时时间是default_socket_timeout = 60

  找个中三个 CPU 百分之百 的 php-cgi 进度的 PID,用以下命令追踪一下:

 代码如下

复制代码 代码如下:

max_execution_time = 30
default_socket_timeout = 60

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花费45,而max_execution_time是30,它将过期吗?
答案是NO,因为max_execution_time不影响操作系统调用或stream操作
另一些要建议的的是default_socket_timeout是在socket响应以前总括的,只要获得响应,将会直接实行下去

  那么,就足以分明是 file_get_contents() 导致的难点了。

能够经过以下三种艺术设置

你也许感兴趣的稿子:

  • 深入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读取文件实例分享

 代码如下

1 直接在php.ini中修改  default_socket_timeout =120
2 ini_set('default_socket_timeout',    120);  
3 $strm = stream_context_create(array(
    'http' => array(
        'timeout' => 120
        )
    )
);

curl的一部分常识介绍

保留原file_get_contents函数的原因是当读取当三步跳件时,用原生的file_get_contents显明更适于。

另来自张宴的file_get_contnets的优化,具体可看:

第一,使用 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 百分之百 的 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() 导致的主题素材了。

一样是安装超时时间来缓和那几个主题材料。如若没装curl,就不能够不得用这么些措施了。

 代码如下

$ctx = stream_context_create(array(  
   'http' => array(  
       'timeout' => 1 //设置二个超时时间,单位为秒  
       )  
   )  
);  
file_get_contents("", 0, $ctx);

本文由365bet体育在线官网发布于关于计算机,转载请注明出处:函数的涉嫌深入分析

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。