2013-10-04 199 views
0

我正在使用以下代碼循環訪問包含我的ios應用程序收集的設備ID的數據庫。在300左右的通知我的服務器凍結在500錯誤。任何想法如何能更有效地做到這一點?我在共享服務器上;我唯一的選擇是將其設置在專用機器上嗎?500發送大量推送通知時發生錯誤,PHP?

php.ini中有以下組 -

set_time_limit = 999999999 
max_execution_time = 999999999 
memory_limit = 512M 

下面的代碼 -

if(isset($_POST['pushNotify'])){ /// PROCESS PUSH NOTIFICATION TO LAST 120 DAYS OF ACTIVE USERS 
$message = stripslashes(strip_tags(trim($_POST['message']))); 

mysql_connect("URL", "USER", "PASS") or die(mysql_error()); 
mysql_select_db("DATABASE") or die(mysql_error()); 
$cutoff = time() - (60*60*24*120); 
$result = mysql_query("SELECT * FROM devices WHERE timestamp > '$cutoff' ORDER BY timestamp DESC"); 
$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', '../certs/distck.pem'); 
stream_context_set_option($ctx, 'ssl', 'passphrase', 'password'); 
$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 

while($row = mysql_fetch_array($result)) 
    { 
    if(strlen(trim($row['deviceid']))>25){ 
    $devid = str_replace("-", "", trim($row['deviceid'])); 
    $payload = '{ 
        "aps" : 

         { "alert" : "'.$message.'", 
          "badge" : 0, 
          "sound" : "bingbong.aiff" 
         } 
       }'; 


    $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $devid)) . pack  ("n",strlen($payload)) . $payload; 
    if([email protected]($fp, $msg)){ 
     @fclose($fp); 
     $fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 
     @fwrite($fp, $msg); 
     } 
    } 
    @fclose($fp); 

} /// END PUSH NOTIFY 

回答

1

我建議你刪除@符號。 !@fwrite應該避免。 fwrite如果失敗或連接斷開,則返回FALSE,這正是您需要知道的。提醒:Apple出現任何錯誤後立即斷開連接。

問題:

  1. 如果FWRITE失敗,你有正確的觀念:關閉套接字,重新打開, 再次嘗試;除非Apple發送 無效令牌(由於許多原因經常出現這種情況)可以關閉連接。因此,你 不應該重試相同的標記,而是繼續前進到下一個標記。

  2. 如果fwrite第二次失敗(在您的重試條件中),您不會捕獲錯誤,並且此時您沒有打開可能會解釋您的500錯誤的套接字。考慮重新編寫這個邏輯,在繼續之前重試N次。

如果您使用二進制界面(這是蘋果現在推薦的),您實際上可以從Apple獲得確切的錯誤通知。你可以閱讀更多關於here

+0

啊!你是對的,在進入下一個ID之前,我應該循環3-4次。我的邏輯是有缺陷的,因爲我認爲傳輸失敗的唯一原因是超時。將同一個壞標記打入地面肯定會造成無限循環。好決定。 – user1145643

相關問題