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://www.qianyunlai.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('www.qianyunlai.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://www.qianyunlai.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, "qianyunlai.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 ; |