PHP語言是目前世界上應(yīng)用最廣的服務(wù)器腳本語言之一,有非常強(qiáng)大的網(wǎng)頁開發(fā)功能。為了方便開發(fā)人員,PHP內(nèi)置了一個(gè)輕量級(jí)的Web服務(wù)器——PHP內(nèi)置Web服務(wù)器(Built-in Web Server),簡稱BWS。
相對(duì)于Apache、Nginx等成熟的Web服務(wù)器,PHP內(nèi)置Web服務(wù)器更加輕便易用。使用PHP內(nèi)置Web服務(wù)器,我們可以在開發(fā)時(shí)快速啟動(dòng)服務(wù),并且在調(diào)試時(shí)不依賴于獨(dú)立的Web服務(wù)器。
// 啟動(dòng)內(nèi)置Web服務(wù)器 php -S localhost:8000
使用簡單,但是PHP內(nèi)置Web服務(wù)器也有一些限制:
- 不支持.htaccess文件;
- 不支持HTTPS;
- 不支持虛擬主機(jī);
- 不支持URL重寫等高級(jí)功能。
然而,對(duì)于簡單的網(wǎng)站開發(fā)和小型項(xiàng)目,PHP內(nèi)置Web服務(wù)器已經(jīng)足夠使用。
假設(shè)我們有一個(gè)偽靜態(tài)的URL配置,需要在Apache或Nginx中對(duì)服務(wù)器進(jìn)行配置,然而,如果使用PHP內(nèi)置Web服務(wù)器,我們可以使用PHP本身提供的Rewrite模塊:
<?php function handleRequest() { if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) { return false; // 靜態(tài)文件請(qǐng)求則直接返回文件內(nèi)容 } else { // 其余請(qǐng)求都進(jìn)行URL重寫 $_SERVER["SCRIPT_NAME"] = "/index.php"; $_SERVER["PHP_SELF"] = "/index.php"; include_once __DIR__ . $_SERVER["SCRIPT_NAME"]; } } handleRequest(); ?>
與此同時(shí),我們還能使用PHP內(nèi)置的多線程服務(wù)器工作原理,提高服務(wù)器的并發(fā)性能。以下是一個(gè)簡單實(shí)現(xiàn):
<?php $server = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr); while ($conn = stream_socket_accept($server)) { stream_copy_to_stream($conn, $child_stdin = tmpfile()); $pid = pcntl_fork(); if ($pid == -1) { die("Could not fork"); } else if ($pid) { // 父進(jìn)程,關(guān)閉子進(jìn)程的輸入流 fclose($child_stdin); } else { // 子進(jìn)程,處理客戶端請(qǐng)求 fseek($child_stdin, 0); $data = stream_get_contents($child_stdin); fwrite($conn, "HTTP/1.0 200 OK\r\n\r\n"); fwrite($conn, "Hello World!"); fclose($conn); exit(0); } } ?>
總之,PHP內(nèi)置Web服務(wù)器既可以快速啟動(dòng),也可以通過PHP實(shí)現(xiàn)高并發(fā)等復(fù)雜的工作原理。盡管它有其自身的限制,但對(duì)于初學(xué)者和簡單的網(wǎng)站項(xiàng)目來說,它是一個(gè)非常實(shí)用的工具。