11

我找不到有关在 PHP 中设置 wss 连接的任何信息。我连接throw ws没问题。顺便说一句,我正在使用这个非常棒的库来做到这一点:https ://github.com/albeva/php-websocket

但是我的网站使用 https 并且我需要一个 WebSocket 安全连接来避免 Firefox 抱怨连接不安全的事实。

在此先感谢您的帮助。


编辑

这是该库用于启动套接字连接的代码:

$master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!is_resource($master)) {
    $this->throwSocketError();
}

// set options
if (!socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1)) {
    $this->throwSocketError();
}

// bind
if (!socket_bind($master, $this->host, $this->port)) {
    $this->throwSocketError();
}

// listen for connections
if (!socket_listen($master, SOMAXCONN)) {
    $this->throwSocketError();
}

我相信我需要更改此代码,但我找不到如何。

4

3 回答 3

4

你试过stream_socket_server吗?

<?php
$socket = stream_socket_server("ssl://0.0.0.0:".$port, $errno, $errstr);
if (!$socket) {
  echo "$errstr ($errno)<br />\n";
} else {
  while ($conn = stream_socket_accept($socket)) {
    fwrite($conn, 'some data...\n');
    fclose($conn);
  }
  fclose($socket);
}
?>
于 2012-05-24T09:05:48.493 回答
2

这是一个示例(和链接),稍作修改,并从另一个 SO 帖子中找到。 链接到其他帖子

这里是 stream_context_create php 函数定义的链接。 函数定义

try 
{ 
    $localCertificateFilespec = $connection['localCertificateFilespec']; 
    $localCertificatePassphrase = $connection['localCertificatePassphrase']; 

    $sslOptions = array( 
        'ssl' => array( 
            'local_cert' => $localCertificateFilespec, 
            'passphrase' => $localCertificatePassphrase, 
            'allow_self_signed' => true, 
            'verify_peer' => false 
        ) 
    ); 
    $sslContext = stream_context_create($sslOptions); 

    $clientArguments = array( 
        'stream_context' => $sslContext, 
        'local_cert' => $localCertificateFilespec, 
        'passphrase' => $localCertificatePassphrase, 
        'trace' => true, 
        'exceptions' => true, 
        'encoding' => 'UTF-8', 
        'soap_version' => SOAP_1_1 
    ); 

    $oClient = new WSSoapClient($connection['wsdlFilespec'], $clientArguments); 
    $oClient->__setUsernameToken($connection['username'], $connection['password']); 

    return $oClient->__soapCall($operation, $request); 
} 

但是,在链接的 SO 帖子的最底部,您会从“Sam”中找到答案。我需要在接下来的几周内做同样的事情,所以我计划使用 Sams 方法......因为我更喜欢 PHP 中的 CURL。

于 2012-05-18T20:07:08.077 回答
1

您目前最好的 PHP 方法是使用Ratchet。设置 wss 连接的最佳方法是将您的 websocket 服务器放在 Nginx 或 HAProxy 后面,这将为您处理所有 SSL 内容。此处使用 HAProxy对此进行了解释。请注意,您可以对 Nginx 执行相同操作,因为它现在也支持 WebSocket。

于 2013-10-09T14:22:13.867 回答