发送大量的推送通知,PHP错误500?

我使用下面的代码来遍历包含我的ios应用程序收集的设备ID的数据库。 在大约300左右的通知我的服务器冻结500错误。 任何想法如何能更有效地做到这一点? 我在共享服务器上; 我唯一的select是将其设置在专用机器上吗?

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 

我会build议你删除@符号。 @fwrite应该被避免。 如果fwrite失败或连接断开,那么fwrite将返回FALSE,这正是您需要知道的。 提醒:苹果一旦出现任何错误就会断开连接。

问题:

  1. 如果一个fwrite失败,你有正确的想法:closures套接字,重新打开,再试一次; 除非苹果可以closures连接,如果你发送一个无效的令牌(往往是这样,原因很多)。 因此,你不应该重试同样的道理,而是继续前进到下一个。

  2. 如果fwrite第二次失败(在你的重试条件下),你不会发现错误,并且在那一刻你没有打开套接字,这可能会解释你的500错误。 在继续之前考虑重写N次的逻辑。

如果您使用二进制界面(这是苹果现在推荐的),那么您实际上可以从苹果获得确切的错误通知。 你可以在这里阅读更多。