目前我正在使用PHP编程,我发现只能使用PHP CL加载网页,所以我不明白为什么我们必须安装像Apache或Nginx这样的其他服务器。
答案 0 :(得分:4)
我不知道为什么你的问题被否决了。我认为这是一个关注一个稍微宽泛但高度相关的问题的问题:为什么我们要特别小心地只让特定的软件进入面向公众的基础设施?而且,更一般地说,什么样的软件可以放在面向公众的基础设施上?其必然结果是,良好的服务器软件是什么样的?
首先,没有安全软件这样的东西。这意味着您应始终对打开计算机上的单个端口以启用网络连接(在任一方向上)的任何内容持怀疑态度。然而,有一小部分软件已经有足够的眼球来保证一定的最低水平的保证,事情可能不会出现可怕的错误。 Apache是目前经过时间考验最多的服务器,就现代网络服务器而言,Nginx紧随其后。对于面向公众的系统而言,内置的PHP HTTP服务器不是一个好的选择,更不用说测试生产软件,因为它缺乏良好的网络服务器设计质量,并且可能存在未被发现的安全漏洞。出于这些原因和其他原因,开发人员不得使用内置PHP服务器的警告。之所以添加它是因为用户不断要求它,但这并不意味着它应该被使用。
不信任由不知道自己在做什么的人编写的网络服务器也是一个好主意。我经常看到用Node或Go编写的构思错误的网络服务器,通常是基于WebSocket的解决方案,或者只是用来解决另一个软件的某些问题,这隐含地打开了基础设施中的安全漏洞,即使作者没有打算这样做。仅仅因为某人可以做某事并不意味着他们应该这样做,而且在编写网络服务器时,他们不应该这样做。这些服务器经常在Apache或Nginx后面代理,这可以防御标准攻击。但是,一旦攻击者超越了Apache或Nginx的防御,就可以通过软件来提供自己的防御,遗憾的是,几乎总是缺乏这种防御。因此,每当我看到在主机上运行代理服务时,我就会为自己不可避免的安全灾难做好准备 - Ruby,Node和Go开发人员是最大的冒犯者。开发人员决定编写网络服务器的那一刻是他们可能选择错误策略的那一刻,除非他们有非常具体的理由这样做并且必须意识到并准备好抵御各种各样的攻击场景。在完成编写网络服务器(可扩展或其他)的极其困难的任务之前,开发人员需要精通各种各样的学科。根据我的经验,很少有开发人员实际上能够胜任这项任务,而不会给他们自己或他们的用户带来重大安全漏洞。基础设施。虽然PHP核心开发人员通常知道他们在其他地方做了什么,但我个人在他们的核心网络逻辑中发现了几个关键错误,这表明他们在该部门中缺乏共同点。因此,如果有的话,应该谨慎使用他们的内置Web服务器。
除了安全性,Apache和Nginx旨在处理"加载"比内置的PHP服务器更多。什么负载意味着问题的答案,"每秒可以提供多少请求?"答案实际上非常复杂。根据代码复杂性,托管内容,正在使用的硬件以及在任何时间点运行的内容,单个主机可以处理每秒20到20,000个请求,并且该数量可能随时变化很大。 Apache附带了一个名为Apache Bench(ab)的工具,可用于对Web服务器的性能进行基准测试。但是,基准测试应该始终采用一定的考虑因素并从“34”的角度来看待。我们能否让这个应用程序更快?"而不是"我的应用程序比你的更快。"
就开发PHP软件而言(因为SO是一个编程问题网站),我建议尽可能最好地镜像您的生产环境。如果Apache将远程运行,那么在本地运行Apache可以提供真实的最佳模拟,这样就不会有一堆最后的惊喜。在Apache模块下运行的PHP代码可能与在内置PHP服务器下运行的PHP代码有明显不同的行为(例如$ _SERVER差异)!
如果你像我一样并且不喜欢设置Apache和PHP并且不需要Apache一直运行,我会维护一组脚本来设置Apache,PHP和Apache的可移植版本。用于Windows的Maria DB(大致相当于MySQL):
https://github.com/cubiclesoft/portable-apache-maria-db-php-for-windows/
如果您的软件应用程序实际上是要使用内置的PHP服务器运行(例如仅限本地主机服务器),那么我强烈建议您引入一个缓冲层,例如CubicleSoft WebServer类:
https://github.com/cubiclesoft/ultimate-web-scraper/
通过使用像这样的PHP用户类,您可以获得内置PHP服务器无法提供的某些保证,同时仍然是纯PHP解决方案(即没有额外的依赖性):缓冲区溢出机会更少(如果有的话),服务器通过Zend Engine进行解释,从而减少了恶意代码执行机会,并且具有比内置服务器更多的功能,包括完全自定义服务器请求/响应周期本身。 PHP本身可以在操作系统启动期间使用类似于Service Manager的工具启动这样的服务器:
https://github.com/cubiclesoft/service-manager/
当然,这意味着用户必须信任应用程序打开端口才能在其计算机上运行的代码。例如,如果网站通过用户的Web浏览器启动端口扫描localhost端口会发生什么?而且,如果他们确实找到了运行您的软件的端口,那么该网站是否可以开始删除文件或运行安装恶意软件的代码?这种不寻常的攻击会让你真正绊倒你。 A"零开放端口"使用"断开网络电缆/禁用WiFi"策略是真正保护设备的唯一已知方法。每个开放端口和已建立的连接都存在风险。
良好的基于网络的软件将经过战斗测试并能够抵御各种攻击。编写此类软件是一项责任,需要花费大量时间才能做到正确,并且通常会显示它是否出错。 PHP的内置服务器感觉很草率,缺乏基本的配置选项。我无法出于任何合理目的推荐其使用。
答案 1 :(得分:2)
如果您参考PHP文档:
警告
此Web服务器旨在帮助应用程序开发。有可能 也可用于测试目的或应用程序演示 在受控环境中运行。它不打算成为一个 功能齐全的网络服务器。它不应该在公共网络上使用。
http://php.net/manual/en/features.commandline.webserver.php
是的,正如它所述,这是一个用于测试目的的好工具。您可以快速启动服务器并在浏览器中测试脚本。但这并不意味着它提供了生产级服务器(如apache或Nginx :)所具有的所有功能。
您可以在本地开发环境中使用内置服务器。但是,您应该在生产环境中使用更安全,功能丰富的Web服务器,这需要更多安全性,处理大量请求等功能。