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