php ios 群體推送

來源:互聯網
上載者:User
描述:用php 做伺服器端,向IOS的APNS推播通知,附上代碼
public static function apple_push($data,$deviceToken){$passphrase='123456';$ckfile="ck.pem";$ctx = stream_context_create();stream_context_set_option($ctx, 'ssl', 'local_cert', $ckfile);stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);$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.push.apple.com:2195',$err,$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);if(!$fp){return false;}$payload=json_encode($data);$pushdata = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;$result = fwrite($fp, $pushdata, strlen($pushdata));if(!$result){file_put_contents(dirname(__FILE__)."/pushlog.txt",$result.'-'.$deviceToken."-".microtime().PHP_EOL,FILE_APPEND);}fclose($fp);}

單條推送是沒有問題的
問題描述:
現在要求群體推送,之前,我寫的是用socket連結後,迴圈寫入,再關閉fp,但是有些人沒有收到推送,網上說,要是其中一個人的手機令牌(deviceToken)有問題的話,蘋果伺服器就會中斷這個socket連結。
我就改成每個使用者都用socket開啟,寫入,關閉,但是我發現這樣很慢,半個小時都不能推送9000條,雖然是後台推送,但是要求勁量在半小時內推送完。
我先在想到的辦法是:同時訪問這個php頁面十次,參數不用,就將要推送的使用者分成十份。
不知道有什麼好的群體推送方式
附上現在的code
function iospush($tid,$subject,$pushinfo){$data['aps']=array('alert'=>$subject,'sound'=>'default','type'=>'thread','tid'=>$tid,);$passphrase='123456';$ckfile="ck.pem";$ctx = stream_context_create();stream_context_set_option($ctx, 'ssl', 'local_cert', $ckfile);stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);$payload=json_encode($data);foreach($pushinfo as $info){$deviceToken=$info['phoneToken'];$pushdata = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;$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.push.apple.com:2195',$err,$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);//正式伺服器if(!$fp){file_put_contents(dirname(__FILE__)."/pushlog.txt",$err.'-'.$errstr.'-60'.PHP_EOL,FILE_APPEND);continue;}$result = fwrite($fp, $pushdata, strlen($pushdata));if(!$result){file_put_contents(dirname(__FILE__)."/pushlog.txt",$result.'-'.$deviceToken.PHP_EOL,FILE_APPEND);}fclose($fp);}}


回複討論(解決方案)

這種東西肯定需要用非同步去實現

試試xmpphp,使用聊天伺服器來實現,可能更靠譜一些。

是非同步,但是每次開啟,關閉,太浪費時間,不能在半小時內推送完。
用xmpphp倒是沒考慮過,既然是非同步推送,不用持久串連。

現在我的解決辦法是:用pcntl,開十個進程執行

要快就只能?多?程了。

感謝各位的回答,但是在用pcntl的時候,遇到了另一個問題

http://bbs.csdn.net/topics/390829010

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.