![](/img/trans.png)
[英]PHP curl: CURLOPT_URL, CURLOPT_POST, and CURLOPT_POSTFIELDS
[英]CURL set CURLOPT_POST perminetelly
當我用curl進行多個請求時,我得到一個非常奇怪的行為。 這是我的功能:
function http_request($curl, $url, $post = null)
{
echo (isset($post) ? 'POST ' . $url : 'GET ' . $url) . PHP_EOL;
try
{
$cookie_path = tempnam(null, 'b');
curl_setopt_array($curl, array
(
CURLOPT_COOKIEFILE => $cookie_path,
CURLOPT_COOKIEJAR => $cookie_path,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_POST => count($post),
CURLOPT_POSTFIELDS => $post,
CURLOPT_HEADER => true,
CURLOPT_AUTOREFERER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_URL => $url,
CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0',
CURLOPT_HTTPHEADER => array
(
'Accept-Language: en-US;q=0.6,en;q=0.4',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
)
));
return curl_exec($curl);
}
catch(Exception $exception)
{
echo $exception;
}
}
這是我用來調用它的代碼:
$curl = curl_init();
http_request($curl, "http://host.com/url1");
http_request($curl, "http://host.com/url2", "postdata=123");
http_request($curl, "http://host.com/url3");
http_request($curl, "http://host.com/url4");
curl_close($curl);
這是我得到的輸出:
GET http://host.com/url1
POST http://host.com/url2
GET http://host.com/url3
GET http://host.com/url4
到目前為止一切順利,但是使用數據包分析器(wireshark),輸出看起來像這樣:
POST http://host.com/url1
Content-Length: 0;
POST http://host.com/url2
Content-Length: 12;
POST http://host.com/url3
Content-Length: 0;
POST http://host.com/url4
Content-Length: 0;
然后我重寫了這樣的代碼:
function http_request($curl, $url, $post = null)
{
echo (isset($post) ? 'POST ' . $url : 'GET ' . $url) . PHP_EOL;
try
{
$cookie_path = tempnam(null, 'b');
curl_setopt_array($curl, array
(
CURLOPT_COOKIEFILE => $cookie_path,
CURLOPT_COOKIEJAR => $cookie_path,
CURLOPT_COOKIESESSION => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HEADER => true,
CURLOPT_AUTOREFERER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_URL => $url,
CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0',
CURLOPT_HTTPHEADER => array
(
'Accept-Language: en-US;q=0.6,en;q=0.4',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
)
));
if($post != null)
{
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
}
else
{
curl_setopt($curl, CURLOPT_POST, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, null);
}
return curl_exec($curl);
}
catch(Exception $exception)
{
echo $exception;
}
}
但是如果我從函數中刪除此代碼,仍然會發生同樣的事情:
if($post != null)
{
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
}
else
{
curl_setopt($curl, CURLOPT_POST, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, null);
}
在數據包分析器中,我得到:
GET http://host.com/url1
GET http://host.com/url2
GET http://host.com/url3
GET http://host.com/url4
即使第一個請求未設置,如何在第一個請求上將其設置為POST也沒有意義。 謝謝!
我隱約記得前段時間我也遇到過同樣的問題。 嘗試也明確設置CURLOPT_HTTPGET
:
if($post != null)
{
curl_setopt($curl, CURLOPT_HTTPGET, false);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
}
else
{
curl_setopt($curl, CURLOPT_HTTPGET, true);
curl_setopt($curl, CURLOPT_POST, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, null);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.