我自己的解决方案(一位同事帮助我解决了向 mozilla 发出的curl 请求中的错误),现在正在运行
function send_push_message($subscriptionIDs){
if (empty($subscriptionIDs)) return FALSE;
$chs = $sChrome = array();
$mh = curl_multi_init();
foreach ($subscriptionIDs as $subscription){
$i = count($chs);
switch ($subscription["browser"]){
case "firefox":
$chs[ $i ] = curl_init();
curl_setopt($chs[ $i ], CURLOPT_URL, "https://updates.push.services.mozilla.com/push/".$subscription["id"] );
curl_setopt($chs[ $i ], CURLOPT_PUT, TRUE);
curl_setopt($chs[ $i ], CURLOPT_HTTPHEADER, array( "TTL: 86400" ) );
curl_setopt($chs[ $i ], CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($chs[ $i ], CURLOPT_SSL_VERIFYPEER, FALSE);
curl_multi_add_handle($mh, $chs[ $i ]);
break;
case "chrome":
$sChrome[] = $subscription["id"];
break;
}
}
if (!empty($sChrome)){
$i = count($chs);
$chs[ $i ] = curl_init();
curl_setopt($chs[ $i ], CURLOPT_URL, "https://android.googleapis.com/gcm/send" );
curl_setopt($chs[ $i ], CURLOPT_POST, TRUE);
curl_setopt($chs[ $i ], CURLOPT_HTTPHEADER, array( "Authorization: key=MY_KEY", "Content-Type: application/json" ) );
curl_setopt($chs[ $i ], CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($chs[ $i ], CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($chs[ $i ], CURLOPT_POSTFIELDS, json_encode( array( "registration_ids" => $sChrome ) ) );
curl_multi_add_handle($mh, $chs[ $i ]);
}
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
for ($i = 0; $i < count($chs); $i++){
curl_multi_remove_handle($mh, $chs[ $i ]);
}
curl_multi_close($mh);
}
($subscriptionIDs 是一个数组数组,有 2 个键:id 和 browser)