php - 发送大量推送通知时出现 500 错误,PHP?

标签 php ios apple-push-notifications apns-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

最佳答案

我建议您删除@符号。应避免 !@fwritefwrite如果失败或者连接被切断,则返回 FALSE,这正是您需要知道的。提醒:一旦出现任何错误,Apple 就会中断连接。

问题:

  1. 如果 fwrite 失败,您的想法是正确的:关闭套接字,重新打开, 再试一次;但如果您发送一个消息,Apple 可以关闭连接 无效 token (由于多种原因经常出现这种情况)。因此,你 不应重试相同的 token ,而应继续进行下一个 token 。

  2. 如果 fwrite 第二次失败(在重试条件下),您不会捕获该错误,并且此时您没有打开任何套接字,这可能会解释您的 500 错误。考虑重新编写逻辑,在继续之前重试 N 次。

如果您使用二进制接口(interface)(这是Apple现在推荐的),您实际上可以从Apple获得准确的错误通知。您可以阅读更多相关信息 here .

关于php - 发送大量推送通知时出现 500 错误,PHP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19183760/

相关文章:

php - 如何将存储在 sql 数据库中的最后一个条目的数据作为 php/html 中的输出

php - 使用 php 创建像 twitter 或 convore 这样的提及

php - 尝试在 PHP 中使用 XBase 库时找不到类错误

php - 使用 .p8 文件在 php 中发送 iOS 推送通知

php - 如何为更新查询设置条件

css - 摆脱 iOS 网络应用程序中的放大镜

jquery - 有没有办法使用桌面浏览器测试我的网站在移动设备上的行为和外观?

ios - 如何检查解析 Xcode 中获取的用户名

ios - APNS aps-环境-Testflight版本的权利/App的生产版本

ios - codeigniter - 连接失败 : 0 while sending ios notifications