2011-09-04 85 views
3

我想在後臺運行一個特別昂貴的fql查詢,將結果記錄到數據庫,並在稍後檢索,而用戶不必等待每一步。如何在後臺運行fql請求? (通過php的異步API調用)

你能分享一個如何異步運行facebook請求的例子嗎?

main.php

$uid = $facebook->getUser(); 
if ($uid) { 
    try { 
     echo $user; 

     //////////////////////////////////////////////////////// 
     // Run lengthy query here, asynchronously (async.php) // 
     //////////////////////////////////////////////////////// 
     //             // 
     // For example: $profile = $facebook->api('/me');  // 
     // (I know this request doesn't take long, but  // 
     // if I can run it in the background, it'll do.  // 
     //             // 
     //////////////////////////////////////////////////////// 


    } catch (FacebookApiException $e) { 
     echo $e; 
    } 
} 

async.php

$profile = $facebook->api('/me'); 
$run = mysql_query("INSERT INTO table (id) VALUES (" . $profile['id'] . ");"; 

complete.php

echo getProfileId(); // assume function grabs id from db, as stored via async.php 
+0

我開始使用exec(),但我很難通過所有必需的參數來完成這個工作。相反,我最終會有一個全新的會話和一個未連接的Facebook對象。 – Ryan

回答

2

我的解決方案運行PHP在後臺工作只是讓腳本本身發出一個新的請求來執行實際的工作。

我之前使用的代碼如下,我不確定是否有更優雅的解決方案......但它在過去對我來說已經工作得不夠好了。我用fsock而不是file_get_contents()函數等原因當然是讓我不會有等待作業完成(這違背了目的)

$sock = fsockopen("127.0.0.1", 80); 
fwrite($sock, "GET /yourjoburl/ HTTP/1.1\r\n"); 
fwrite($sock, "Host: yourdomain.com\r\n"); 
fwrite($sock, "Connection: close\r\n"); 
fwrite($sock, "\r\n"); 
fflush($sock); 
fclose($sock); 

,那麼你就必須另腳本將結果和進度寫入數據庫或其他內容...還要記住,MySQL支持互斥鎖,這意味着您可以輕鬆地阻止多個作業同時運行......或者允許其他腳本等待作業完成。

PS。我個人避免使用exec和所有這些東西的原因是,它看起來像是一個麻煩,不同的服務器,不同的設置,不同的操作系統等等。這在所有允許你打開套接字的主機上都是一樣的。雖然您可能希望將私鑰添加到您在作業中驗證的請求中,或者檢查調用者的IP,以防止其他人啓動作業。

編輯:這是未經測試,但應該工作,如果你想轉發餅乾以及包括會話cookie。

$sock = fsockopen("127.0.0.1", 80); 
fwrite($sock, "GET /yourjoburl/ HTTP/1.1\r\n"); 
fwrite($sock, "Host: yourdomain.com\r\n"); 
fwrite($sock, "Cookie: " . $_SERVER['HTTP_COOKIE'] . "\r\n"); 
fwrite($sock, "Connection: close\r\n"); 
fwrite($sock, "\r\n"); 
fflush($sock); 
fclose($sock); 
+0

謝謝安德烈亞斯。這個策略是否保持同一個會話?如果沒有,你能推薦一種發送會話數組的方式嗎? – Ryan

+0

啊,它不會保持會話。我如何在我的後臺腳本中檢索同一個會話?通過phpsessid Cookie?我不清楚如何再次選擇該會話。 – Ryan

+0

@Ryan我用一段新的代碼更新了我的答案,這段代碼應該適合你。它目前轉發所有的cookies,但如果你想要,你可以把'PHPSESSID =「。$ _COOKIE ['PHPSESSID']。」'代替,它只會轉發會話cookie。 – Andreas