[英]Facebook graph extremely slow in PHP
無論是使用Facebook PHP SDK,還是僅使用帶有$contents = file_get_contents("https://graph.facebook.com/$id?access_token=$accessToken")
curl加載數據,響應時間大約需要一秒鍾來。
當我需要檢查一堆id的數據時,這非常慢。
在瀏覽器中,如果我輸入一個facebook圖形網址,我幾乎可以立即得到結果,在PHP的十分之一時間內。
是什么導致了這個問題,我怎樣才能像在任何瀏覽器中那樣快速地制作它? 我知道瀏覽器可以做到這一點。 必須有一種方法可以在PHP中快速實現它。
IDEA:也許我需要在cURL中配置一些東西?
我嘗試過的:
file_get_contents()
,是因為我希望PHP SDK配置不正確。 setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
。 它沒有任何區別。 在回答編輯之后:實際上,這與重復使用卷曲手柄一起使后續請求非常快。 編輯:這是我用來衡量執行請求所需時間的代碼的粘貼框: http : //pastebin.com/bEbuqq5g 。 我將過去常說微秒的文本更正為秒。 這就產生了類似於我在這個問題的評論中所寫的結果: Facebook圖形在PHP中非常慢 。 另請注意,即使訪問令牌已過期,它們也會采用類似的慢速時間,就像在我的pastebin示例中一樣。
編輯2:ssl應該有部分問題。 我嘗試了http://graph.facebook.com/4 (沒有httpS)的基准測試,它導致三個請求的1.2秒,而相同,但https花了2.2秒。 這絕不是一個解決方案,因為對於任何需要訪問令牌的請求,我必須使用https。
file_get_contents
在PHP中可能非常慢,因為它不能正確發送/處理標頭,導致在文件傳輸完成時HTTP連接無法正常關閉。 我也讀過有關DNS問題的內容,但我沒有任何相關信息。
我強烈建議的解決方案是使用PHP SDK,它用於對Facebook進行API調用,或者使用cURL (SDK使用)。 使用cURL,您可以真正配置請求的許多方面,因為它基本上是為了進行這樣的API調用而設計的。
PHP SDK信息: https : //developers.facebook.com/docs/reference/php/
PHP SDK源代碼: https : //github.com/facebook/facebook-php-sdk
如果您選擇在沒有SDK的情況下執行此操作,您可以查看他們如何在base_facebook.php中使用cURL。 這里有一些您可以使用cURL獲取的示例代碼:
function get_url($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, FALSE); // Return contents only
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // return results instead of outputting
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10) // Give up after connecting for 10 seconds
curl_setopt($ch, CURLOPT_TIMEOUT, 60); // Only execute 60s at most
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // Don't verify SSL cert
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
$contents = get_url("https://graph.facebook.com/$id?access_token=$accessToken");
該函數將在失敗時返回FALSE。
我看到你說你已經使用過PHP SDK,但也許你沒有設置cURL。 嘗試安裝或更新它,如果它似乎仍然很慢,你應該使用
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
並檢查輸出。
我想知道如果我在沒有執行curl_close()
情況下進行兩次后續curl_exec()
調用會發生什么,從而啟用HTTP Keep-Alive。
測試代碼:
$ch = curl_init('https://graph.facebook.com/xxx');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// FIRST REQUEST
curl_exec($ch);
print_r(curl_getinfo($ch));
// SECOND REQUEST
curl_exec($ch);
print_r(curl_getinfo($ch));
curl_close($ch);
下面是結果,顯示了curl_getinfo()
部分輸出:
// FIRST REQUEST
[total_time] => 0.976259
[namelookup_time] => 0.008271
[connect_time] => 0.208543
[pretransfer_time] => 0.715296
// SECOND REQUEST
[total_time] => 0.253083
[namelookup_time] => 3.7E-5
[connect_time] => 3.7E-5
[pretransfer_time] => 3.9E-5
第一個請求非常慢,幾乎整整一秒,與您的體驗相似。 但是從第二次請求(僅0.25秒)開始,您可以看到保持活力有多大差異。
您的瀏覽器也使用這種技術,當然,在瀏覽器的新實例中加載頁面需要相當長的時間。
只想兩個想法:
您是否已驗證瀏覽器與Facebook沒有預先連接? 瀏覽器沒有緩存DNS查找(您可以嘗試將graph.facebook.net添加到您的hosts文件以管理/退出DNS)
你當然是在與你的瀏覽器相同的系統/環境中運行php代碼(不是從vm運行,而不是從其他主機運行?還運行php與瀏覽器使用相同的調度priorties?(相同的級別等))
使Graph API調用“緩慢”的總體最大因素是 - HTTP連接。
通過調整一些參數或獲得具有更好連接的服務器,可能會有一些改進。
但這很可能沒什么大不同,因為HTTP通常被認為是“慢”,而且關於這一點幾乎沒有什么可做的。
當我需要檢查一堆id的數據時,這非常慢。
當然,最好的辦法是加快速度, 最大限度地減少HTTP請求的數量。
如果您必須連續執行多個Graph API調用,請嘗試將它們作為批處理請求執行 。 這允許您查詢多個數據部分,同時只發出一個 HTTP請求。
這純粹是一種推測,但原因可能是Facebook使用SPDY協議(不確定API是否屬實)。 PHP無法使用SPDY協議加載頁面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.