3

開発証明書で完全に機能する次のコンテンツを含む PHP ファイルがありますが、本番証明書に切り替えると PHP エラーが発生し、以下のメッセージが表示されますが、これは約 50% の確率でしか行われません。残りの 50% は機能します。なぜこれが起こっているのか誰にも分かりますか?

<?php
// masked for security reason 
$deviceToken = 'xxxxxx'; // jq

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', dirname(__FILE__)."/prod.pem");

$number = 5;

$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
  print "Failed to connect $err $errstr\n";
}
else {
  print "Connection OK\n";
  $msg = $_GET['msg'];
    $payload['aps'] = array('alert' => $msg, 'badge' => 1, 'sound' => 'default');
    $payload = json_encode($payload);

  $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
  print "sending message :" . $payload . "\n";
  fwrite($fp, $msg);
  fclose($fp);
}
?>

PHP エラー:

警告: stream_socket_client() [function.stream-socket-client]: ローカル証明書チェーン ファイル `/var/www/vhosts/thissite.com/httpdocs/prod.pem' を設定できません。/var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php の 19 行目に、cafile/capath 設定に証明書とその発行者の詳細が含まれていることを確認します。

警告: stream_socket_client() [function.stream-socket-client]: 19 行目の /var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php で SSL ハンドルの作成に失敗しました

警告: stream_socket_client() [function.stream-socket-client]: 19 行目の /var/www/vhosts/thissite.com/httpdocs/pushMessageLive.php で暗号化を有効にできませんでした

警告: stream_socket_client() [function.stream-socket-client]: /var/www/vhosts/thissite.com/ の ssl://gateway.sandbox.push.apple.com:2195 (未知のエラー) に接続できませんhttpdocs/pushMessageLive.php 行 19 接続に失敗しました 0

4

4 に答える 4

3

同じ問題がありました。Apple の Push Notification Server との永続的なソケット接続を確立する必要があります。pyapns ( http://github.com/samuraisam/pyapns )と呼ばれる python デーモンのチュートリアルを作成しました。これは私にとって非常にうまく機能しました。

http://www.how2s.org/index.php/How_to_get_started_with_Apple_Push_Notifications_for_iPhone_or_iPhone_Touch

これは、Debian を実行していて、必要なパッケージ (python-twisted、libcurl4-openssl-dev など) をインストールするためのルート アクセス権があると仮定して機能します。

于 2010-05-30T23:17:03.320 に答える
1

接続数が多すぎるようです。Apple のドキュメントには、接続を開いたままにして、同時にできるだけ多くの送信を行う必要があると記載されています。再度開くことは DOS 攻撃と見なされます。したがって、永続化して、同じエラーが発生するかどうかを確認してください。

于 2010-05-10T21:00:49.383 に答える
0

発生しているエラーがプッシュ サーバーへの接続が多すぎるためかどうかはわかりません...私の経験では、これらの制限に到達するのは少し困難です。

しかし一方で、プッシュ通知のバッチを送信しようとすると、PHP の動作がおかしくなりました。サンプルコードからはわかりませんが、メッセージごとにstream_socket_client()andを実行すると思いますか? fclose()PHPのSSLソケットでそのテクニックを使用して、私が個人的に達成した唯一のことは失敗です...

サーバーで Ruby を実行できるかどうかはわかりませんが、可能であれば、Apple のサーバーとの対話を処理するためにruby​​-apns-daemonに切り替えることをお勧めします。これは軽量で、PHP での実装が簡単です (実際には同じペイロード JSON を作成しますが、ソケットを介してではなく ruby​​-apns-daemon に送信します)。

于 2010-05-12T16:14:33.190 に答える
0

私は同じ問題を抱えており、証明書に問題がありました。ここで解決策を見ることができますHow can I do an SSL connection with PHPと ここError using ssl cert with PHP .

それがあなたを助けることを願っています。

また、記録のために、APNS との永続的な接続を確立する義務はありません。一度にすべてのメッセージを送信するのが最善ですが、複数回接続して切断することもできます。Appleのウェブサイトを引用します:

また、複数の通知にわたって APNs との接続を維持する必要があります。APNs は、迅速かつ繰り返し確立され、切断される接続をサービス拒否攻撃と見なす場合があります。エラーが発生すると、APNs はエラーが発生した接続を閉じます。

一度に数百の接続を作成しなければ、問題は発生しません。

于 2010-06-09T08:03:23.633 に答える