PHP整理架

我的朋友PHP

【转】php socket 模拟 post 学习函数

今天测试了一个http短信接口,主要用于系统给用户发送信息。看过说明文档之后,明明说明是可以从浏览器访问并测试的,但在我这边从浏览器上访问不了,于是同事给了一个方法,用file函数访问此url,一试,果然正常。
但url一般是类似于http://xxx.com/test.php的形式,参数咋弄咧?可以用get方式直接传过去,但一旦出现了中文,用urlencode编码请求失败,咱们同事又给了一个方法:模拟post。测试后正常,下面是模拟post的代码,一看就知道如何使用了:
/*-----------------------------------------------------------
*功能:使用PHP socke 向指定页面提交数据
*
*作者:Honghe.c
*
*说明:post($url, $data)
*
* $url = 'http://www.xxx.com:8080/login.php';
* $data[user] = 'hong';
* $data[pass] = 'xowldo';
* echo post($url, $data);
*-----------------------------------------------------------
*/

function post($url, $data) {

$url = parse_url($url);
if (!$urlreturn "couldn't parse url";
if (!isset($url['port'])) { $url['port'= ""; }
if (!isset($url['query'])) { $url['query'= ""; }

$encoded = "";

while (list($k,$v= each($data)) {
$encoded .= ($encoded ? "&" : "");
$encoded .= rawurlencode($k)."=".rawurlencode($v);
}

$fp = fsockopen($url['host'], $url['port'? $url['port': 80);
if (!$fpreturn "Failed to open socket to $url[host]";

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");

$line = fgets($fp,1024);
if (!eregi("^HTTP/1\.. 200", $line)) return;

$results = ""$inheader = 1;
while(!feof($fp)) {
$line = fgets($fp,1024);
if ($inheader && ($line == "\n" || $line == "\r\n")) {
$inheader = 0;
}
elseif (!$inheader) {
$results .= $line;
}
}
fclose($fp);

return $results;
}

$url = 'http://127.0.0.1:80/pp.php';
$data['user'= 'hong';
$data['pass'= 'xowldo';
echo post($url, $data);

?>

posted on 2008-10-15 11:38 小博 阅读(375) 评论(0)  编辑 收藏 引用 网摘


只有注册用户登录后才能发表评论。
网站导航: