php socket编程学习建立简单web服务器

    <?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);  
    }  
    ?>  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值