2011-02-14 101 views
11

當我在特定的URL上運行curl時,儘管我已設置了錯誤報告,但站點停止響應並且不會生成錯誤。我試着將curl超時設置爲低值,然後它會生成一個錯誤,所以我知道它不會超時。curl_exec導致php腳本停止任何事情

我想知道的主要事情是,這怎麼可能發生,我怎麼能找出原因?

我試圖訪問的URL是事實API的調用和URL,我在這裏使用

http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters= { 「類別」: 「汽車」, 「$ LOC」: {「$ within」:{「$ center」:[[41,-74],80467.2]}})

將它放入瀏覽器時有效。如果您將經緯度更改爲基本上任何其他值,則php腳本將按預期工作。

error_reporting(E_ALL); 
ini_set('display_errors', '2'); 
$url="http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters={\"category\":\"Automotive\",\"\$loc\":{\"\$within\":{\"\$center\":[[41,-74],80467.2]}},\"website\":{\"\$blank\":false}}"; 
Echo "\n\n1"; 

$ch = curl_init($url); 
Echo 2; 
curl_setopt($ch, CURLOPT_HEADER, 0); 
Echo 3; 
curl_setopt($ch, CURLOPT_POST, 1); 
Echo 4; 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,15); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT,30); 
Echo 5; 
$output = curl_exec($ch) or die("hhtrjrstjsrjt".curl_error($ch)); 
Echo 6; 
curl_close($ch); 
Echo "out: ".$output; 
+6

你可以嘗試設置一個不同的useragent;我們之前有過垃圾郵件問題,而且我們使用我們不喜歡的垃圾郵件進行有趣的事情。 – 2011-02-14 17:41:51

+2

另外,發佈你的API密鑰可能不是一個好主意 – DFectuoso 2011-02-14 17:48:11

+3

有一件事:``output = curl_exec($ ch)或die(「hhtrjrstjsrjt」.curl_error($ ch));`不會達到你所期望的。基本上,它正在執行`$ output =(curl_exec($ ch)或die(「hhtrjrstjsrjt」.curl_error($ ch)));`因爲它返回一個布爾值而不是字符串。相反,要麼將錯誤檢查移動到下一行,要麼將其顯式分組,如下所示:`($ output = curl_exec($ ch))或die(「hhtrjrstjsrjt」.curl_error($ ch));` – ircmaxell 2011-02-14 17:48:54

回答

1

這個代碼只是爲了測試,只需修改根據礦山

<?php 

$useragent = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) 
Chrome/8.0.552.224: Safari/534.10'; // notice this 
$url="http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters={\"category\":\"Automotive\",\"\$loc\":{\"\$within\":{\"\$center\":[[41,-74],80467.2]}},\"website\":{\"\$blank\":false}}"; 
$ch = curl_init(); // notice this 

curl_setopt($ch, CURLOPT_URL, $url); // notice this 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 




$contents = curl_exec($ch); 
echo $contents; 
?> 
2

在我的情況下捲曲故障是由於該託管服務提供商已經取代阿帕奇用的Litespeed其實你的代碼, litespeed在curl請求期間終止了該進程。

php.ini設置沒有解決這個問題,因爲lsphp每次都在30秒終止。

我們進行了長時間的聊天,我確信他們的服務器實際上已經損壞(最終)。

要對誰可能有類似或相關的問題其他人更清楚:
我的PHP腳本運行,並在PHP中被記錄沒有錯誤,因爲整個PHP程序,包括錯誤記錄器是由Web服務器終止。

2

由於CURL是一個外部應用程序,因此您的網址並不是url_encoded,因此您的瀏覽器會自動在網址上使用url_encode params,但是您可能會在服務器上發生捲曲並停止運行。

嘗試改變這一點:

$url="http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters={\"category\":\"Automotive\",\"\$loc\":{\"\$within\":{\"\$center\":[[41,-74],80467.2]}},\"website\":{\"\$blank\":false}}"; 

到:

$url_filters = '{"category":"Automotive","$loc":{"$within":{"$center":[[41,-74],80467.2]}},"website":{"$blank":false}}'; 

$url="http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters=".urlencode($url_filters); 

然而,我有一些問題是你的電話是否正確? literlal「$ loc」的關鍵是否正確?

更新,刪除需要反斜槓一切單引號不支持變量替換,將允許雙引號沒有逃脫他們

2

我曾與香草PHP之前捲曲電話工作。 CURL呼叫是curl類的一部分。正如其他用戶所建議的那樣,url_encode($url)函數會準備供該特定類使用的字符串。如果您不運行此操作,那麼您可以傳遞會破壞處理程序的URL(例如,使用無效字符或URL語法)。

最重要的是,您似乎試圖將JSON對象直接傳遞到頁面的URL中。我不認爲最好的做法是像這樣用curl調用JSON包。如果這是你正在做的,看到這個頁面:How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?

3

看起來你在你的PHP配置文件中有一些錯誤。

要解決您的錯誤,您必須編輯您的php.ini文件。

若要在開發模式下顯示錯誤,請將error_reporting的值更改爲E_ALL

error_reporting=E_ALL 

然後您必須啓用cURL擴展。 要啓用它在你的php.ini,你要跟不得不取消註釋以下行:

extension=php_curl.dll 

一旦你編輯這個值,別忘了重新啓動web服務器(Apache或Nginx的)

而且我同意我的同事,你應該url_encode你的JSON字符串。

從我的觀點來看,代碼應該是:

<?php 
ini_set('display_errors', '1'); 
error_reporting(E_ALL); 

$apiKey = '*apikey*'; 
$filters = '{"category":"Automotive","$loc":{"$within":{"$center":[[41,-74],80467.2]}},"website":{"$blank":false}}'; 
$params = '?api_key=' . $apiKey . '&filters=' . url_encode($filters); 

$url = 'http://api.factual.com/v2/tables/bi0eJZ/read'; 
$url .= $params; 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
$output = curl_exec($ch) or die("cURL Error" . curl_error($ch)); 
curl_close($ch); 

echo "out: " . $output; 

編輯:

另一種方法可以是使用PHP官方驅動程序用於事實API: Official PHP driver for the Factual API

它提供了一個Debug ModecURL Debug OutputException Debug Output

1

對於未來的好處:

  1. 使用urlencode查詢參數的過濾器參數 包含許多字符是不是安全/有效的URL

  2. 使用curl_getinfo()看到有關HTTP_CODE和 信息其他有用的信息。

0

的事實,腳本停止所有做任何事情,你可以發現它在這裏:

http://php.net/manual/en/function.set-time-limit.php

摘錄:

的set_time_limit()函數的功能和配置指令的max_execution_time隻影響腳本本身的執行時間。在確定腳本運行的最長時間時,不包括使用system()系統調用,流操作,數據庫查詢等腳本執行之外發生的任何活動時間。在測量時間是真實的Windows上,這不是事實。

所以基本上,捲曲阻止所有的PHP腳本,基本上是實際運行的唯一的事情是捲曲的,所以如果它永遠塊,你的網站會沒有反應,這就是爲什麼你需要使用超時......

作爲如何避免它,只需使用超時...