2011-08-01 35 views
1

我有一個php腳本,它接受的答案描述爲here異步請求不工作使用fsock-php,nginx,

它不工作,除非我添加以下之前fclose($fp)

while (!feof($fp)) { 
     $httpResponse .= fgets($fp, 128); 
    } 

即使是一個空白循環將做的工作,而不是上面的!

但是什麼意思?我想異步調用:(

要添加到我的痛苦,同樣的代碼運行正常,而不在Apache驅動的環境上面的代碼片斷。

任何人都知道,如果有這樣的問題的Nginx或PHP-FPM ?請求

+0

我不知道,PHP有異步支持。 – Zaffy

+0

不,它沒有。我想要開始一個腳本,而不是等待它的響應或完成。 – Shrinath

+0

嘗試發送請求,不要關閉它,並且不讀取其響應 – Zaffy

回答

0

什麼你要找只能在Linux風味系統完成了一個PHP版本,其中包括過程控制功能(PCNTL庫)

你會發現它的文檔在這裏: http://php.net/manual/en/book.pcntl.php

具體來說,你想要做的是「分叉」一個過程。這會創建一個包含所有內存引用的當前PHP腳本進程的相同副本,然後允許這兩個腳本同時繼續執行。

「父」腳本知道它仍然是主腳本。而且,「孩子」腳本(或腳本,你可以根據需要多次執行此操作)知道這是一個孩子。這允許您在孩子脫離並轉變爲守護進程後爲父母和孩子選擇不同的操作。

要做到這一點,你會使用的東西沿着這些路線:

$pid = pcntl_fork(); //store the process ID of the child when the script forks 
if ($pid == -1) { 
    die('could not fork'); // -1 return value means the process could not fork properly 
} else if ($pid) { 
    // a process ID will only be set in the parent script. this is the main script that can output to the user's browser 
} else { 
    // this is the child script executing. Any output from this script will NOT reach the user's browser 
} 

這將使腳本分拆一個子進程能夠繼續沿着側執行(或很久以後)父腳本輸出它的內容和退出。

您應該記住,這些函數必須編譯到您的PHP版本中,並且絕大多數託管公司都不允許在他們的服務器上訪問它們。爲了使用這些功能,您通常需要擁有虛擬專用服務器(VPS)或專用服務器。即使雲主機設置通常會提供這些功能,如果使用不正確(或惡意)他們可以很容易地引起服務器的膝蓋。