<?php
date_default_timezone_set('Asia/Shanghai');
//创建服务套接字
$socket = stream_socket_server("tcp://0.0.0.0:1337", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
//设置为非阻塞
stream_set_blocking($socket, 0);
$reads = array();
$writes = null;
$e = null;
if (!$socket) {
echo "$errstr ($errno)<br />\n";
} else {
while (1) {
$reads = $reads + array((int)$socket => $socket);
$time = date('Y-m-d H:i:s');
echo "---- 我阻塞在这边$time ----\n";
var_dump($reads);
echo "---- 我阻塞在这边$time ----\n";
if (false === stream_select($reads, $writes, $e, 100000000)) {
echo "stream_select() failed\n";
} else {
$time = date('Y-m-d H:i:s');
echo "*** 我收到读文件描述符$time ***\n";
var_dump($reads);
echo "*** 我收到读文件描述符$time ***\n";
if (in_array($socket, $reads)) {
//接受客户端连接
$conn = stream_socket_accept($socket, 0);
stream_set_blocking($conn, 0);
$key_fd = (int)$conn;
//将当前客户端放入stream_select中
$reads[$key_fd] = $conn;
//去掉监听socket
$key = array_search($socket, $reads);
unset($reads[$key]);
}
//读通道
foreach ($reads as $key => $fd) {
if ($res = fread($fd, 8000)) {
echo ">>>>>当有请求时数据时>>>>\n";
var_dump($res);
//获取当前时间
$time = date("Y-m-d H:i:s");
//获取外部的资源
$file_content = file_get_contents(__DIR__ . '/test.txt');
fwrite($fd, "HTTP/1.1 200 OK\r\nContent-Type: text/html;charset=utf-8\r\nConnection: keep-alive\r\nServer: youlike\r\nContent-Length: 43\r\n\r\nhello world$time$file_content \n");
}else {
//如果没有收到数据那就关闭这个通道,并且从文件描述符中数组中去掉改改描述符
fclose($fd);
unset($reads[$key]);
}
}
}
}
fclose($socket);
}
?>
php socket编程学习建立简单web服务器
最新推荐文章于 2024-08-30 11:14:47 发布