phpコードを使用してiOSやその他のデバイスのプッシュ情報機能を実装するにはどうすればよいですか?
プッシュ情報を受信する必要がある端末は6万台から10万台になる場合があり、一度実行することで複数の端末が情報を受信できるようになります。
通りすがりの人は誰でも、役立つ提案をしてくれるでしょう、ありがとう! ! !
これをphpで実装するのは簡単ではありません。
メッセージが送信されてユーザーに返されるまで接続を維持するために長時間接続を使用することは絶対にお勧めできません。この場合、サーバーに大きな負荷がかかることになります。
この機能を実装するには、ハートビートを使用することをお勧めします。クライアントのブラウザは、サーバーから最新のニュースを定期的に取得します。
また、バックグラウンドを実装するのが python、nodejs、c++ など、PHP ではない場合は、ロングポーリングを使用できます。
これを php を使用して実装するのは簡単ではありません。
ユーザーにメッセージが返されるまで接続を維持するために長時間接続を使用することは絶対にお勧めできません。この場合、サーバーに大きな負荷がかかることになります。
この機能を実装するには、ハートビートを使用することをお勧めします。クライアントのブラウザは、サーバーから最新のニュースを定期的に取得します。
また、バックグラウンドを実装するのが python、nodejs、c++ など、PHP ではない場合は、ロングポーリングを使用できます。
これはphpでできることではありません!
php はサーバー側のスクリプトであり、サーバーではなく、ましてやネットワーク オペレーティング システムでもありません
目標を達成するには、モバイル通信オペレーティング システムを適用するだけで済みます
自分でモバイル バージョンに移動するには、ソース コードが必要です-> iPhone さん、たまたま必要な投稿を投稿したフォーラムの友人がいました
実際にその方法を説明します。主なことは、Apple 開発アカウントを使用して証明書を生成することです。 。
ステップ 1
------------
まず、PHP を使用してサーバー側のインターフェイスを開き、それを iPhone に提供して device_token、つまり電話をアプリケーションに登録する必要があります。インストールされている場合は、このインターフェイスに http リクエストを送信し、各マシンの device_token といくつかのパラメーターを送信します。その後、php を使用してそれを受信し、データベースに保存します
ステップ 2
--------- --
phpを使ってデータを読み込み、データベースから登録されているdevice_tokenを指定形式の文字列につなぎ、生成されたApple証明書を持ってきて、Appleが提供するプッシュサービスAPIにソケットリクエストを行います
Keyコード 1:
stream_context_set_option($ctx, 'ssl', 'local_cert', $pemFile);//$pemFile为证书文件,这个你自己上网找找生成步骤,你必须得有个apple开发帐号$ctx = stream_context_create();stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server,推送服务api,以下是沙箱环境$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
// Create the payload body $body['aps'] = array( 'alert' => array( 'body' => $message, //'action-loc-key' => 'Bango App', ), 'badge' => $badge, 'sound' => 'oven.caf', ); $deviceTokens = array(); $payload = FMFactory::GetJson()->encode($body); $regs = FMFactory::GetQuery()->from("mobile_pn_register as m","m.*") ->where("m.mobiletype='ios' and m.registered_app_id='{$app_record_id}'") ->query(); if(!count($regs)) { throw new Exception(MOBILE_NOT_REGISTER_PUSH_NOTIFICATION_YET); } //根据协议生成请求串 foreach((array)$regs as $reg) { $msg = chr(0) . pack('n', 32) . pack('H*', $reg['devicetoken']) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); }
キー コード 1 のコピーにエラーがあります。 はい、次のようになります
$passphrase = '';$ctx = stream_context_create();stream_context_set_option($ctx, 'ssl', 'local_cert', $pemFile);stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);// Open a connection to the APNS server,推送服务api,以下是沙箱环境$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
php はメールを送信しますか?押す?
ソースコードが必要な場合は、自分でモバイルバージョンにアクセスしてください ->iphone、フォーラムの友人がたまたま必要なものを投稿していました
私がそれをどうやってやったかも教えてください、それは実際には非常に簡単で、主に Apple Where を使用して開発されましたアカウント証明書を作成するには?
ステップ 1
------------
まず、PHP を使用してサーバー側のインターフェイスを開き、それを iPhone に提供して device_token、つまり電話をアプリケーションに登録する必要があります。インストールされている場合は、このインターフェイスに http リクエストを送信し、各マシンの device_token といくつかのパラメーターを送信します。その後、php を使用してそれを受信し、データベースに保存します
ステップ 2
--------- --
phpを使ってデータベースからデータを読み込み、登録されているdevice_tokenを指定形式の文字列につなぎ、生成されたApple証明書を持ってきて、Appleが提供するプッシュサービスAPIにソケットリクエストを行います
Keyコード 1:
stream_context_set_option($ctx, 'ssl', 'local_cert', $pemFile);//$pemFile为证书文件,这个你自己上网找找生成步骤,你必须得有个apple开发帐号$ctx = stream_context_create();stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); // Open a connection to the APNS server,推送服务api,以下是沙箱环境$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
// Create the payload body $body['aps'] = array( 'alert' => array( 'body' => $message, //'action-loc-key' => 'Bango App', ), 'badge' => $badge, 'sound' => 'oven.caf', ); $deviceTokens = array(); $payload = FMFactory::GetJson()->encode($body); $regs = FMFactory::GetQuery()->from("mobile_pn_register as m","m.*") ->where("m.mobiletype='ios' and m.registered_app_id='{$app_record_id}'") ->query(); if(!count($regs)) { throw new Exception(MOBILE_NOT_REGISTER_PUSH_NOTIFICATION_YET); } //根据协议生成请求串 foreach((array)$regs as $reg) { $msg = chr(0) . pack('n', 32) . pack('H*', $reg['devicetoken']) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); }
php でメールを送信しますか?押す?
これは IOS プッシュです次に、送信するために複数の php プロセスを開いて、それぞれが 10,000 項目を送信できます。
次に、送信するために複数の php プロセスを開いて、それぞれが 10,000 項目を送信できます。
プロセスを開始するにはどうすればよいですか?書き方?
次に、送信する複数の php プロセスを開いて、それぞれが 10,000 項目を送信できます。
那你可以开几个php进程发送嘛,一个发送1w条。
如果是linux下跑的php可以用pcntl_fork跑几个子进程运行下看看。
cronjob也可以,不过需要数据库做些设计,意思是每隔一段时间,检查有无要发送的信息,和群发邮件一个道理
不过我觉得20000条45分钟还行吧,10万条怎么会用到1天。。也得看你们服务器连接apple api的速度如何啊。
丢包问题是个大问题,我这边还没远远到往20000台发送这种规模,也没遇到过
这里有个问题
http://stackoverflow.com/questions/12708486/send-push-notification-to-multiple-devices-apns-response-is-negative-after-a-wh
也是丢包问题,貌似是苹果那边认为你的socket连接不活跃,会关闭连接,所以这边的代码是不是有个重连的机制,这个要靠你自己去想了。
如果是linux下跑的php可以用pcntl_fork跑几个子进程运行下看看。
cronjob也可以,不过需要数据库做些设计,意思是每隔一段时间,检查有无要发送的信息,和群发邮件一个道理
不过我觉得20000条45分钟还行吧,10万条怎么会用到1天。。也得看你们服务器连接apple api的速度如何啊。
丢包问题是个大问题,我这边还没远远到往20000台发送这种规模,也没遇到过
这里有个问题
http://stackoverflow.com/questions/12708486/send-push-notification-to-multiple-devices-apns-response-is-negative-after-a-wh
也是丢包问题,貌似是苹果那边认为你的socket连接不活跃,会关闭连接,所以这边的代码是不是有个重连的机制,这个要靠你自己去想了。
foreach((array)$regs as $reg) { $msg = chr(0) . pack('n', 32) . pack('H*', $reg['devicetoken']) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); }
可以试下这样
while(true){ $j = count($regs); for($i=0;$i<$j;) { $msg = chr(0) . pack('n', 32) . pack('H*', $reg[$i]['devicetoken']) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if(!$result) {//发送失败,socket 重连 $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); } else { $i++; } } break;}
汗,编辑不了帖子真是麻烦。
while(true){ $j = count($regs); for($i=0;$i<$j;) { $msg = chr(0) . pack('n', 32) . pack('H*', $reg[$i]['devicetoken']) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if(!$result) {//发送失败,socket 重连 $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); } else { $i++; } } break; }
汗,编辑不了帖子真是麻烦。
while(true){ $j = count($regs); for($i=0;$i<$j;) { $msg = chr(0) . pack('n', 32) . pack('H*', $reg[$i]['devicetoken']) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if(!$result) {//发送失败,socket 重连 $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); } else { $i++; } } break; }
if(!$result) {//发送失败,socket 重连 $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); }
ApnsPHP-master
搜下这个吧,我用这个写过,一次推1万,crontab定时发送的,好像没遇到什么情况
我传到linux服务器上测试了,貌似$ctx = stream_context_create();不好用啊。怎么回事?
汗,编辑不了帖子真是麻烦。
while(true){ $j = count($regs); for($i=0;$i<$j;) { $msg = chr(0) . pack('n', 32) . pack('H*', $reg[$i]['devicetoken']) . pack('n', strlen($payload)) . $payload; // Send it to the server $result = fwrite($fp, $msg, strlen($msg)); if(!$result) {//发送失败,socket 重连 $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); } else { $i++; } } break; }
if(!$result) {//发送失败,socket 重连 $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); }
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx);if (!$fp) {fwrite($fps,"Failed to connect: $err $errstr");}运行结果是:Failed to connect:0
ApnsPHP-master
搜下这个吧,我用这个写过,一次推1万,crontab定时发送的,好像没遇到什么情况