亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

如何用PHP來實現一個動態Web服務器

2020-03-22 19:17:18
字體:
來源:轉載
供稿:網友
要是現實一個 web 服務器,那么就需要大概了解 web 服務器的運行原理。先從靜態的文本服務器開始,以訪問 web 服務器的1.html為例1.客戶端通過發送一個 http 請求到服務器,如果服務器監聽的端口號是9002,那么在本機自身測試訪問的地址就是http://localhost:9002/1.html。2.服務器監聽著9002端口,那么在收到請求了請求之后,就能從 http head 頭中獲取到請求里需要訪問的 uri 資源在web 目錄中的位置。3.服務器讀取需要訪問的資源文件,然后填充到 http 的實體中返回給客戶端。示意圖如下:class web_config { // 監聽的端口號 const PORT = 9003; // 項目根目錄 const WEB_ROOT = "/Users/zhoumengkang/Documents/html";
echo $e- getMessage(); echo "ACCEPT FAILED:" . socket_strerror(socket_last_error()) . "/n"; try { $request_string = socket_read($new_sock, 1024); $response = $this- output($request_string); socket_write($new_sock, $response); socket_close($new_sock); } catch (Exception $e) { echo $e- getMessage(); echo "READ FAILED:" . socket_strerror(socket_last_error()) . "/n"; } while (TRUE); * @param $request_string * @return string private function output($request_string){ // 靜態 GET /1.html HTTP/1.1 ... $request_array = explode(" ",$request_string); if(count($request_array) 2){ return $this- not_found(); $uri = $request_array[1]; $filename = web_config::WEB_ROOT . $uri; echo "request:".$filename."/n"; // 靜態文件的處理 if (file_exists($filename)) { return $this- add_header(file_get_contents($filename)); } else { return $this- not_found(); * 404 返回 * @return string private function not_found(){ $content = " h1 File Not Found /h1 return "HTTP/1.1 404 File Not Found/r/nContent-Type: text/html/r/nContent-Length: ".strlen($content)."/r/n/r/n".$content; * 加上頭信息 * @param $string * @return string private function add_header($string){ return "HTTP/1.1 200 OK/r/nContent-Length: ".strlen($string)."/r/nServer: mengkang/r/n/r/n".$string;$server = new server("127.0.0.1", web_config::PORT);如上代碼所述,只要在終端執行該文件,那么一個靜態的 web 服務器就啟動啦。下圖為我訪問我 web 目錄下的1.jpg文件的截圖簡單的靜態 web 服務器已經完成了,下面的問題就是怎么讓其支持動態內容的輸出了。是不是只需要在 web 服務器內部執行完某個程序之后,把得到的結果返回給客戶端就行呢?但是這樣 web 服務器的代碼就和業務代碼耦合在一起了,怎么解決一個 web 服務器,可以運用在各個業務場景下呢?CGI 的出現解決了這一問題。那么 CGI 是什么呢?下面這段話復制的:CGI是外部應用程序(CGI程序)與Web服務器之間的接口標準,是在CGI程序和Web服務器之間傳遞信息的規程。CGI規范允許Web服務器執行外部程序,并將它們的輸出發送給Web瀏覽器,CGI將Web的一組簡單的靜態超媒體文檔變成一個完整的新的交互式媒體。好暈,舉個具體的例子,比如我們在使用的 PHP 的全局變量$_SERVER['QUERY_STRING']就是 Web 服務器通過 CGI 協議之上,傳遞過來的。例如在 Nginx 中,也許你記得這樣的 fastcgi 配置fastcgi_param QUERY_STRING $query_string;沒錯 nginx 把自己的全局變量$query_string傳遞給了 fastcgi_param 的環境變量中。下面我們也以CGI的QUERY_STRING作為橋梁,將客戶端請求的 uri 中的信息傳遞到 cgi 程序中去。通過putenv的方式把QUERY_STRING存入該請求的環境變量中。我們約定 Web 服務器中訪問的資源是.cgi后綴則表示是動態訪問,這一點有點兒類似于 nginx 里配置 location 來尋找 php 腳本程序一樣。都是一種檢查是否應該請求 cgi 程序的規則。為了和 Web 服務器區別開來,我用 C 寫了一個查詢用戶信息的 cgi 程序,根據用戶 id 查詢用戶資料。大致的訪問邏輯如下圖演示代碼地址:https://github.com/zhoumengkang/php/tree/master/php-webserver/dynamic如果要運行該 demo 需要做如下操作1.修改config.php里的項目根目錄WEB_ROOT2.編譯cgi-demo/user.c,編譯命令gcc -o user.cgi user.c,然后將user.cgi文件放入你配置的項目根目錄下面3.在終端執行php start.php ,這樣該 web 服務器就啟動了4.通過 http://localhost:9003/user.cgi id=1 就可以訪問看到如下效果了其實只是在靜態服務器的基礎上做了一些 cgi 的判斷是請求的轉發處理,把github 上的三個文件的代碼合并到一個文件里方便大家觀看class web_config { // 監聽的端口號 const PORT = 9003; // 項目根目錄 const WEB_ROOT = "/Users/zhoumengkang/Documents/html"; // 系統支持的 cgi 程序的文件擴展名 const CGI_EXTENSION = "cgi";class server { private $ip; private $port; public function __construct($ip, $port) { $this- ip = $ip; $this- port = $port; $this- await(); private function await() { $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($sock 0) { echo "Error:" . socket_strerror(socket_last_error()) . "/n"; $ret = socket_bind($sock, $this- ip, $this- port); if (!$ret) { echo "BIND FAILED:" . socket_strerror(socket_last_error()) . "/n"; exit; echo "OK/n"; $ret = socket_listen($sock); if ($ret 0) { echo "LISTEN FAILED:" . socket_strerror(socket_last_error()) . "/n"; do { $new_sock = null; try { $new_sock = socket_accept($sock); } catch (Exception $e) { echo $e- getMessage(); echo "ACCEPT FAILED:" . socket_strerror(socket_last_error()) . "/n"; try { $request_string = socket_read($new_sock, 1024); $response = $this- output($request_string); socket_write($new_sock, $response); socket_close($new_sock); } catch (Exception $e) { echo $e- getMessage(); echo "READ FAILED:" . socket_strerror(socket_last_error()) . "/n"; } while (TRUE); * @param $request_string * @return string private function output($request_string){ // 靜態 GET /1.html HTTP/1.1 ... // 動態 GET /user.cgi id=1 HTTP/1.1 ... $request_array = explode(" ",$request_string); if(count($request_array) 2){ return ""; $uri = $request_array[1]; echo "request:".web_config::WEB_ROOT . $uri."/n"; $query_string = null; if ($uri == "/favicon.ico") { return ""; if (strpos($uri," ")) { $uriArr = explode(" ", $uri); $uri = $uriArr[0]; $query_string = isset($uriArr[1]) $uriArr[1] : null; $filename = web_config::WEB_ROOT . $uri; if ($this- cgi_check($uri)) { $this- set_env($query_string); $handle = popen(web_config::WEB_ROOT.$uri, "r"); $read = stream_get_contents($handle); pclose($handle); return $this- add_header($read); // 靜態文件的處理 if (file_exists($filename)) { return $this- add_header(file_get_contents($filename)); } else { return $this- not_found(); * 設置環境變量 給 cgi 程序使用 * @param $query_string * @return bool private function set_env($query_string){ if($query_string == null){ return false; if (strpos($query_string, "=")) { putenv("QUERY_STRING=".$query_string); * 判斷請求的 uri 是否是合法的 cgi 資源 * @param $uri * @return bool private function cgi_check($uri){ $info = pathinfo($uri); $extension = isset($info["extension"]) $info["extension"] : null; if( $extension && in_array($extension,explode(",",web_config::CGI_EXTENSION))){ return true; return false; * 404 返回 * @return string private function not_found(){ $content = " h1 File Not Found /h1 return "HTTP/1.1 404 File Not Found/r/nContent-Type: text/html/r/nContent-Length: ".strlen($content)."/r/n/r/n".$content; * 加上頭信息 * @param $string * @return string private function add_header($string){ return "HTTP/1.1 200 OK/r/nContent-Length: ".strlen($string)."/r/nServer: mengkang/r/n/r/n".$string;$server = new server("127.0.0.1", web_config::PORT);以上就是PHP實現一個動態Web服務器的全部實現過程,希望對大家的學習有所幫助。PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产91热爆ts人妖在线| 亚洲欧美精品一区| 97香蕉久久夜色精品国产| 国产精品久久久999| 91精品国产自产在线| 清纯唯美日韩制服另类| 亚洲精品动漫久久久久| 久久久久九九九九| 欧美激情啊啊啊| 国产成人涩涩涩视频在线观看| 成人有码在线播放| 久久久极品av| 亚洲一区二区三区四区在线播放| 欧美成人性生活| 国语自产精品视频在线看| 日韩激情在线视频| 久久视频在线免费观看| 国内揄拍国内精品| 欧美黑人巨大精品一区二区| 国产视频在线一区二区| 成人激情视频在线播放| 91国自产精品中文字幕亚洲| 欧美专区福利在线| 色综合影院在线| 亚洲性生活视频| 日韩av免费在线播放| 日韩精品免费在线视频观看| 欧美在线亚洲一区| 日韩av在线资源| 亚洲一区二区在线| 亚洲图片欧美日产| 亚洲视频999| 国产区精品视频| 亚洲成人精品av| 国产美女搞久久| 欧美孕妇毛茸茸xxxx| 精品露脸国产偷人在视频| 国产日韩欧美中文| 亚洲精品国产福利| 国产精品美女久久久久久免费| 精品久久在线播放| 欧美专区国产专区| 日韩最新免费不卡| 九九精品在线视频| 久久久久一本一区二区青青蜜月| 欧美精品国产精品日韩精品| 欧日韩在线观看| 欧美三级欧美成人高清www| 视频直播国产精品| 成人天堂噜噜噜| 亚洲成人xxx| 成人久久精品视频| 亚洲第一男人天堂| 国产精品视频最多的网站| 91亚洲国产成人精品性色| 欧美一区二粉嫩精品国产一线天| 精品国产91乱高清在线观看| 国产精品美女主播在线观看纯欲| 亚洲aa中文字幕| 日韩久久免费视频| 国产日韩视频在线观看| 欧洲成人免费aa| 91精品久久久久久久久中文字幕| 欧美尺度大的性做爰视频| 欧美性生活大片免费观看网址| 黑人巨大精品欧美一区二区三区| 久久精品久久精品亚洲人| 欧美久久精品一级黑人c片| 国产精品视频自在线| 欧美—级a级欧美特级ar全黄| 久久久久日韩精品久久久男男| 久久久成人的性感天堂| 亚洲女成人图区| 欧美激情a在线| 久久成人精品电影| 久久成人一区二区| 国产91在线视频| 亚洲久久久久久久久久久| 亚洲午夜未满十八勿入免费观看全集| 国产成人高潮免费观看精品| 亚洲天堂男人天堂| 国产视频精品在线| 中文字幕精品www乱入免费视频| 中文字幕日韩电影| 久久不射电影网| 国产欧洲精品视频| 日韩av一区二区在线| 久久久久中文字幕| 日韩国产精品视频| 色爱av美腿丝袜综合粉嫩av| 亚洲永久在线观看| 日韩精品在线电影| 久久亚洲综合国产精品99麻豆精品福利| 亚洲色图狂野欧美| 色先锋资源久久综合5566| 最近2019中文字幕一页二页| 国产精品久久久久久搜索| 国产一区二区黑人欧美xxxx| 欧美三级欧美成人高清www| 中文欧美在线视频| 精品国产乱码久久久久酒店| 精品国产户外野外| 亚洲第一精品福利| 成人a在线视频| 色婷婷av一区二区三区久久| 欧美乱人伦中文字幕在线| www.亚洲人.com| 亚洲精品98久久久久久中文字幕| 国产精品网站入口| 最近2019年中文视频免费在线观看| 久久深夜福利免费观看| 国产精品久久久久久久久久东京| 亚洲无限av看| 久久精视频免费在线久久完整在线看| 国产成人一区三区| 国产成+人+综合+亚洲欧美丁香花| 国产999精品| 久久精品国产亚洲一区二区| 亚洲精品国产精品乱码不99按摩| 丝袜美腿亚洲一区二区| 欧美黄色成人网| 日本三级久久久| 亚洲精品国产成人| 亚洲国产精品va在线看黑人动漫| 亚洲精品一区久久久久久| 精品久久中文字幕| 美女久久久久久久久久久| 日韩精品极品在线观看播放免费视频| 国产日韩中文在线| 日韩少妇与小伙激情| 欧美成人激情图片网| 欧美一级片免费在线| 欧美一区二区影院| 亚洲在线第一页| 欧美电影免费观看| 亚洲欧美日韩精品久久亚洲区| 亚洲无av在线中文字幕| 91探花福利精品国产自产在线| 久久视频国产精品免费视频在线| 色综合老司机第九色激情| 国内免费精品永久在线视频| 成人中心免费视频| 欧美激情免费看| 992tv成人免费影院| 国产成人精品综合久久久| 亚洲美女喷白浆| 亚洲综合最新在线| 欧美成人精品三级在线观看| 欧美激情视频在线| 8090成年在线看片午夜| 国产精品久久久久久久久免费| 亚洲免费中文字幕| 久久国内精品一国内精品| 成人高清视频观看www| 亚洲欧美成人精品| 久久偷看各类女兵18女厕嘘嘘| 91久久久久久久一区二区| 国产亚洲人成a一在线v站| 永久免费看mv网站入口亚洲| 亚洲美女自拍视频| 美女999久久久精品视频| 91精品视频免费观看| 疯狂做受xxxx欧美肥白少妇| 国产成人亚洲综合青青|