2012-05-01 75 views
1

好吧,我想創建一個iPhone應用程序與WEB服務進行通信。但有2點對我來說並不清楚。iOS和PHP之間的通信(Web)服務問題

  1. 當用戶按壓在該應用的按鈕,它通知動作的web服務和web服務發送推送通知給相應的用戶。由於沒有。要發送通知的用戶可能很大,我正在考慮向iPhone應用發送回覆(確定/錯誤),然後繼續發送通知。換句話說,PHP腳本應該接受請求,響應並在響應之後繼續發送通知,以便iPhone應用程序不必等待該服務。

  2. 該服務將需要發送推送通知給很多用戶。我正在用PHP編寫Web服務。那麼是否有更有效的PHP替代品?或者它是實施該服務的最佳方式?

謝謝。

回答

1

我假設關鍵問題是您要立即響應用戶,然後執行其他工作,例如異步發送通知。

我會建議使用某種類型的排隊系統,如Gearman(雖然有很多替代品,如兔子)。你可以讓你的界面把工作放到Gearman Queue中,然後編寫一個Gearman Worker來從隊列中獲取通知任務

你可以在PHP中完成這種工作,但是如果你這樣做,那麼你可能想要使用Gearman Manager PHP庫,因爲PHP不是長期運行流程的最佳語言。 Gearman Manager爲您啓動和停止腳本,並使用PHP編寫工作程序變得更加輕鬆。

http://gearman.org/?id=gearman_php_extension https://github.com/brianlmoon/GearmanManager

+0

感謝您的信息。所以根據Gearman的說法,我應該編寫一個接受請求的PHP腳本,將繁重的工作傳遞給Gearman Job Server(不會在PHP中)並返回響應。這樣的應用程序不會等待響應..是嗎? 我正在使用的數據庫是MySQL,我不太確定,如果我知道一種語言,可以很好地處理MySQL數據庫,併發送推送通知從數據庫中存在的令牌 – proctr

+0

您是正確的,但你可以使用PHP來寫工人。我將更新答案,以澄清 –

1
  1. 聽起來像一個聰明的主意。發送響應並繼續處理同一線程中的通知,或排隊作業以在服務器上執行通知。

  2. 有很多人在討論不同語言的優點來執行Web服務。如果你對PHP最滿意並且性能要求不是很高,那可能是你最好的選擇。

+0

腳本將需要同時迎合多個用戶,所以我不認爲我會在主線程上執行它。在Gearman的幫助下排隊工作? – proctr

+0

http://stackoverflow.com/questions/7077782/alternative-for-zend-job-queue,http://stackoverflow.com/questions/3513112/asynchronous-processing-with-php-one-worker-per-job ,http://www.syndicatetheory.com/labs/thinking-asynchronously-in-php – erikxiv

2

好了#1,你可以做這樣的事情...

有一個方法,在手機應用程式,例如:

- (void) send_to_server { 
    NSString *urlString = [NSString stringWithFormat:@"http://weburl.com/?variable=%@", variable]; 

    NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

    if (theConnection) { 
     receivedData = [NSMutableData data]; 

     if ([[NSString stringWithFormat:@"%@", receivedData] isEqualToString:@"Success"]){ 
      //Do something here 
     }else{ 
      //Do something else here 
     } 
    } 
} 

在你的PHP,你可以這樣做:

<?php 
$variable = $_GET['variable']; 
//do what you need to do here... 
//Put things into queue or what-not 
if ($success){ 
    echo "Success"; 
}else{ 
    echo "Failure"; 
} 
?> 

更新

<?php 
if (isset($_GET['variable']){ 
    echo "Success"; 
    $variable = $_GET['variable']; 
    //do what you need to do here... 
}else{ 
    echo "Failure"; 
} 
?> 

至於發送推送通知到其他手機,我不知道該怎麼做。但我會認爲PHP不會有效率問題。

+0

所以,如果我把東西放在上面寫的PHP腳本的隊列中,iPhone應用程序不必等待它獲得爲了得到SUCCESS?大部分是 – proctr

+0

。如果你只是想在它們打開頁面時立即發回成功消息,那麼我會檢查變量以確保它有一個值,然後返回成功或失敗,然後處理剩下的部分。我會改變我的例子來證明這一點。 – James