我最近对PHP 5.4的内置网络服务器感到好奇。从表面上看,虽然相当准确,但有足够的工作,可以将传统上依赖于单独的Web服务器的PHP应用程序(如WordPress)作为独立脚本分发,您可以使用php -S localhost:80 app.php
运行(或者,更有可能的是,'./wordpress.sh'
)。他们甚至可能附带自己的PHP解释器,它具有应用程序所需的所有功能,这样就无需针对许多不同版本的语言。
它在某种程度上重新发明了轮子,但它肯定会增加便携性并降低最终用户的复杂性。
但是,我在documentation page上看到了以下内容:
此Web服务器旨在帮助应用程序开发。它也可用于测试目的或在受控环境中运行的应用程序演示。它不是一个功能齐全的Web服务器。它不应该在公共网络上使用。
这显然会引用正确的文件系统安全性和提供正确的HTTP标头等问题,这些问题可以解决。但是,还有更多吗?在无法解决的生产环境中使用PHP的内置Web服务器是否存在固有的安全问题和/或技术限制?如果是这样,他们是什么?
答案 0 :(得分:16)
我可以想到许多操作问题,为什么你不想这样做:
但是,有一个解决方案,您可以通过其内置的Web服务器获得运行PHP的大部分好处,同时获得预先运行Web服务器的大部分好处。也就是说,您可以使用像Nginx这样的服务器作为PHP内置Web服务器的反向代理。在这种情况下,HTTP成为FastCGI的替代品,类似于Node.js应用程序中内置HTTP服务器的常见用法。
现在,由于我不是PHP作者之一,我无法在文档中说明警告的细节。如果是我,我不会因为上述原因单独运行PHP,但我可能考虑在像Nginx这样的真实Web服务器后面运行它。不过对我来说,使用PHP-FPM设置PHP并没有那么困难,我会考虑一下内置服务器的适航性,该内置服务器只能用于测试。
答案 1 :(得分:6)
PHP内置Web服务器的问题在于它是单线程!
这会影响性能和安全性。对性能的影响显然是一次只能为一个用户提供服务(直到一个请求完成,另一个请求无法启动)。
安全隐患是,使用简单的开放套接字发送少量数据(类似于Slow Loris),使DOS服务器很容易。
它对于没有拒绝服务风险的简单的一页非交互应用程序很有用。
答案 2 :(得分:3)
PHP的内置服务器仅支持HTTP / 1.0,这意味着客户端必须为每个请求建立新的TCP / IP连接。这很慢。
答案 3 :(得分:-3)
它不适合生产使用,可能无法正常处理崩溃和内存泄漏,从而引发稳定性问题。更重要的是,PHP本身明确警告:
警告此Web服务器旨在帮助开发应用程序。它也可用于测试目的或在受控环境中运行的应用程序演示。它不是一个功能齐全的Web服务器。它不应该在公共网络上使用。