PHP进程–CPU100%与file_get_contents函数的关系

有时候,运行 Nginx、PHP-CGI(php-fpm) Web服务的 Linux 服务器,突然系统负载上升,使用 top 命令查看,很多 php-cgi 进程 CPU 使用率接近100%.后来,我通过跟踪发现,这类情况的出现,跟 PHP 的 file_get_contents() 函数有着密切的关系.一般网站中,基于命令行的php脚本来做采集任务是家常便饭,PHP程序员们喜欢使用简单便捷的 file_get_contents(“http://www.xxx.com/”)函数,来获取一个URL 的返回内容,但是,如果 http://example.com/ 这个网站响应缓慢,file_get_contents() 就会一直卡在那儿,不会超时.

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

<?php  
    $ctx = stream_context_create(array(  
       'http' => array(  
           'timeout' => 2 //设置一个超时时间,单位为秒  
           )  
       )  
    );  
    file_get_contents("http://example.com/", 0, $ctx);  

也可以这样做:

直接在php.ini中修改  default_socket_timeout =2

或ini_set(‘default_socket_timeout’,2); 

或者用curl代替:

function new_file_get_contents($url){
	$result = '';    	
    $ch = curl_init();
    $options = array(
    	CURLOPT_URL => $url,
    	CURLOPT_CONNECTTIMEOUT => 10,	//连接超时
    	CURLOPT_TIMEOUT => 10,			//接收数据时超时设置
    	CURLOPT_RETURNTRANSFER => true,
    	CURLOPT_POST => $method == 'post' ? 1 : 0,
    	CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0'
    );
    curl_setopt_array($ch, $options);
    $result = curl_exec($ch);
    curl_close($ch);
    	    
    return $result;
}

当然,导致php进程CPU100%的原因不只有这一种,那么,怎么确定是file_get_contents()函数导致的呢?首先,使用top命令查看CPU使用率较高的php进程.

找其中一个CPU100%的php进程的 PID,用以下命令跟踪一下:

strace -p xxxxx

如果屏幕显示:

select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})
poll([{fd=5, events=POLLIN}], 1, 0)     = 0 (Timeout)
select(6, [5], [5], [], {15, 0})        = 1 (out [5], left {15, 0})

那么,就可以确定是file_get_contents()导致的问题了

whose brand new fiance Matthew Bellamy skipped the fashion festivities
gay porn The adventure of a swimwear designer at MBIFW 2011

fashion consultant for Mervyn’s California stores
gay pornOld Fashioned German Potato Soup Recipe
free gay porn
发表在 网站开发 | 标签为 | 一条评论

路由器转发规则

一个路由器有如下路由表

目的网络 子网掩码 度量值 转发端口
0.0.0.0 0.0.0.0 100 F0/0
172.16.0.0 255.240.0.0 100 F0/1
172.20.0.0 255.254.0.0 200 F0/2
172.31.50.0 255.255.255.0 180 F0/3
172.31.50.0 255.255.255.0 150 F0/4

当路由器收到如下地址时,如何转发数据包?

172.18.234.56

172.21.201.112

172.31.50.22

172.33.151.2

解答:

分别算出各网络的IP范围依次是:

172.16.0.0          172.16.0.0->172.31.255.255

172.20.0.0          172.20.0.0->172.21.255.255

172.31.50.0        172.31.50.0->172.31.50.255

172.31.50.0        172.31.50.0->172.31.50.255

转发规则如下:

1:先找出在那个网络。

2:找其中范围最小的

3:找度量值最小的

4:均没有,则到默认路由

所以各IP的转发情况如下:

172.18.234.56           F0/1
172.21.201.112         F0/2
172.31.50.22             F0/4
172.33.151.2             F0/0

jazz trumpeter Jack Sheldon and the Bill Elliott Swing Orchestra
cartoon porn You Shouldn’t Wear That Fedora

The current P
miranda lambert weight lossPicking the Perfect Quinceanera Dress
large porn tube
发表在 北京大学 | 标签为 | 一条评论

什么是url?它由那部份组成?其中那部份可以省略?如何确定省略部份的值?

统一资源定位符(Uniform Resource Locator)是WWW进行资源定位的标准格式,它给资源的位置提供了一种抽象的识别方法

<应用层协议>://<主机名>[:端口号]/[路径][文件名]

可以省略的是端口号和文件名.端口号根据协议有不同的默认值.(http默认80).文件名根据服务器的配置来确定

isn’t this just a male rescue fantasy
quick weight loss The world’s largest yard sale is Saturday

luxury e . d . acquire momentum in tibet regardless of the global downturn
gay pornEllen DeGeneres get fashion groovy in New York video
lesbian porn
发表在 北京大学 | 标签为 | 一条评论

RIP协议使用哪一种路由算法?它是如何工作的?它有哪些特点?

1:使用距离向量路由选择算法

2:互联网中的每个路由器默认每隔30秒向相邻路由器广播自己的路由表.路由表中最主要的信息就是:到某一网络的距离,以及应经过的下一站.  路由表更新的原则是使到各目的网络的距离最短.RIP让互联网中的所有路由器与其相邻路由器不断交换距离信息,并不断更新其路由表,最后将到每一个目的网络的最佳路由算出

3:特点:
仅和相邻路由器交换信息.
路由器交换的信息是本路由器当前所知道的全部信息,即路由表.
按固定的时间间隔交换路由信息,默认时间间隔为30秒,然后路由器根据收到的路由信息更新路由表。当网络拓扑发生变化时,路由
器也及时向相邻路由器通告拓扑变化后的路由信息

hair-styles for the li
weight loss tips Steven Madden’s CEO Presents at Canaccord Genuity 32nd Annual Growth Conference Transcript

Attractive and functional shoes for summer
weight loss tipsFinding a Bib Necklace in the last place you
youporn
发表在 北京大学 | 标签为 | 一条评论

无类域间路由(CIDR)

无类域间路由(CIDR)消除了传统的分类地址及划分子网的概念,因而可以更加有效地使用IPv4的地址空间.CIDR使用各种长度的“网络前缀”来代替分类地址中的网络号和子网号.  CIDR使用“斜线记法”,即在IP地址后面加上一个斜线,然后写上网络前缀所占的位数(数值对应于子网掩码中1的个数).  CIDR把网络前缀相同的连续的IP地址组成“CIDR地址块”.

CIDR地址:  192.36.162.7/20  

二进制表示:11000000.00100100.1010 0010.00000111
掩码:        11111111.11111111.1111 0000.00000000
                 (   255  .  255   .   240   .    0   )
                      12
地址块大小:2^12 =4,096  
首地址:        192.36.160.0  
末地址:        192.36.175.255  
可用地址范围:192.36.160.1 ~ 192.36.175.254

It’s more or less what it sounds like
snooki weight loss Test Drives For Wounded Warrior Project

2 million coming in off early Thursday night previews
snooki weight lossBest Food for Summer to Loose Weight
anime porn
发表在 北京大学 | 标签为 | 一条评论

子网合并为超网

将4个C类网络:192.168.0.0—192.168.3.0合并成一个超网

分析1:将这4个C类网络的地址用二进制来表示就是:    

十进制表示                   二进制表示  
网络一   192.168.0.0       (192.168).00000000.00000000  
网络二   192.168.1.0       (192.168).00000001.00000000  
网络三   192.168.2.0       (192.168).00000010.00000000  
网络四   192.168.3.0       (192.168).00000011.00000000

分析2:这4个地址的前22位相同,且随后2位包括了所有可能的组合


十进制表示                   二进制表示  
网络一   192.168.0.0       (192.168).00000000.00000000  
网络二   192.168.1.0       (192.168).00000001.00000000  
网络三   192.168.2.0       (192.168).00000010.00000000  
网络四   192.168.3.0       (192.168).00000011.00000000

分析3:因此,超网的网络地址和子网掩码用二进制表示,应该是

    

网络地址:11000000.10101000.00000000.00000000  
子网掩码:11111111.11111111.11111100.00000000

将4个C类网络:192.168.0.0—192.168.3.0 合并成一个超网。

 

结论:用习惯的方法表示,超网的网络地址和子网掩码应该是:    

网络地址:192.168.0.0

子网掩码:255.255.252.0

or a small feather evening bag
christina aguilera weight loss Why Paraben Free Products Make The Grade

How to Teach Yourself to Design Make Clothes
how to lose weight fastHow to Find the Right Prom Dress for You
anime porn
发表在 北京大学 | 标签为 | 一条评论

子网的划分

将一个C类网络:192.168.1.0划分为相等大小的4个子网?

分析1:
C类网络的标准子网掩码为255.255.255.0 . 将网络地址和子网掩码用二进制来表示,就是:
网络地址:11000000.10101000.00000001.00000000  
子网掩码:11111111.11111111.11111111.00000000

分析2:

如果将此C类网络划分成相等大小的4个子网,则需要向主机地址借两位,从而形成新的子网掩码是:    

新子网掩码:    11111111.11111111.11111111.11000000  
其二进制表示 : 255.255.255.192  

分析3

根据新的子网掩码,4个较小的子网分别是:    

子网一:11000000.10101000.00000001.00000000
子网二:11000000.10101000.00000001.01000000
子网三:11000000.10101000.00000001.10000000

子网四:11000000.10101000.00000001.11000000

结论:用习惯的表示方法,子网的IP地址和子网掩码 如下表:

子网的IP地址 子网掩码
子网一 192.168.1.0 255.255.255.192
子网二 192.168.1.64 255.255.255.192
子网三 192.168.1.128 255.255.255.192
子网四 192.168.1.192 255.255.255.192

similar Tumblr posts are only allowed on Thin Privilege Thursdays
miranda lambert weight loss Adidas CLIMACOOL MOTION SOLID MESH POLO

camelback statehome in the ancient citie tempe
miranda lambert weight loss7 places in Baltimore to find unique holiday gifts
free black porn
发表在 北京大学 | 标签为 | 一条评论

php将数组转化成xml和json

在PHP中,大家一般操作数组的比较多。但有时,在做后台API或者其他情况下,需要同其他平台交换数据。一般常见的有XML,JSON两种!

1:数组转换成XML

function array2xml($array, $tag) { 

    function ia2xml($array) { 
        $xml=""; 
        foreach ($array as $key=>$value) { 
            if (is_array($value)) { 
                $xml.="<$key>".ia2xml($value)."</$key>"; 
            } else { 
                $xml.="<$key>".$value."</$key>"; 
            } 
        } 
        return $xml; 
    } 

    return simplexml_load_string("<$tag>".ia2xml($array)."</$tag>"); 
} 

2:数组转换成JSON,直接json_encode方法即可

另外多说一句,有的时候需要将object数据转化成数组。可以通过先将此数据json_encode,然后在解码json_decode 的时候,将第二个参数设置为true即可!

Heels are good
gay porn post awards and fashion recap TV specials

Immersing patrons in a magical shroud of style and
pornoObjects Of Fashion Decoration For Men
milf porn
发表在 网站开发 | 一条评论

测试

roughly in line with analysts expectations of
miranda lambert weight loss Lady Gaga Amputates Leg for Fashion

and we started hiking
weight loss tipsJoico K Pack Reconstructor Conditioner best High End for dry
rape porn
发表在 网站开发 | 一条评论

从我们在浏览器的地址栏里输入www.sina.com.cn,到整个页面显示在浏览器上,这段时间内网络上都发生了什么事情?

首先嘛,你得在浏览器里输入要网址,然后我们看看后台发生了什么?

1:浏览器查找域名的IP地址


    浏览器缓存 – 浏览器会缓存DNS记录一段时间

    系统缓存 – 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用(windows里是gethostbyname)。这样便可获得系统缓存中的记录
        
    路由器缓存 – 接着,前面的查询请求发向路由器,它一般会有自己的DNS缓存
    
    ISP DNS 缓存
    
    递归搜索

2:浏览器给web服务器发送一个HTTP请求    
    
    GET http://www.sina.com.cn/ HTTP/1.1

3:服务器“处理”请求,服务器发回一个HTML响应
    HTTP/1.1 200 OK
    

4:浏览器收到响应开始显示HTML
    

5:浏览器发送获取嵌入在HTML中的对象

6:整个页面显示完毕

7:根据是否长连接情况选择是否关闭连接

基本情况就是这样,有时间再补充!

In such situations
quick weight loss 9 Handy Tips For Fashionable Moms

be decked out in pertaining to
gay pornOPPORTUNITIES FOR PAKISTAN IN AIR
free hd porn
发表在 北京大学 | 标签为 | 一条评论