在数组 php 中存储 php websocket 资源名称 - 我如何访问它们

Posted

技术标签:

【中文标题】在数组 php 中存储 php websocket 资源名称 - 我如何访问它们【英文标题】:Storing php websocket resource names in array php - how do I access them 【发布时间】:2018-10-09 14:27:38 【问题描述】:

在我的 php websocket 文件中,当新客户端连接时,我将资源名称存储在一个数组中,以便以后检索它。这是我用来执行此操作的行:

$socketResource = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socketResource, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socketResource, 0, PORT);
socket_listen($socketResource);

//This is an array of user subscriptions
$message_subscriptions = array();
$resources = array();

$clientSocketArray = array($socketResource);
while (true) 
    $newSocketArray = $clientSocketArray;
    socket_select($newSocketArray, $null, $null, 0, 10);

if (in_array($socketResource, $newSocketArray)) 
    $newSocket = socket_accept($socketResource);
    $clientSocketArray[] = $newSocket;

    $header = socket_read($newSocket, 1024);
    $chatHandler->doHandshake($header, $newSocket, HOST_NAME, PORT);

    socket_getpeername($newSocket, $client_ip_address);
    //Store this socket as a resource for later use
    array_push($resources, $socketResource);

    //The file continues.

所以现在,我的 $resources 数组看起来像这样:

array(
    0 => resource id #7
);

我还有一个不同的数组,它将用户 ID 与该数组中资源的位置相关联。当另一个用户向该用户 ID 发送消息时,我希望消息(尝试)在与 resource id #7 关联的 websocket 上发送。我想做这个服务器端,这样只有预期的用户才能看到消息。

到目前为止,我已经尝试过,但它不起作用:

$resource = $resources[0];

foreach($clientSocketArray as $clientSocket)
    if((string)$clientSocket == $resource)
        @socket_write($clientSocket,$message,$messageLength);
    

这可能吗?如果是,我该怎么做?

我已经获得了可以在客户端读取的 javascript 代码。没有问题。

谢谢。

【问题讨论】:

$socketResource 声明在哪里? 编辑文件,包含$socketResource声明 不应该是($clientSocketArray as $key => $clientSocket)吗? @sietse85,此处不需要该语法,因为我只想要该值。 $clientSocketArray 是一个带有数字键的数组,这些键不能在任何地方使用。 【参考方案1】:

我错过了socket_bindsocket_listen 命令。现在,我的循环如下所示:

foreach($clientSocketArray as $clientSocket)

    if((string)$clientSocket == $resource)
        echo "found socket " . (string)$clientSocket;
        @socket_bind($clientSocket, 0, PORT);
        @socket_listen($clientSocket);
        @socket_write($clientSocket,$message,$messageLength);
    

我必须在 php-socket.php 上做一些额外的事情,以使消息发送到正确的套接字名称,但这是根本问题。

【讨论】:

以上是关于在数组 php 中存储 php websocket 资源名称 - 我如何访问它们的主要内容,如果未能解决你的问题,请参考以下文章

在 Wordpress 用户元数据库中存储 PHP 数组

PHP将对象引用存储在数组中

如何使用 PHP 在 Mysql 中存储数组

在 websockets php 中传递参数

PHP 将数组存储在cookie中

您可以将函数存储在 PHP 数组中吗?