在数组 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_bind
和socket_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 资源名称 - 我如何访问它们的主要内容,如果未能解决你的问题,请参考以下文章