file_get_contents版本:
01 |
/** |
02 |
*
发送post请求 |
03 |
*
@param string $url 请求地址 |
04 |
*
@param array $post_data post键值对数据 |
05 |
*
@return string |
06 |
*/ |
07 |
function send_post( $url , $post_data )
{ |
08 |
09 |
$postdata =
http_build_query( $post_data ); |
10 |
$options = array ( |
11 |
'http' =>; array ( |
12 |
'method' =>; 'POST' , |
13 |
'header' =>; 'Content-type:application/x-www-form-urlencoded' , |
14 |
'content' =>; $postdata , |
15 |
'timeout' =>;
15 * 60 //
超时时间(单位:s) |
16 |
) |
17 |
); |
18 |
$context =
stream_context_create( $options ); |
19 |
$result = file_get_contents ( $url ,
false, $context ); |
20 |
21 |
return $result ; |
22 |
} |
使用如下:
1 |
post_data
= array ( |
2 |
'username' => 'stclair2201' , |
3 |
'password' => 'handan' |
4 |
); |
5 |
send_post( 'http://blog.snsgou.com' , $post_data ); |
实战经验:
当我利用上述代码给另一台服务器发送http请求时,发现,如果服务器处理请求时间过长,本地的PHP会中断请求,即所谓的超时中断,第一个怀疑的是PHP本身执行时间的超过限制,但想想也不应该,因为老早就按照这篇文章设置了“PHP执行时间限制”(【推荐】PHP上传文件大小限制大全 ),仔细琢磨,想想,应该是http请求本身的一个时间限制,于是乎,就想到了怎么给http请求时间限制搞大一点。。。。。。查看PHP手册,果真有个参数 “ timeout ”,默认不知道多大,当把它的值设大一点,问题得已解决,弱弱地做个笔记~~~
Socket版本:
01 |
/** |
02 |
*
Socket版本 |
03 |
*
使用方法: |
04 |
*
$post_string = "app=socket&version=beta"; |
05 |
*
request_by_socket('blog.snsgou.com', '/restServer.php', $post_string); |
06 |
*/ |
07 |
function request_by_socket( $remote_server , $remote_path , $post_string , $port =
80, $timeout =
30) { |
08 |
$socket = fsockopen ( $remote_server , $port , $errno , $errstr , $timeout ); |
09 |
if (! $socket ) die ( "$errstr($errno)" ); |
10 |
fwrite( $socket , "POST
$remote_path HTTP/1.0" ); |
11 |
fwrite( $socket , "User-Agent:
Socket Example" ); |
12 |
fwrite( $socket , "HOST:
$remote_server" ); |
13 |
fwrite( $socket , "Content-type:
application/x-www-form-urlencoded" ); |
14 |
fwrite( $socket , "Content-length:
" .
( strlen ( $post_string )
+ 8) . "" ); |
15 |
fwrite( $socket , "Accept:*/*" ); |
16 |
fwrite( $socket , "" ); |
17 |
fwrite( $socket , "mypost=$post_string" ); |
18 |
fwrite( $socket , "" ); |
19 |
$header = "" ; |
20 |
while ( $str =
trim( fgets ( $socket ,
4096))) { |
21 |
$header .= $str ; |
22 |
} |
23 |
24 |
$data = "" ; |
25 |
while (! feof ( $socket ))
{ |
26 |
$data .= fgets ( $socket ,
4096); |
27 |
} |
28 |
29 |
return $data ; |
30 |
} |
Curl版本:
01 |
/** |
02 |
*
Curl版本 |
03 |
*
使用方法: |
04 |
*
$post_string = "app=request&version=beta"; |
05 |
*
request_by_curl('http://blog.snsgou.com/restServer.php', $post_string); |
06 |
*/ |
07 |
function request_by_curl( $remote_server , $post_string )
{ |
08 |
$ch =
curl_init(); |
09 |
curl_setopt( $ch ,
CURLOPT_URL, $remote_server ); |
10 |
curl_setopt( $ch ,
CURLOPT_POSTFIELDS, 'mypost=' . $post_string ); |
11 |
curl_setopt( $ch ,
CURLOPT_RETURNTRANSFER, true); |
12 |
curl_setopt( $ch ,
CURLOPT_USERAGENT, "snsgou.com's
CURL Example beta" ); |
13 |
$data =
curl_exec( $ch ); |
14 |
curl_close( $ch ); |
15 |
16 |
return $data ; |
17 |
} |
Curl版本(2)
01 |
/** |
02 |
*
发送HTTP请求 |
03 |
* |
04 |
*
@param string $url 请求地址 |
05 |
*
@param string $method 请求方式 GET/POST |
06 |
*
@param string $refererUrl 请求来源地址 |
07 |
*
@param array $data 发送数据 |
08 |
*
@param string $contentType |
09 |
*
@param string $timeout |
10 |
*
@param string $proxy |
11 |
*
@return boolean |
12 |
*/ |
13 |
function send_request( $url , $data , $refererUrl = '' , $method = 'GET' , $contentType = 'application/json' , $timeout =
30, $proxy =
false) { |
14 |
$ch =
null; |
15 |
if ( 'POST' === strtoupper ( $method ))
{ |
16 |
$ch =
curl_init( $url ); |
17 |
curl_setopt( $ch ,
CURLOPT_POST, 1); |
18 |
curl_setopt( $ch ,
CURLOPT_HEADER,0 ); |
19 |
curl_setopt( $ch ,
CURLOPT_FRESH_CONNECT, 1); |
20 |
curl_setopt( $ch ,
CURLOPT_RETURNTRANSFER, 1); |
21 |
curl_setopt( $ch ,
CURLOPT_FORBID_REUSE, 1); |
22 |
curl_setopt( $ch ,
CURLOPT_TIMEOUT, $timeout ); |
23 |
if ( $refererUrl )
{ |
24 |
curl_setopt( $ch ,
CURLOPT_REFERER, $refererUrl ); |
25 |
} |
26 |
if ( $contentType )
{ |
27 |
curl_setopt( $ch ,
CURLOPT_HTTPHEADER, array ( 'Content-Type:' . $contentType )); |
28 |
} |
29 |
if ( is_string ( $data )){ |
30 |
curl_setopt( $ch ,
CURLOPT_POSTFIELDS, $data ); |
31 |
} else { |
32 |
curl_setopt( $ch ,
CURLOPT_POSTFIELDS, http_build_query( $data )); |
33 |
} |
34 |
} else if ( 'GET' === strtoupper ( $method ))
{ |
35 |
if ( is_string ( $data ))
{ |
36 |
$real_url = $url .
( strpos ( $url , '?' )
=== false ? '?' : '' ). $data ; |
37 |
} else { |
38 |
$real_url = $url .
( strpos ( $url , '?' )
=== false ? '?' : '' ).
http_build_query( $data ); |
39 |
} |
40 |
41 |
$ch =
curl_init( $real_url ); |
42 |
curl_setopt( $ch ,
CURLOPT_HEADER, 0); |
43 |
curl_setopt( $ch ,
CURLOPT_HTTPHEADER, array ( 'Content-Type:' . $contentType )); |
44 |
curl_setopt( $ch ,
CURLOPT_RETURNTRANSFER, 1); |
45 |
curl_setopt( $ch ,
CURLOPT_TIMEOUT, $timeout ); |
46 |
if ( $refererUrl )
{ |
47 |
curl_setopt( $ch ,
CURLOPT_REFERER, $refererUrl ); |
48 |
} |
49 |
} else { |
50 |
$args =
func_get_args(); |
51 |
return false; |
52 |
} |
53 |
54 |
if ( $proxy )
{ |
55 |
curl_setopt( $ch ,
CURLOPT_PROXY, $proxy ); |
56 |
} |
57 |
$ret =
curl_exec( $ch ); |
58 |
$info =
curl_getinfo( $ch ); |
59 |
$contents = array ( |
60 |
'httpInfo' => array ( |
61 |
'send' => $data , |
62 |
'url' => $url , |
63 |
'ret' => $ret , |
64 |
'http' => $info , |
65 |
) |
66 |
); |
67 |
68 |
curl_close( $ch ); |
69 |
return $ret ; |
70 |
} |
调用 WCF接口 的一个例子:$json = restRequest($r_url,'POST', json_encode($data));
转自http://blog.snsgou.com/blog/161.html