废话少说,直接贴代码了。

error_reporting(E_ALL);

set_time_limit(0);

ob_implicit_flush();

date_default_timezone_set("Asia/Shanghai");

$debug = true;

function response_method_404(){

$result = "";

$result .="HTTP/1.1 404\r\n";

$result .="Content-Length: 14\r\n";

$result .= "Content-Type: text/html\r\n";

$result .="\r\nserver is not \r\n";

return $result;

}

function response_file_404(){

$result = "";

$result .="HTTP/1.1 404\r\n";

$result .="Content-Length:0\r\n";

$result .= "Content-Type: text/html\r\n";

$result .="\r\n\r\n";

return $result;

}

function response_file_type_404(){

$result = "";

$result .="HTTP/1.1 404\r\n";

$result .="Content-Length:11\r\n";

$result .= "Content-Type: text/html\r\n";

$result .="\r\ntype is not\r\n";

return $result;

}

function response_file_img($fileurl){

$body = file_get_contents($fileurl);

$len = strlen($body);

$result="";

$result .="HTTP/1.1 200\r\n";

$result .="Content-Length:$len\r\n";

$result .= "Content-Type: {$size['mime']}\r\n";

$result .="\r\n$body\r\n";

return $result;

}

function response_file_js($fileurl){

global $request;

$body = file_get_contents($fileurl);

$len = strlen($body);

$date = date('D, d M Y G:i:s ').'GMT';

clearstatcache();

$last_modified = date('D, d M Y G:i:s ',filemtime($fileurl)).'GMT';

$result="";

if ( $request['If-Modified-Since'] && $last_modified <= $request['If-Modified-Since'] ){

$result .="HTTP/1.1 304\r\n";

}else{

$result .="HTTP/1.1 200\r\n";

$result .="Cache-Control: public\r\n";

$result .="Date:$date\r\n";

$result .="Last-Modified:$last_modified\r\n";

$result .="Expires:Fri, 24 Jan 2016 10:06:05 GMT\r\n";

$result .="Content-Length:$len\r\n";

$result .= "Content-Type: application/x-javascript\r\n";

$result .="\r\n$body\r\n";

}

return $result;

}

function response_file_html($fileurl){

$body = file_get_contents($fileurl);

$len = strlen($body);

$result = "";

$result .="HTTP/1.1 200\r\n";

$result .="Content-Length:$len\r\n";

$result .= "Content-Type: text/html;charset=utf-8\r\n";

$result .="\r\n$body\r\n";

return $result;

}

function pare_request($str){

global $web_root,$request;

$arr = explode("\r\n",$str);

foreach( $arr as $r){

$pos = stripos($r,":");

if ( $pos ){

$key = trim(substr($r,0,$pos));

$val = trim(substr($r,$pos+1));

$request[$key] = $val;

}

}

writelog(var_export($request,true));

$line0 = explode(" ",$arr[0]);

if ( $line0[0] == "GET" ){

$fileurl = $web_root.$line0[1];

if ( file_exists($fileurl) ){

$pathinfo = pathinfo($fileurl);

if ( $pathinfo['extension'] == "js" ){

$result = response_file_js($fileurl);

}else if ( $pathinfo['extension'] == "png" || $pathinfo['extension'] == "jpg" || $pathinfo['extension'] == "gif" ){

$result = response_file_img($fileurl);

}else if ( $pathinfo['extension'] == "html" ){

$result = response_file_html($fileurl);

}else{

$result = response_file_type_404();

}

}else{

$result = response_file_404();

}

}else{

$result = response_method_404();

}

return $result;

}

function sig_handler($signo)

{

switch ($signo) {

case SIGTERM:

// 处理中断信号

exit;

break;

case SIGHUP:

// 处理重启信号

break;

default:

// 处理所有其他信号

}

}

function writelog($msg){

global $debug;

if ( $debug ){

echo $msg;

}else{

file_put_contents('./log.txt',$msg,FILE_APPEND | LOCK_EX);

}

}

if ( !$debug ){

//产生子进程分支

$pid = pcntl_fork();

if ($pid == -1) {

writelog("could not fork\r\n");

die("could not fork"); //pcntl_fork返回-1标明创建子进程失败

} else if ($pid) {

exit(); //父进程中pcntl_fork返回创建的子进程进程号

} else {

// 子进程pcntl_fork返回的时0

}

// 从当前终端分离

if (posix_setsid() == -1) {

writelog("could not detach form terminal \r\n");

die("could not detach from terminal");

}

// 安装信号处理器

pcntl_signal(SIGTERM, "sig_handler");

pcntl_signal(SIGHUP, "sig_handler");

}

$address = '127.0.0.1';

$port = 1215;

$web_root = "/home/xtgxiso";

$request = array();

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {

writelog("socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n");

exit;

}

if (socket_bind($sock, $address, $port) === false) {

writelog("socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n");

exit;

}else{

writelog('Socket ' . $address . ':' . $port . " has been opened\n");

}

if (socket_listen($sock, 5) === false) {

writelog("socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n");

exit;

}else{

writelog("Listening for new clients..\n");

}

$client_id = 0;

do{

if ( ($msgsock = socket_accept($sock)) === false ) {

writelog("socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n");

break;

} else {

$client_id += 1;

writelog("Client #" .$client_id .": Connect\n");

}

$cur_buf = '';

do {

if (false === ($buf = socket_read($msgsock, 2048))) {

writelog("socket_read() failed: reason: " . socket_strerror(socket_last_error($msgsock)) . "\n");

break;

}

writelog("read start:\r\n");

writelog($buf);

writelog("read end:\r\n\r\n");

$talkback = pare_request($buf);

writelog("write start:\r\n");

socket_write($msgsock, $talkback, strlen($talkback));

//writelog($talkback);

writelog("write end:\r\n\r\n\r\n");

break;

} while (true);

socket_close($msgsock);

}while(true);

writelog("socket_close \r\n");

socket_close($sock);

实现了解析html,js,png,jpg,gif这几种格式的支持

这只是简单说明了一下思路,非常有利于大家了解http协议和优化其他http服务

as the women on the judging panel Guilana Rancik

snooki weight loss Oreimo Gets North American Simulcast Deal

and once soft

pornoRachel McAdams love triangle and baby bump rumors

http 1.php,php利用socket扩展写一个简单的单进程http服务1相关推荐

  1. 利用Python GUI写一个简单的绘画板

    先说废话,再上代码 这个绘画板主要运用了Python自带的标准GUI库Tkinter,包含了画笔颜色选择,背景布颜色选择,橡皮擦,清屏,保存图片等功能. from tkinter import * f ...

  2. 老雷socket编程之PHP利用socket扩展实现聊天服务

    老雷socket编程之PHP利用socket扩展实现聊天服务 socket聊天服务原理 PHP有两个socket的扩展 sockets和streams sockets socket_create(AF ...

  3. 利用socket.io+nodejs打造简单聊天室

    代码地址如下: http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  4. 利用fputc函数写一个putw(w,fp)函数,将整数w写入fp所指文件中; 利用fgetc函数写一函数getw(fp)从所指文件读出一整数

    <程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p257 习题8 5.利用fputc函数写一个putw(w,fp)函数,将整数w写入fp所指文件中: 利 ...

  5. Java写一个简单的静态文件的HTTP服务器(基于Socket)

    ** 一.实现思路 ** 1.使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象. 2.创建一个类 HttpServer 继承 java.lang.Thread 类,重写 ...

  6. 如何写一个简单的node.js C 扩展

    node 是由 c 编写的,核心的 node 模块也都是由 c 代码来实现,所以同样 node 也开放了让使用者编写 c 扩展来实现一些操作的窗口. 如果大家对于 require 函数的描述还有印象的 ...

  7. 利用python写一个简单的双色球彩票系统

    利用python写一个简单的双色球彩票系统 1.设置每次买的号码一样 写一个双色球彩票系统,系统可以随机产生一组数据,一组彩票数据有六位数,这六位数的的取值范围是0和1. 一张彩票是两块钱,用户可以选 ...

  8. 利用spring boot 写一个稳定的爬虫

    1.前言 这篇文章是利用spring boot 写一个稳定的爬虫,爬取的网页数据包含未执行js的网页数据.http/https接口的请求数据.和经过网页渲染的js数据(需要chorme浏览器),数据库 ...

  9. 如何搭建python框架_从零开始:写一个简单的Python框架

    原标题:从零开始:写一个简单的Python框架 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 你为什么想搭建一个Web框架?我想有下面几个原因: 有一个 ...

最新文章

  1. linux 重定向_Unix/Linux编程实践之IO重定向和管道
  2. Ubuntu18.04安装rabbitmq
  3. Python爬虫还在写重试代码?快快学习下优雅的tenacity库!
  4. 工厂Bean 的实现类getObject 方法创建Bean 实例对象
  5. jmeter集合点使用方法:Synchronizing Timer
  6. pwm波程序如何实现_【优秀成果】如何做好算法与程序实现教学的知识储备
  7. 今日头条们:一边道歉一边做大
  8. 如何把几张图片合并成一张图片?
  9. jenkins 版本升级
  10. 【Android】制作一个简易的画板
  11. Python批量word2pdf、ppt2pdf
  12. 祖源分析相关链接推荐
  13. linux需要看门狗喂狗程序,多任务看门狗, 喂狗方法
  14. [Alpha] Scrum Meeting 8 - TEAM LESS ERROR
  15. 苹果原壁纸高清_宠物 | 猫咪狗狗系列手机壁纸
  16. AWS VPC CNI vs Calico CNI
  17. 用css3-做一个旋转的小风车
  18. 导频、SIC串行干扰抵消
  19. CGB2109-Day13-用户模块管理
  20. 新版标准日本语中级_第二十二课

热门文章

  1. 学习记录01:使用pyqt5搭建yolo3目标识别界面
  2. MOS与三极管的控制使用简介
  3. 《Springboot极简教程》继承WebMvcConfigurerAdapter: 一行代码写Controller
  4. 3dmax:3dmax三维VR渲染设置之高级灯光渲染(标准灯光分类及简介—目标聚光灯、泛光灯、台灯+射灯+壁灯+筒灯+电视灯+平行光,灯带+天光灯)图文教程之详细攻略
  5. 坚持创新驱动发展,上海控安入选《2021中国网络安全产业势能榜》
  6. 南方CASS格式DWG的读取
  7. Java软路由_J4105四口i211 千兆软路由 简单开箱
  8. SAP 采购发票预制
  9. XML-DTD解析(转载的)
  10. Linux查询sql显示井号,SQL井号标签的正则表达式表