PHP socket.on
时间: 2023-07-25 16:15:19 浏览: 163
`socket.on` 是一个 JavaScript 中的事件处理函数,用于在客户端与服务器之间建立 socket 连接时处理事件。在 PHP 中没有直接的 `socket.on` 函数,但可以通过在服务器端使用 `socket_select` 函数实现类似的功能。
`socket_select` 函数可以用于等待多个 socket 上的事件,并在事件发生时执行相应的代码。下面是一个简单的示例,演示如何使用 `socket_select` 函数在 PHP 服务器端处理客户端连接事件:
```php
<?php
// 创建 socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
exit;
}
// 绑定地址和端口
$address = '127.0.0.1';
$port = 8888;
if (!socket_bind($socket, $address, $port)) {
echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
exit;
}
// 监听连接请求
if (!socket_listen($socket, 5)) {
echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
exit;
}
// 等待连接
echo "Waiting for client to connect...\n";
$sockets = array($socket);
while (true) {
$readSockets = $sockets;
$writeSockets = null;
$exceptSockets = null;
$numSockets = socket_select($readSockets, $writeSockets, $exceptSockets, null);
if ($numSockets === false) {
echo "socket_select() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
break;
} elseif ($numSockets === 0) {
continue;
}
// 有新的连接请求
if (in_array($socket, $readSockets)) {
$clientSocket = socket_accept($socket);
if (!$clientSocket) {
echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
echo "New client connected\n";
$sockets[] = $clientSocket;
$key = array_search($socket, $readSockets);
unset($readSockets[$key]);
}
// 处理其他 socket 上的事件
foreach ($readSockets as $readSocket) {
$msg = socket_read($readSocket, 1024);
if ($msg === false) {
$key = array_search($readSocket, $sockets);
unset($sockets[$key]);
echo "Client disconnected\n";
} else {
echo "Received message from client: $msg\n";
$response = "Hello, client!";
socket_write($readSocket, $response, strlen($response));
}
}
}
// 关闭 socket
foreach ($sockets as $s) {
socket_close($s);
}
socket_close($socket);
```
在上面的示例中,我们使用 `socket_select` 函数等待多个 socket 上的事件。当有新的连接请求时,我们接受连接并将新的 socket 添加到 `$sockets` 数组中。当一个连接断开时,我们从 `$sockets` 数组中删除对应的 socket。对于其他 socket 上的事件,我们从中读取消息并向客户端发送响应。
需要注意的是,`socket_select` 函数会阻塞当前进程,直到有事件发生或超时。在实际中,您可能需要使用多个进程或线程来处理多个 socket 上的事件,以避免阻塞问题。
阅读全文