我正在编写一个脚本,它将在后台接受多个套接字连接并完成齿轮手所接收的工作(在这种情况下忘记齿轮手)
class ListenerThread extends Thread
{
public function run(){
$host = '192.168.30.119';
$port = 5010;
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($socket, $host, $port);
socket_listen($socket);
$client = array($socket);
global $clientsArr;
do{
socket_select($client, $write = NULL, $except = NULL, $tv_sec = NULL);
if(in_array($socket, $client)){
$tmp = socket_accept($socket);
socket_write($tmp, "who are you\n");
$request = trim(socket_read($tmp, 2024));
echo "new client connected\n";
$clientsArr[] = $tmp;
$client[] = $tmp;
}
} while(true);
}
}
global $clientsArr;
$clientsArr = new Threaded();
$listener = new ListenerThread();
$listener->start(PTHREADS_INHERIT_ALL | PTHREADS_ALLOW_GLOBALS);
for($i = 0; $i < 100; $i++){
print_r($clientsArr);
sleep(2);
}
现在当我运行此代码并使用telnet 192.168.30.119 5010
连接客户端时,我得到了奇怪的输出
new client connected
Threaded Object
(
[0] => Resource id #4
)
Threaded Object
(
[0] => Resource id #5
)
Threaded Object
(
[0] => Resource id #6
)
为什么即使只有一个连接,线程或其他东西也会改变资源?
请注意,这是我第一次使用线程,所以如果有人有更好的解决方案,请分享。
目标是有一个后台循环,它将侦听端口并存储数组或对象中应该可以在类外访问的连接。
答案 0 :(得分:1)
注意我不是线程专家,但我会尽力帮助..
首先,从这里开始:Socket resource id overflowing
A)什么可能导致资源ID出现异常增量?
&#34; PHP不会在内部重复使用资源ID。&#34;
(这里是一个类似的问题和答案:https://bytes.com/topic/php/answers/729100-about-resource-ids)
其次,阅读http://php.net/manual/en/function.socket-accept.php Boylett评论:
如果您想在服务器上拥有多个客户端,则必须使用 非阻塞。
...
socket_listen($socket);
socket_set_nonblock($socket); // <---
while(true)
{
if(($newc = socket_accept($socket)) !== false)
在php.net中也有一些类似的工作示例(如果你想检查它)。
希望它能提供一些“轻松”的光。你的问题。