2011-09-22 57 views
1

我有一個用PHP編寫的Web應用程序,它可以連接iPhone應用程序。當應用程序調用服務時,會向Apple的APN服務器發送一系列通知消息,以便它可以嚮應用程序的其他用戶發送推送通知。PHP web服務,在腳本執行結束前發送響應

這個過程在某些情況下可能很耗時,而且我的應用在獲得響應之前必須等待很長時間。響應完全獨立於發送到APN服務器的通知消息的結果。

因此,我希望Web服務將響應發送迴應用程序,而不管發送給APN的消息是否已發送。

我試着用pcntl_fork來解決這個問題:

<?php 
... 
$pid = pcntl_fork(); 
if($pid == -1) 
{ 
    // Could not fork (send response anyway) 
    echo "response"; 
} 
else if($pid) 
{ 
    // Parent process - send response to app 
    echo "response"; 
} 
else 
{ 
    // Child process - send messages to APNs then die 
    sendMessageAPNs($token_array); 
    die(); 
} 
?> // end of script 

不幸的是,父進程似乎等待子進程來發送,即使我沒有在父進程使用pcntl_wait響應之前結束。我做錯了什麼或者這是正常的行爲?如果這是正常的,那麼還有另一種方法可以解決這個問題嗎?

謝謝!

回答

0

如果你託管在Apache中的PHP程序,那麼你真的不應該這樣做:看this該說的部分* 過程控制不應該在Web服務器環境中啓用,如果在Web服務器環境中使用任何過程控制功能,可能會發生意外的結果。 *

您應該根據您選擇的首選語言設置單獨的守護進程,並將APNS通信任務關閉。如果你真的真的必須嘗試使用​​ob_flush()

+0

我試過ob_flush()後跟一個flush(),因爲它似乎前者不足以保證響應被髮送。不幸的是,這也在響應中發送了關於PHP後端的信息。守護進程方法可能是最好的方法,但我沒有時間去實現它,因此我從應用程序向另一個Web服務發送了第二個請求,以分別處理通知。 – rickholt

0

我認爲你可以在做「長」過程之前發送迴應。看看PHP的flush()功能,它會幫助也許

相關問題