2012-01-21 31 views
3

我想在後臺運行一個PHP腳本來記錄訪問者信息(在用戶的頁面加載完畢後),這樣它就不會減慢用戶的速度。在後臺運行PHP腳本(不中斷用戶)?

從我發現,有幾個方法來實現這一目標,一個是發射popen命令,另一種是使用exec,最後我知道使用fsockopensource):

$socket = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10); 
if($socket) { 
    $socketdata = 「GET /background_script.php HTTP 1.1\r\nHost: 「.$_SERVER['HTTP_HOST'].」\r\nConnection: Close\r\n\r\n」; 
    fwrite($socket,$socketdata); 
    fclose($socket); 
} 

我的服務器不允許使用popenexec,使給我留下了fsockopen

這是最適合我的方法嗎?

感謝您的支持(:

編輯:

另一種可能的解決方案,我發現可能是發送Connection: close瀏覽器停止在客戶端的加載,然後include的。background_script

這是解決方案推薦

EG:

ob_start(); 
echo $OUTPUT_DATA; 
header("Content-Length: ".ob_get_length()); 
header('Connection: close'); 

ob_end_flush(); 
ob_flush(); 
flush(); 

//Do background visitor logging stuff here.. 
+0

沒有'fsockopen'在這裏不可用。它也會阻止執行。 – TimWolla

+1

這是一個「背景腳本」?在遠程終端返回數據之前,不會「關閉」呼叫阻塞嗎?順便說一句:更好的方法可能是將Javascript發送到執行分析的客戶端(例如Google Analytics腳本)。 – Borealid

+1

只輸出整個頁面,並在完成時調用['flush()'](http://php.net/manual/en/function.flush.php)。只要輸出已經發送到瀏覽器,它就應該被渲染,並且你以後做的任何事情都不會中斷用戶。這種方法的唯一缺點是頁面仍然顯示爲加載 - 但整個事情應該可用。 – DaveRandom

回答

1

你可以實現一個排隊的解決方案來滿足您的要求,這將工作是這樣的:在

  • PHP用戶功能

    1. 用戶日誌添加工作提高到一個「登錄」隊列
    2. 一個'永遠在線'PHP腳本(工作者)被分配到隊列中的工作
    3. 工作在後臺完成

    這種方法稍微先進一些,因爲你必須引入一個隊列管理器和php守護進程來處理這個工作,但是它在完成時效果很好。

    我建議您閱讀'Gearman'上的some docs,它具有built-in php用戶功能。

  • +0

    謝謝你的建議,但我認爲一個「永遠在線」的腳本對於我的需求來說可能是過度的(並且被我的主人所不喜歡的)。但是這個解決方案對未來的參考 – 92Jacko

    +0

    可能是有用的。你在哪裏存儲用戶信息,當用戶登錄時和你想要運行後臺腳本? –

    +0

    沒有這樣的「登錄」過程,只是一個「訪問者」請求一個'.json.php'文件。 (一旦用戶加載_dynamic json文件_,我將讓PHP加載用戶需要的所有數據,然後將包含訪問者數據的變量傳遞給「後臺」腳本,然後該腳本將數據存儲在數據庫中)。訪問者數據的日誌記錄純粹是爲了統計目的(: – 92Jacko