PHP内置Web服务器

2020-08-24 07:34:02

警告此Web服务器旨在帮助开发应用程序。它还可用于测试目的或在受控环境中运行的应用程序演示。它不打算成为功能齐全的Web服务器。不应在公共网络上使用它。

Web服务器只运行一个单线程进程,因此如果请求被阻塞,PHP应用程序将会停止。

URI请求从启动PHP的当前工作目录提供服务,除非使用-t选项指定显式文档根目录。如果URI请求没有指定文件,则返回给定目录中的index.php或index.html。如果这两个文件都不存在,则在父目录中继续查找index.php和index.html,依此类推,直到找到一个或到达文档根目录。如果找到index.php或index.html,则返回它,并将$_SERVER[';PATH_INFO';]设置为URI的尾部。否则返回404响应代码。

如果在启动Web服务器时命令行上提供了PHP文件,则该文件将被视为路由器脚本。该脚本在每个HTTP请求开始时运行。如果此脚本返回False,则请求的资源将按原样返回。否则,脚本的输出将返回给浏览器。

将为扩展名为.3gp、.apk、.avi、.bmp、.css、.csv、.doc、.docx、.flac、.gif、.gz、.gzip、.htm、.html、.ics、.jpe、.jpeg、.jg、.js、.kml、.kmz、.m4a、.mov、.mp3、.mp4、.mpeg的文件返回标准MIME类型。.oga、.ogg、.ogv、.pdf、.pdf、.png、.pps、.pptx、.qt、.svg、.swf、.tar、.text、.tif、.txt、.wav、.webm、.wmv、.xls、.xlsx、.xml、.xsl、.xsd和.zip。

.3gp、.apk、.avi、.bmp、.csv、.doc、.docx、.flac、.gz、.gzip、.ics、.kml、.kmz、.m4a、.mp3、.mp4、.mpg、.mpeg、.mov、.odp、.ods、.odt、.oga、.pdf、.pptx、.pps、.qt、.swf、.。.xls、.xlsx和.zip。

您可以将内置Web服务器配置为派生多个工作器,以便测试需要向内置Web服务器发出多个并发请求的代码。在启动服务器之前,将PHP_CLI_SERVER_WORKS环境变量设置为所需的工作进程数。这在Windows上不受支持。

PHP 5.4.0 Development Server在清华7月21日10:43:28 2011启动收听localhost:8000文档根目录为/home/me/public_html按Ctrl-C组合键退出

PHP 5.4.0开发服务器于2011年清华7月21 10:43:28启动本地主机监听:8000Document root为/HOME/me/public_html按Ctrl-C退出。[清华7月21 10:48:48 2011]::1:39144 GET/Favicon.ico-Request Read[清华JUL 21 2011 10:48:50]::1:39146 GET/-Request Read[清华JUL 21 2011 10:48:50。52 2011年]::1:39148 GET/myscript.html-请求读取[清华7月21 10:48:52 2011]::1:39149 GET/Favicon.ico-请求读取。

请注意,在PHP 7.4.0之前,Windows上不能访问符号链接的静态资源,除非路由器脚本可以处理这些资源。

PHP 5.4.0开发服务器于清华7月21日10:50:26启动收听localhost:8000Document root为/home/me/public_html/foo按Ctrl-C退出。

在此示例中,图像请求将显示它们,但HTML文件请求将显示";欢迎使用PHP";:

<;?php//rerouter.php if(preg_match(';/\.(?:png|jpg|jpeg|gif)$/';,n$_server[";request_URI";]))n{0将返回False;继续//按原样为您请求的资源提供服务。}还有没有其他的,{}将回应";<;p>;欢迎您加入我们的PHP<;/p>;;}?>;##34;/p&>;}?>;欢迎使用PHP<;/p&>;}?>;

要在CLI Web服务器和以后的生产Web服务器的开发过程中重复使用框架路由器脚本,请执行以下操作:

<;?php//.router.php if(php_sani_name()==0';cli-server';){/*静态资产的路由,返回错误的路径*/}/*继续正常的index.php操作*/?>;

如果您需要提供其MIME类型未由CLI Web服务器处理的静态资源,请使用:

Ó要设置特定于项目的配置选项,只需将php.ini文件添加到项目中,然后使用此标志运行内置服务器:PHP-S localhost:8000-c php.ini这对于无法在运行时设置的设置(ini_set())特别有用。

?它没有直接提到,也可能不明显,但你也可以用它来创建一个虚拟主机。当然,这需要主机文件的帮助。步骤如下:1、/etc/hosts:127.0.0.1;www.example.com2、cd[根文件夹]:php-S www.example.com:80003、浏览器:*http://www.example.com:8000/index.php结合简单的SQLite数据库,拥有非常便捷的测试环境。

ä我痛苦地经历了一些行为,但我在这里似乎找不到记录在案的,所以我想给大家提个醒,以免重蹈覆辙:在Mac(在我的例子中是MacOS Sierra)上启动php-S以托管本地服务器时,我在从传统Java连接时遇到了问题。结果是,如果您使用";php-S localhost:80";启动php服务器,那么服务器将只支持IPv6!要通过IPv4访问它,您需要更改启动命令,如下所示:";php-S 127.0.0.1:80";该命令仅在IPv4模式下启动服务器。

?侦听IPv4的所有地址:PHP-S 0.0.0.0:80侦听IPv6的所有地址:PHP-S[::0]:80。

Ó要发送与PHP内置Web服务器相同的环境变量,请键入如下内容。~$MYENV=dev php-d变量_ORDER=EGPCS-S 0.0.0.0:8000在PHP脚本上,我们可以使用此代码进行检查。<;?php和echo getenv(';MYENV';);//打印开发。

如果您的URI包含点,则在使用内置Web服务器时,您将丢失$_SERVER[';PATH_INFO';]变量。我想编写一个API,并使用.json以URI-s结尾,但是后来框架的路由机制崩溃了,花了很长时间才发现它背后的原因是它的路由器依赖$_server[';path_info';]。参考文献:https://bugs.php.net/bug.php?id=61286。

Ó在WindowsShell:sendto中有一个phpserver.bat文件可能会很有用,下面是:Explorer http://localhost:8888 rem检查arg是文件还是目录";%~1\";(php-S localhost:8888-t";%~1";)否则(php-S localhost:8888-t";%~dp1";)那么要快速进行网络测试,您只需。

Ó要在命令行上输出调试信息,可以将输出写入到php://stdout:<;?php$path=$_server[";script_filename";];file_put_content(";php://stdout";,";\n请求的:$path";);echo";<;p>;Hello World<;/p>;&#

?仅向也使用Windows 8.1的用户或在使用PHP服务器CLI运行时遇到此问题的任何人发出提示。`PHP-S localhost:8000-t/public`<;--不工作。`PHP-S localhost:8000-t public`<;--works!此外,笔记中还提到了一些关于您不能为项目文件夹和路由器文件提供服务的内容。嗯,事实上你可以的!至少对我来说是这样。`PHP-S localhost:8000 router.php-t public`<;--可能有人尝试了一下,但它不起作用。`PHP-S localhost:8000-t public router.php`<;--works!

ä我摆弄着内部网络服务器,在处理静态文件时遇到了问题,这些静态文件不包含点和文件扩展名。Web服务器返回200,但没有任何URI文件(如";/testfile";)的内容。我不确定这是否是bug,但是我创建了一个router.php,它现在不使用";return false;";操作,以便通过内部Web服务器传递静态文件。相反,我使用fpassthu()来实现这一点。除此之外,我的router.php可以配置为...。-.。具有某些索引文件,在请求目录时...。配置正则表达式路由,以便如果REQUEST_URI与正则表达式匹配,则改为请求某个文件或目录。(您可以使用nginx config或.htaccess ModRewrite来做一些事情)也许有人会觉得这很有帮助。=<;?PHP$indexFiles=[';index.html';,';index.php';];$routes=[';^/api(/.*)?$';=&>;';/index.php';];$request。$_SERVER[';REQUEST_URI';];//检查请求是否匹配其中一个定义的路由foreach($routes as$regex=>;$fn){*if(preg_Match(';%';。$regex。';%';,$_SERVER[';REQUEST_URI';]),{$requstedAbsoluteFile=dirname(__File__)。$fn;$Break;$}}//如果请求是目录调用,请检查索引文件是否存在,条件是(is_dir($requstedAbsoluteFile)){5foreach($indexFiles as$filename)和{requstedAboluteFile=$requstedAboluteFile。';/';。$filename;如果(IS_FILE($FN)),则$filename;如果请求的文件不存在或is directory=>;404 if(!),则返回{_file($fn)/{requstedAbsoluteFile=$fn;$Break;${}//如果请求的文件不存在或is directory=>;404 if(!Is_file($requstedAbsoluteFile)){标头($_server[';server_protocol';]。';404未找到';);$printf(';";%s";不存在';,$_server[';Request_URI';]);如果请求的文件是';NT php文件,则返回true;}//如果(!Preg_Match(';/\.php$/';,$requstedAbsoluteFile){标题(';Content-Type:';。MIME_CONTENT_TYPE($requstedAbsoluteFile));*$fh=fopen($requstedAbsoluteFile,';r';);*fpassthu($fh);*fclose($fh);将返回true;}//如果请求的文件是php,则将其包括在内_once$requtedAboluteFile;

?我的路由文件如下所示:if(file_exists($_SERVER[";DOCUMENT_ROOT";]。$_SERVER[";REQUEST_URI";])){返回FALSE;}否则{需要";index.php";;}原因是要支持所有静态文件。

?将php用作内置命令行Web服务器时,未定义$$_SERVER[';SERVER_ADDR';],因此不能使用$_SERVER[';SERVER_ADDR';]检测服务器的IP地址。附注:这是在2016-12-22年12月7日在Windows PHP 7.1上测试的。下面是打印的$_SERVER变量。数组([文档根]=>;E:\Programs\PHPServer\www\srv)[远程地址]=>;118.117.61.32)[远程端口]=>;10865:[服务器软件]=>;PHP 7.1.0开发服务器地址[服务器协议]=>;HTTP/1.1.[服务器名称]=>;0.0.0.0%[服务器端口]=>。8080GET[请求URI]=>;/;[请求方法]=>;获取[脚本名称]=>;/index.php文件名[脚本文件名]=>;E:\Programs\PHPServer\www\srv\index.php=[PHP_Self]=>;/index.php;[HTTP_HOST]=>;www.wuxiancheng.ct;[HTTP_HOST]=>;www.wuxiancheng.cn。保持活动状态[HTTP_CACHE_CONTROL]=&gT;MAX-AGE=0;[HTTP_UPDATE_INSECURE_REQUESTS]=&>1个[HTTP_USER_AGENT]=&gT;MOZILLA/5.0(Windows NT6.1;Win64;x64)AppleWebKit/537.36(KHTML,如壁虎)Chrome/55.0.2883.87 Safari/537.36*[HTTP_Accept]=>;Text/HTML,application/xhtml+。Q=0.8%[HTTP_DNT]=>;1%[HTTP_ACCEPT_ENCODING]=>;gzip,DEFLATE,SDCH=[HTTP_ACCEPT_LANGUAGE]=&gT;zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4%[HTTP_cookie]=>;qbbs_2132_saltkey=fZ7509n5;qbbs_2132_lastkey。Hm_lvt_6a65b0f2004e441e86ecea9c3562d997=1482232509,1482241896,1482242293,1482296586:[请求时间浮点]=>;1482390410.65625;[请求时间]=>;1482390410)。

Ó当我需要启动服务器以使用重写进行开发时,我使用它://php-S 0.0

您还可以通过ERROR_LOG()将消息打印到服务器的STDOUT。此外,文档没有明确说明,当您使用路由器脚本时,如果请求PHP文件,并且您返回False,则将提供PHP文件(即,您不需要手动加载和评估它)。

Ó我改进了伊万·费雷尔的phpserver.bat,以便直接在浏览器中打开发送到文件:-rem检查arg是文件还是目录";%~1\";(资源管理器http://localhost:8888:php-S localhost:8888-t";%~1";)否则(资源管理器http://localhost:8888/%~nx1:php-S localhost:8888-t";%~dp1";%~dp-S localhost:8888-t";%~dp-S localhost:8888-t";%~dp1";)。

?在我的Mac(High Sierra)PHP 7.2服务器和Laravel Valet上执行shell脚本时,我发现了一个奇怪的问题。路径=/usr/bin:/bin:/usr/sbin:/sbin是默认的Mac路径,但没有考虑.bash_profile中的shell路径,这意味着找不到MySQL和其他实用程序。是否有在执行时注入路径变量的解决方法。

?如果您遇到此错误:未知:php_network_getaddress:getaddrinfo失败,请尝试此操作:1.确保您的主机文件中有`localhost`条目2.或使用`php-S 127.0.0.1:8888`。

Ó注意:内置Web服务器有文件大小限制。对于大于5 GB的文件,它将始终显示找不到文件错误页。

Ó要设置特定于项目的配置选项,只需将php.ini文件添加到项目中,然后使用此标志运行内置服务器:PHP-S localhost:8000-c php.ini这对于无法在运行时设置的设置(ini_set())特别有用。

ÓSubmit_btn.addEventListener(MouseEvent.CLICK,sendMessage);函数sendMessage(e:MouseEvent):void{var my_vars:URLVariables=new URLVariables();my_vars.senderName=name_txt.text;my_vars.senderEmail=email_txt.text;my_vars.senderMsg=message_txt.text;var my_ur。My_loader.dataFormat=URLLoaderDataFormat.VARIABLES;my_loader.load(My_Url);name_txt.text=";";;email_txt.text=";";;message_txt.text=";;}