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

被折叠的 条评论
为什么被折叠?



