分类: 技术杂文

自己封印的同步/异步请求方法

<?php
	/**
	 * 发送url请求 fsockopen
	 * 可以这样请求  ini::sendRequest('http://www.club-fish.com/doWhat.php',array("action"=>"addMoney", ... , ...)); 这个是同步请求会等返回值
	 * 也可以这样  ini::sendRequest('http://www.club-fish.com/doWhat.php?action=addMoney&xxx=yyy&zzz=xxx') 这样效果同上
	 * 这个就不一样了  ini::sendRequest('http://www.club-fish.com/doWhat.php',array(),TRUE)  这个是异步请求,不会有返回
	 *
	 * @param string $url 呼叫的url 注意数据可以直接附带在url上
	 * @param array $data [发送的数据 ]
	 * @param bool $async [是否是异步请求  默认false=同步  true=异步]
	 * @return string
	 */
	public static function sendRequest($url , $data = array() , $async = FALSE){
		$error = NULL;//错误标志
		$url = parse_url($url);//分解url
		if (!$url) {
			$error ++ ;
			$results = "empty url";
		}else{
			if (!isset($url['port'])){ 
				$url['port'] = "";
			}
			if (!isset($url['query'])){ 
				$url['query'] = ""; 
			}
			$encoded = '';
			//接上额外的数据
			if (is_array($data) && count($data) > 0){
				foreach ($data as $k => $v){
					$encoded .= ($encoded ? "&" : "");
					$encoded .= rawurlencode($k)."=".rawurlencode($v);
				}
			}
			//打开资源
			$fp = fsockopen($url['host'], $url['port'] ? $url['port'] : 80);
			if (!$fp) {
				//出错:打不开资源
				$error ++ ;
				$results = "Failed to open socket to $url[host]";
			}else {
				//拼接head内容
				fputs($fp, sprintf("POST %s%s%s HTTP/1.0\n", $url['path'], $url['query'] ? "?" : "", $url['query']));
				fputs($fp, "Host: $url[host]\n");
				fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
				fputs($fp, "Content-length: " . strlen($encoded) . "\n");
				fputs($fp, "Connection: close\n\n");
				//发送请求
				fputs($fp, "$encoded\n");
				
				if (!$async){
					//先或许些响应看请求是否成功
					$line = fgets($fp,1024);
					if (!eregi('^HTTP/1\.. 200', $line)) {
						//请求失败了
						$error ++ ;
						$results = "bad request";
					}else{
						//同步模式,
						//请求成功了,接着取所有的响应结果
						$results = "";
						$inheader = 1;
						while(!feof($fp)) 
						{
							$line = fgets($fp,1024);
							if ($inheader && ($line == "\n" || $line == "\r\n")){
								$inheader = 0;
							} elseif (!$inheader){
								$results .= $line;
							}
						}
					}
				}else {
					//异步请求无需返回
				}
				
				fclose($fp);
			}
		}
		//返回值或空
		if (empty($error)){
			return $results;
		}else {
			return NULL;
		}
	}
?>
Share