2008-09-23 87 views
6

假設有兩個腳本Requester.php和Provider.php,並且請求者需要從提供者處理並向其發出http請求(Provider.php?data =「數據」)。在這種情況下,提供者很快找到答案,但要維護系統必須在整個數據庫中執行各種更新。是否有辦法立即將值返回給Requester,然後繼續在Provider中處理。PHP:如何將信息返回到等待腳本並繼續處理

的僞代碼

Provider.php 
{ 
    $answer = getAnswer($_GET['data']); 
    echo $answer; 
    //SIGNAL TO REQUESTER THAT WE ARE FINISHED 
    processDBUpdates(); 
    return; 
} 

回答

1

你基本上要1個信號處理(返回到原來的Requester.php)的結束和產生新的進程(完Provider.php)。可能有一種更優雅的方式來解決這個問題,但我已經用幾種不同的方式來管理這個。他們基本上都會導致執行一個命令,以便關閉第二個進程。

添加以下> /dev/null 2>&1 &到命令的結尾將允許它在後臺不會抑制當前的腳本的實際執行運行

像下面的內容可能會爲你工作:

exec("wget -O - \"$url\" > /dev/null 2>&1 &"); 

- 儘管您也可以將它作爲命令行PHP進程來執行。

您還可以保存需要處理的信息,並在cron作業上處理剩餘的處理,從而無需執行即可重新創建相同類型的功能。

2

可以刷新與沖洗()命令的輸出緩衝器。
閱讀在PHP manual評論更多信息

0

斯普利特提供兩種:ProviderCoreProviderInterface。在ProviderInterface中,只需執行「快速且簡單」的部分,還可以在數據庫中保存最近請求尚未處理的標誌。運行ProviderCore作爲cron作業,搜索該標誌並完成處理。如果無事可做,ProviderCore將終止並在2分鐘內(例如)重試。

1

我認爲你需要在提供者上發送數據(一定要刷新),然後在請求者上使用fopen/fread讀取預期的數據量,這樣你就可以把連接放到提供商並繼續。如果您沒有指定大量的數據,我會認爲請求者會坐在那裏等待提供程序關閉連接,這可能直到運行結束纔會發生(即所有的輔助工作密集型任務完成)。你需要嘗試幾個POC的..

祝你好運。

2

我使用this code在後臺運行進程(在Linux上運行)。

該進程將其輸出重定向到文件。

這樣,如果我需要在進程上顯示狀態,只需編寫少量代碼即可讀取並顯示輸出文件的內容。

我喜歡這種方式,因爲這意味着您可以完全關閉瀏覽器,稍後再回來查看狀態。

0

我在這裏出去走走,但也許你應該嘗試cURL或使用套接字來更新請求者?

0

你可以使用pcntl_fork()

Provider.php 
{ 
    // Fork process 
    $pid = pcntl_fork(); 

    // You are now running both a daemon process and the parent process 
    // through the rest of the code below 

    if ($pid > 0) { 
     // PARENT Process 
     $answer = getAnswer($_GET['data']); 
     echo $answer;  
     //SIGNAL TO REQUESTER THAT WE ARE FINISHED 
     return; 
    } 

    if ($pid == 0) { 
     // DAEMON Process 
     processDBUpdates(); 
     return; 
    } 

    // If you get here the daemon process failed to start 
    handleDaemonErrorCondition(); 
    return; 

} 
啓動另一個PHP程序中Provider.php