您的位置:首页 > 理论基础 > 计算机网络

PHP发送HTTP请求(POST请求、GET请求)

2015-03-02 16:03 246 查看
file_get_contents版本:

01
/**
02
*
发送post请求
03
*
@paramstring$url请求地址
04
*
@paramarray$post_datapost键值对数据
05
*
@returnstring
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_pathHTTP/1.0"
);
11
fwrite(
$socket
,
"User-Agent:
SocketExample"
);
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
CURLExamplebeta"
);
13
$data
=
curl_exec(
$ch
);
14
curl_close(
$ch
);
15
16
return
$data
;
17
}
Curl版本(2)

view
source

?

01
/**
02
*
发送HTTP请求
03
*
04
*
@paramstring$url请求地址
05
*
@paramstring$method请求方式GET/POST
06
*
@paramstring$refererUrl请求来源地址
07
*
@paramarray$data发送数据
08
*
@paramstring$contentType
09
*
@paramstring$timeout
10
*
@paramstring$proxy
11
*
@returnboolean
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: