最近在看负载均衡的几台机器共享session,用ini配置+memcache实现
无意中点击到PHP的socket,无聊的我想看看怎么不用workerman实现socket
如下图:
由于不是fgets(STDIN)阻塞就是socket_read阻塞
我没办法做到两个命令行又能输入也能一直监听socket_read的情况
请问我如果单这两个脚本而言加上PHP的多线程做一个聊天室那样的功能?
还有为啥我多开一个命令行窗口php client.php无法监听socket端口了?一个端口只能一个server和一个client?
附上两个PHP脚本,嘿嘿,
//获取tcp协议号码。
$tcp = getprotobyname("tcp");
// 建立server端socket ,创建并返回一个套接字,也称作一个通讯节点。
$socket = socket_create(AF_INET, SOCK_STREAM, $tcp);
// socket_set_nonblock($socket);
//绑定要监听的ip和端口,这里绑定的ip一定要写局域网ip,写成127.0.0.1客户端将无法与服务端建议连接。
socket_bind($socket, '192.168.171.68', 9999);
//监听端口
socket_listen($socket);
// 接受客户端请求过来的一个socket连接
$connection = socket_accept($socket);
//初始化一个数据,和客户端通信
while (true) {
$send_data = trim(fgets(STDIN));
if($send_data){
// 向客户端传递一个信息数据
socket_write($connection,$send_data);
}else{
// 监听客户端
$data = @socket_read($connection, 1024, PHP_BINARY_READ);
if($data){
printf("from client: " . $data . "\n");
}
}
// echo 'loop'.PHP_EOL;
//关闭 socket
// socket_close($connection);
}
?>
客户端:
// 建立客户端的socet连接
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// socket_set_nonblock($socket);
//连接服务器端socket
$connection = socket_connect($socket, '192.168.171.68', 9999);
$line = fopen('php://stdin','r');
while (true) {
// echo 'start'.PHP_EOL;
if(ftell(STDIN)===0){
// 将客户的信息写到通道中,传给服务器端
// echo 'listening'.PHP_EOL;
$send_data = fgets($line);
socket_write($socket, $send_data);
}else{
//输出服务端的相应
// echo 'reading'.PHP_EOL;
$buffer = socket_read($socket, 1024, PHP_BINARY_READ);
if($buffer){
//服务端传来的信息
echo "server:" . $buffer . PHP_EOL;
}
}
// echo 'loop'.PHP_EOL;
}