簡體   English   中英

500發送大量推送通知時出錯,PHP?

[英]500 Error when sending a lot of push notifications, PHP?

我正在使用以下代碼循環瀏覽包含ios應用程序收集的設備ID的數據庫。 在大約300條左右的通知中,我的服務器死於500條錯誤。 有什么想法可以更有效地做到這一點嗎? 我在共享服務器上; 我唯一的選擇是在專用計算機上進行設置嗎?

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(!@fwrite($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

我建議您刪除@符號。 !@fwrite應該避免。 如果失敗或連接斷開, fwrite將返回FALSE,這正是您需要了解的內容。 提醒:一旦出現任何錯誤,Apple都會斷開連接。

問題:

  1. 如果fwrite失敗,則您有正確的主意:關閉套接字,重新打開,然后重試; 除了如果您發送無效的令牌,Apple可以關閉連接(通常由於多種原因)。 因此,您不應重試相同的令牌,而應繼續下一個令牌。

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

如果使用二進制接口(這是Apple現在推薦的接口),則實際上可以從Apple獲得確切的錯誤通知。 您可以在此處閱讀更多有關此內容的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM