php使用多线程管理socket
最近看了PHP的pthreads扩展,用它写了个管理socket的demo,
server.php
class T extends Thread
{
private $conn;
public function __construct($conn)
{
$this->conn = $conn;
echo "creating T\n";
}
public function run()
{
$str = socket_read($this->conn, 1024);
echo $str, PHP_EOL;
socket_write($this->conn, "hello, world\n", 13);
while (true) {
socket_write($this->conn, "hello, world\n", 13);
}
}
}
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 8080);
socket_listen($socket);
while (true) {
$conn = socket_accept($socket);
$t = new T($conn);
echo "create T\n";
var_dump($t->start());
}
client.php
$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($client, '127.0.0.1', 8080);
socket_write($client, 'client connected');
echo socket_read($client, 1024);
while (true) {
$str = socket_read($client, 1024);
if ($str) {
echo $str;
} else {
break;
}
}
但是运行后发现只有第一个client可以正常连接并发送消息,第二个client会卡死,第一个client连接时,server输出如下
creating T
create T
client connected
bool(true)
第二个client连接时,服务器就只会输出creating T
,然后就没有下文了。使用netstat查看连接
使用ps查看线程
想了很久都没找到原因,求大神指点
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论