2016-01-22 92 views
0

我打電話這樣的一個URL的作用:捲曲不是從PHP工作,但它的命令行

http://localhost:9910/app/check?name=alvaro&test=true

訪問通過瀏覽器URL我得到正確的結果。並使用與curl命令行時一樣,它獲取正確的信息:

C:\>curl "http://localhost:9910/boxreload/check?name=alvaro&test=true" -i 
HTTP/1.1 200 OK 
Content-type: application/json; charset=UTF-8 
Content-length: 203 
Server: Restlet-Framework/2.3.3 
Accept-ranges: bytes 
Date: Fri, 22 Jan 2016 18:01:30 GMT 

{"restul": "true"} 

但隨着PHP這樣做,當它從來沒有來自curl_exec和服務器的時間背出30秒後。

$stringData = http_build_query($data); 
$url = sprintf("%s?%s", $url, $stringData); 

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); 

curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json;', 
    'Content-Length: ' . strlen($stringData)) 
); 

// $url is "'http://localhost:9910/boxreload/check?name=alvaro&test=true'" 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

//never comes back from this call (server times out) 
$curl_response = curl_exec($curl); 

if(curl_response === FALSE){ 
    echo "error en CURL"; 
    echo curl_error($curl); 
} 
curl_close($curl); 

//never reaches this point 
print_r($curl_response); 

這是爲什麼?我做錯了什麼?

+0

你'echo'什麼都沒有。你期望什麼? –

+0

@u_mulder我的觀點是,服務器在'curl_exec'上超時......永遠不會回來。我沒有在這個例子中迴應任何事情,因爲這對我的問題沒有必要。 – Alvaro

+0

嘗試添加'curl_setopt($ curl,CURLOPT_PORT,9910);' – Slam

回答

2

正如所建議的,我把我的評論變成了答案。

將最後一行中的print_r更改爲回顯,以便您可以看到原始字符串輸出。

此代碼段:

curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json;', 
'Content-Length: ' . strlen($stringData)) 
); 

意味着你做出請求時發送這些報頭到服務器:

Content-Type: application/json 
Content-Length: nnn 

其中nnn是代表$stringData長度的整數。

只要確保在發出請求時發送了正確的標頭,否則您可能會收到不良結果。將內容類型和內容長度指定爲從客戶端傳遞到服務器的標頭是很常見的。它應該是另一種方式(服務器向客戶端發送內容類型和內容長度標頭)。

0

你忘了做curl_init

$curl = curl_init();

和你的if語句中的變量前面缺少$。 檢查這個代碼:

$data = []; 

$stringData = http_build_query($data); 
$url = sprintf("%s?%s", "http://google.ro/", $stringData); 

$curl = curl_init(); 

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); 

curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json;', 
    'Content-Length: ' . strlen($stringData)) 
); 

// $url is "'http://localhost:9910/boxreload/check?name=alvaro&test=true'" 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 

//never comes back from this call (server times out) 
$curl_response = curl_exec($curl); 

if($curl_response === FALSE){ 
    echo "error en CURL"; 
    echo curl_error($curl); 
} 
curl_close($curl); 

//never reaches this point 
print_r($curl_response);