Toc
0 results found
Seven Chen
自己封印的同步/异步请求方法
2009/07/22 技术杂文

[php] "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; } } ?> [/php]

本文作者:Seven Chen
版权声明:本文首发于Seven Chen的博客,转载请注明出处!