Php socket_read在使用socket_accept进入多个客户端时解除阻止
我有一个服务器套接字,客户端可以连接到我,像这样在套接字中读写Php socket_read在使用socket_accept进入多个客户端时解除阻止,php,sockets,Php,Sockets,我有一个服务器套接字,客户端可以连接到我,像这样在套接字中读写 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_bind($socket, $address, $port)) socket_listen($socket); socket_set_nonblock($socket); 我将socket\u set\u nonblock设置为在socket\u accept中不阻止我的套接字 这很好,但对于连接到我的服务
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $address, $port))
socket_listen($socket);
socket_set_nonblock($socket);
我将socket\u set\u nonblock设置为在socket\u accept中不阻止我的套接字
这很好,但对于连接到我的服务器的客户端,我不允许非阻塞客户端
while(true){
if (($newc = @socket_accept($socket)) !== false) {
//socket_set_nonblock($newc);
//socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
$clients[] = $newc;
$data = socket_read($newc, 1024, PHP_NORMAL_READ);
}
echo "do sometings ...";
}
我测试了socket\u set\u nonblock($newc)和选项SO\u RCVTIMEO,以防止在socket\u read中阻塞$newc,但我没有成功地取消阻塞
我测试插座\u选择如下,但这不起作用
$write = array();
$expect = NULL;
socket_select($clients, $write, $except, 0);
当第二个客户端连接到程序时,回显“做点什么…”在第二个客户端输入任何内容之前不要工作
对于非阻塞套接字,请阅读我必须做什么?这是不可能的,或者我使用的插座选择不正确?我花了几个小时终于让某些东西工作起来了。套接字集非块($newsock);对于每个收入客户机,Linux(CentOS)PHP7都是必需的,但它应该在windows PHP5上工作
<?php
ini_set('error_reporting', E_ALL ^ E_NOTICE);
ini_set('display_errors', 1);
// Set time limit to indefinite execution
set_time_limit(0);
// Set the ip and port we will listen on
$address = '127.0.0.1';
$port = 6901;
ob_implicit_flush();
// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
// Bind the socket to an address/port
socket_bind($sock, $address, $port) or die('Could not bind to address');
// Start listening for connections
socket_listen($sock);
// Non block socket type
socket_set_nonblock($sock);
// Clients
$clients = [];
// Loop continuously
while (true) {
// Accept new connections
if ($newsock = socket_accept($sock)) {
if (is_resource($newsock)) {
// Write something back to the user
socket_write($newsock, ">", 1).chr(0);
// Non bloco for the new connection
socket_set_nonblock($newsock);
// Do something on the server side
echo "New client connected\n";
// Append the new connection to the clients array
$clients[] = $newsock;
}
}
// Polling for new messages
if (count($clients)) {
foreach ($clients AS $k => $v) {
// Check for new messages
$string = '';
if ($char = socket_read($v, 1024)) {
$string .= $char;
}
// New string for a connection
if ($string) {
echo "$k:$string\n";
} else {
if ($seconds > 60) {
// Ping every 5 seconds for live connections
if (false === socket_write($v, 'PING')) {
// Close non-responsive connection
session_close($clients[$k]);
// Remove from active connections array
unset($clients[$k]);
}
// Reset counter
$seconds = 0;
}
}
}
}
sleep(1);
$seconds++;
}
// Close the master sockets
socket_close($sock);