2012-09-04 88 views
0

我有一個php腳本,它負責從我的iPhone應用程序讀取一些請求參數。一旦我做了一些操作,我將它們保存在數據庫中,並需要使用Apple APNS發送一些推送通知消息。所以目前它在代碼中完成了這樣的工作。在後臺運行php代碼塊

<?php 
    $param1 = $_POST['param1']; 
    $param2 = $_POST['param2']; 

    //saving part here 

    //push notifications 
    $pushService = new PushService(); 
    $pushService -> init(); 
    $pushService -> push($param1, $param2); 

    //json response 
    echo json_encode(array($success, $dbsavedid); 
?> 

問題發生在推動部分。現在,這個推送通知代碼塊需要很長時間才能執行,因爲該表的數據量很大。因此,iPhone應用程序等待太久才能執行(以獲得對iPhone的成功響應)。

因此,有什麼辦法可以使這個推動部分異步,並使用回聲給iPhone端發送響應,而不是使用單獨的腳本進行推送通知?另外請注意,我需要從保存的記錄以及iPhone端獲取一些數據。所以我需要輸出到iPhone端。

+0

我們在該表中討論了多少記錄?如果它不是數百萬和數百萬,那麼你可能會遇到一些嚴重的模式設計問題。 什麼是「漫長的時間」?我們是在談論幾十秒,還是根據您的需求,超過500毫秒被認爲是很長的? –

+0

這需要時間,因爲連接到APNS併發送通知需要時間。大約有100-1000條記錄,現在需要5-10分鐘才能得到響應。它起初工作完美,但隨着記錄數量的增加,它降低了速度。 http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html – Dilshan

+1

5-10分鐘????我認爲在後臺運行該代碼隱藏了真正的問題:錯誤的代碼/數據結構。當然,你可以在後臺運行代碼,並且它會工作得很好,直到你將服務器上的這樣一個負載整個東西剛剛崩潰的那一刻...... –

回答

0

造成這種情況的原因實際是,我的服務器提供商已阻止端口2195和由Apple APNS端口2196。我相信,一旦你允許,這將是固定的,應該像早些時候一樣工作。

1

例如,您可以強制PHP通過使用flush()函數發送響應。 (也可能有其他的可能性) 所以當你的數據庫操作完成時(這些應該是非常快的,如果你有100-1000條記錄),並且在調用flush ()函數。你的客戶應該馬上得到答覆。

另請參閱關於flush()本身的鏈接,因爲您的環境中可能有其他參數會阻止您的響應儘快到達客戶端。 http://php.net/manual/en/function.flush.php

<?php 
$param1 = $_POST['param1']; 
$param2 = $_POST['param2']; 

//saving part here 

//json response 
echo json_encode(array($success, $dbsavedid); 

//response should be sent right away, no need for wait on the pushservice operations 
flush(); 

//push notifications 
$pushService = new PushService(); 
$pushService -> init(); 
$pushService -> push($param1, $param2); 

?>

+0

我確實嘗試了在保存部分之後立即使用ob_flush()和flush(),並在此之後添加了json響應。因此它假設打印輸出並開始推送通知。但它不適合我。它假設爲瀏覽器工作,但不適合我的場景。這就是爲什麼我特別添加基於iPhone的這個問題。可能是因爲iPhone保持與服務器的持續交互並等待服務器完成它。 – Dilshan

+1

Yepp,應該可以在客戶端或服務器端配置它以在發生刷新後接收響應。你在客戶端使用NSURLConnection還是其他的東西? –

+0

我正在使用ASIHttpRequest。這是3年前開發的一款舊應用。 – Dilshan