PHP:在套接字服务器内发送apns不起作用?

时间:2014-01-08 08:29:54

标签: php sockets command-line apple-push-notifications

本周我尝试使用php套接字,但有一件事似乎不起作用。

我想从套接字服务器发送Apple推送通知(apns)。套接字服务器工作正常但打开另一个套接字向apns发送消息不起作用。

我使用的服务器套接字脚本类似于php.net的示例。 (http://www.php.net/manual/en/sockets.examples.php)我用来发送apns通知的脚本是以下函数:

function sendToAPNS($data, $deviceTokens, $pem, $password, $debug=0)
{
    $server = ($debug == 1) ? 'gateway.sandbox.push.apple.com' : 'gateway.push.apple.com';

    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', '/home/testing/pushNotifications/'.$pem);
    stream_context_set_option($ctx, 'ssl', 'passphrase', $password);

    $fp = stream_socket_client('ssl://'. $server .':2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

    if (!$fp)
    {
        echo 'APNS error:'. $err .' '. $errstr ."\n";
        return;
    }

    $body['aps'] = array('alert' => $data['message']);

    foreach($data AS $key => $value)
    {
        if($key != 'message') $body['aps'][$key] = $value;
    }       

    $payload = json_encode($body);

    for($i = 0,$max=count($deviceTokens); $i < $max; $i++) 
    {
        $msg = chr(0) . pack('n', 32) . pack('H*', $deviceTokens[$i]) . pack('n', strlen($payload)) . $payload;
        $result = fwrite($fp, $msg, strlen($msg));

        if (!$result)
            BPLog('Message['. $data['ID'] .'] not delivered to '. $deviceTokens[$i] .': '. PHP_EOL);

       // ob_flush();
       // flush();
    }

    fclose($fp);

    return true;        
}

显示以下警告:

PHP Warning:  stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:
error:14094410:SSL routines:func(148):reason(1040) in /home/testing/pushNotifications/index.php on line 162

Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:
error:14094410:SSL routines:func(148):reason(1040) in /home/testing/pushNotifications/index.php on line 162
PHP Warning:  stream_socket_client(): Failed to enable crypto in /home/testing/pushNotifications/index.php on line 162

Warning: stream_socket_client(): Failed to enable crypto in /home/testing/pushNotifications/index.php on line 162
PHP Warning:  stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 (Unknown error) in /home/testing/pushNotifications/index.php on line 162

Warning: stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195     (Unknown error) in /home/testing/pushNotifications/index.php on line 162

该功能可在其他环境中使用。我已经在一个php文件中对它进行了测试,该文件可以从浏览器中调用,它会像它应该的那样发送。我使用证书的绝对路径,这不是问题。

因为从命令行调用套接字服务器,所以php中可能存在差异。或者也许根本无法从套接字服务器中打开另一个套接字流?

有没有人知道问题是什么?

0 个答案:

没有答案