ping服务很好玩,大家可以试下,我写的这个类是基于curl和XML-RPC的,也就是说,通过CURL扩展把符合XML-RPC的数据进行提交,并把数据反馈,在这个类中,可以把反馈的数据用日志的方式记入日志文件。

我也还写过一个基于CURL的PING服务使用方法http://www.chhua.com/web-note2156 ),不过那一个是单一线程的,现在的这一个是多线程的,与大家共享,希望大家订阅和支持我的博客(www.chhua.com )也不枉陈华的汗水。

下面是ping服务类的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
class ping{
	private $blog=array();
	private $pingUrl=array();
	private $pingBody;
 
	public function __construct($blog,$pingUrl){//博客资料,ping服务器数组
		if (!extension_loaded("curl")){
			echo "<script>alert('服务器没有打开CURL扩展,不能执行PING服务。');location.go(-1);</script>";
			exit();
		}
		$this->blog=$blog;//把博客资料载入
		$this->pingUrl=$pingUrl;//ping服务器资料载入
	}
	//转载请注明web开发笔记-www.chhua.com
	public function pingSubmit($url){
 
		$pingCurl=curl_multi_init();//创建一个多线程句柄
 
		$this->pingBody=$this->getPingBody($url);//获取PING的数据部分
 
		$pingHeader=array(
		'Content-Type:text/xml; charset=UTF-8',
		'Accept:text/xml',
		"Content-length:".strlen($this->pingBody));//设置头部信息
 
		for ($i=0;$i<sizeof($this->pingUrl);$i++){
			$ping_ch[$i]=curl_init();//设置一个单独的CRUL句柄
			curl_setopt($ping_ch[$i],CURLOPT_URL,$this->pingUrl[$i]);//设置地址
			curl_setopt($ping_ch[$i],CURLOPT_RETURNTRANSFER,1);//设置返回内容是以字符串方式
			curl_setopt($ping_ch[$i],CURLOPT_TIMEOUT,10);//允许CURL执行的最长秒数
			curl_setopt($ping_ch[$i],CURLOPT_HTTPHEADER,$pingHeader);//设置头部数组
			curl_setopt($ping_ch[$i],CURLOPT_POST,1);//POST方法提交
			curl_setopt($ping_ch[$i],CURLOPT_POSTFIELDS,$this->pingBody);//POST方法发送文件设置
			curl_multi_add_handle($pingCurl,$ping_ch[$i]);//将单独CURL句柄加入多线程
		}
 
		do {
			curl_multi_exec($pingCurl,$ping_flag);
		}while ($ping_flag>0);
 
		//保存返回的信息//转载请注明web开发笔记-www.chhua.com
	$ping_log = date("Y-m-d H:i:s") . "\r\n";
	for ($ping_count = 0; $ping_count < sizeof($this->pingUrl); $ping_count++) {
		$ping_results = curl_multi_getcontent($ping_ch[$ping_count]);
		$ping_parser = xml_parser_create();
		xml_parse_into_struct($ping_parser, $ping_results, $ping_vals);
		xml_parser_free($ping_parser);
		$ping_log .= $this->pingUrl[$ping_count] . "\r\n";
		foreach ($ping_vals as $ping_value) {
			if ($ping_value['type'] == 'complete') {
				$ping_log .= $ping_value['tag'] . '=' . $ping_value['value'] . "\r\n";
			}
		}
		$ping_log .= "\r\n";
	}
	file_put_contents(dirname(__FILE__) . '/ping.log', $ping_log, FILE_APPEND);
 
	//释放资源//转载请注明web开发笔记-www.chhua.com
	for ($ping_count=0; $ping_count<sizeof($this->pingUrl); $ping_count++) {curl_multi_remove_handle($pingCurl, $ping_ch[$ping_count]);}
	curl_multi_close($pingCurl);
	}
 
	private function getPingBody($url){//转载请注明web开发笔记-www.chhua.com
		$ping_body="<?xml version=\"1.0\" encoding=\"utf-8\"?>
	   <methodCall>
	   <methodName>weblogUpdates.extendedPing</methodName>
	   <params>
	   <param><value><string>{$this->blog["name"]}</string></value></param>
	   <param><value><string>{$this->blog["url"]}</string></value></param>
	   <param><value><string>{$url}</string></value></param>
	   <param><value><string>{$this->blog["rss"]}</string></value></param>
	   </params>
	   </methodCall>";
		return $ping_body;
	}
}
?>

这个类中都进行了详细的注释,如果有不懂的问题可以加入 PHP高级群进行询问,群号是:63417682。

自由转载,转载请注明: 转载自WEB开发笔记 www.chhua.com

本文链接地址: 自己写的一个ping服务类 http://www.chhua.com/web-note2202

相关笔记

更多