php server(),自己动手用PHP编写一个简单的HTTP Server(单进程版)

自己动手用PHP编写一个简单的HTTP Server(单进程版)

HTTP协议我的简化版理解就是电脑上浏览器向服务器发送一个预先定义好的文本(Http Request)

然后服务器端处理一下(通常是从硬盘读取一个后缀名为html的文件),然后再把这个文件

通过文本方式发回去(Http Response),就这么简单。

唯一麻烦的是我得请操作系统给我建立Http层下面的TCP连接通道,因为所有的文本数据都得

通过TCP管道接收和发送,这个通道是用socket建立的。

伪代码如下

socketMain= socket(...)

bind(socketMain,主机的IP和端口号)

listen(socketMain,...)

无限循环

while(true) {

socketAccept = accept(socketMain,....)

receive(socketAccept,....)

send(socketAccept...)

close(socketAccept...)

}

伪代码解释

这些socket,bind,listen,accept都是操作系统提供的接口,我们要做的就是把这些进行

组装;现在80或者其他端口监听,然后进入无限循环,如果有请求进来,就接受(accept),创建新的socket,最后通过这个socket来接收和发送Http数据。

实现的php代码如下

只实现了当前目录下的html与jpg图片的解析处理,原理都类似。

set_time_limit(0);

class HttpServer

{

private $ip = '127.0.0.1';

private $port = 9996;

private $_socket = null;

public function __construct()

{

$this->_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if ($this->_socket === false) {

die(socket_strerror(socket_last_error($this->_socket)));

}

}

public function run()

{

socket_bind($this->_socket, $this->ip, $this->port);

socket_listen($this->_socket, 5);

while(true) {

$socketAccept = socket_accept($this->_socket);

$request = socket_read($socketAccept, 1024);

echo $request;

socket_write($socketAccept, 'HTTP/1.1 200 OK'.PHP_EOL);

socket_write($socketAccept, 'Date:'.date('Y-m-d H:i:s').PHP_EOL);

$fileName = $this->getUri($request);

$fileExt = preg_replace('/^.*\.(\w+)$/', '$1', $fileName);

$fileName = __DIR__.'/'.$fileName;

switch ($fileExt) {

case "html":

//set content type

socket_write($socketAccept, 'Content-Type: text/html'.PHP_EOL);

socket_write($socketAccept, ''.PHP_EOL);

$fileContent = file_get_contents($fileName);

socket_write($socketAccept, $fileContent, strlen($fileContent));

break;

case "jpg":

socket_write($socketAccept, 'Content-Type: image/jpeg'.PHP_EOL);

socket_write($socketAccept,''.PHP_EOL);

$fileContent = file_get_contents($fileName);

socket_write($socketAccept, $fileContent, strlen($fileContent));

break;

}

socket_write($socketAccept, 'web serving', strlen('web serving'));

socket_close($socketAccept);

}

}

protected function getUri($request = '')

{

$arrayRequest = explode(PHP_EOL, $request);

$line = $arrayRequest[0];

$file = trim(preg_replace('/(\w+)\s\/(.*)\sHTTP\/1.1/i','$2', $line));

return $file;

}

public function close()

{

socket_close($this->_socket);

}

}

$httpServer = new HttpServer();

$httpServer->run();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值