簡體   English   中英

Facebook圖形在PHP中極其緩慢

[英]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中配置一些東西?

我嘗試過的:

  • 使用PHP SDK。 這很慢。 我之所以嘗試首先使用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秒)開始,您可以看到保持活力有多大差異。

您的瀏覽器也使用這種技術,當然,在瀏覽器的新實例中加載頁面需要相當長的時間。

只想兩個想法:

  1. 您是否已驗證瀏覽器與Facebook沒有預先連接? 瀏覽器沒有緩存DNS查找(您可以嘗試將graph.facebook.net添加到您的hosts文件以管理/退出DNS)

  2. 你當然是在與你的瀏覽器相同的系統/環境中運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM