在许多语言中,您可以从头开始构buildWeb框架(即从unix套接字)和抽象层。 如果我想在OCaml或C中从零开始构buildWeb框架,我首先构build一个侦听端口80的套接字服务器。
就像我之前想到的那样,PHP和其他更高级的语言一样可能会以某种方式包装unix套接字。 现在我知道这是从来没有如何devisePHP的情况。 不过,我不明白为什么从来没有这样用过。 沿着同样的路线,PHP解释器不会像Python解释器那样以这种方式使用。
例如,当我从零开始构build一个Python Web服务器并进行部署时,我执行以下操作:在某个端口(例如8000)上连接一个unix套接字,守护程序如python server.py 8000 ,并在端口上有nginx反向代理80并转发到我的内部本地服务器端口8000.我从来没有看到这在PHP中完成,即使这是可能的。
我会承认,除了使用解释器独立(即龙卷风,uwsgi等)之外,您还有其他Python选项。 但是,这是两种方式。
我的问题是,PHP语言,解释器或社区的哪些方面阻止了PHP web框架从unix套接字调用完全build立起来,在本地端口上守护进程,并被反向代理而不是使用cgi / fastcgi包装?
总之,历史。 这是一个非常简短的15年以上的历史总结(如果你真的感兴趣,你可以在互联网上find更多的信息):
首先,虽然PHP具有编程语言的所有function,但并不总是如此。 它起初是一个“超文本预处理器”,其目的是embedded在HTML页面中,并由CGI程序或Web服务器本身进行parsing。 这意味着要由一个现有的Web服务器运行,而不是一个Web服务器。 在早期的迭代中,这是一个非常简单的语言(有人会说这仍然是)。
PHP的历史可以追溯到20世纪90年代后期,当时Web服务器运行dynamic内容的唯一方法就是通过CGI 。 然而CGI的大问题在于它很慢,因为它为每个请求都分配了一个新的进程。 早期没有什么大不了的,但是当互联网泡沫破裂时,它就成了一个问题。 PHP变得stream行起来,它作为一个可加载的模块被embedded到Apache中,这比CGI提供了更好的性能,并提供了一些其他的好处。
最长的时间,PHP只能以这两种方式之一运行,但由于它已成为绝大多数市场份额的语言,没有人真正关心。 虽然最终有人想使用Apache以外的服务器,但是一段时间以来,CGI才是唯一的方法,直到一个名为php-fpm (FastCGI Process Manager)的FastCGI服务器API最终被提交到PHP中。 与CGI不同,FastCGI保持一个进程池始终运行,并准备好为传入的请求提供服务。
在二十一世纪还有其他语言,它们做不同的事情。 例如,在Ruby应用程序库中运行的是所谓的gem,只需将一些现有的gem与业务逻辑结合在一起,就可以轻松创build一个程序。 Rack是一个Ruby gem,它提供了一个用于构buildweb服务器的Ruby API,而像mongrel,unicorn,thin等这样的服务器以及像Rails和Sinatra这样的框架就构build在它之上。
其他语言如Python和Java也有类似的Web服务器和Web服务器框架。 正如你所看到的,这是一种与PHP所采用的完全不同的方法,它通常不使用HTTP来提供请求。
但是,最近的PHP版本现在有一个“ 内置的Web服务器 ”,但是它相对较新 ,一次只能处理一个连接,不适合生产使用。 它明确地为开发者使用而devise。
最终归结为:PHP被devise为在现有HTML文档的上下文中工作,而Python,Ruby,Java等其他语言则是通用的。 我所知道的唯一的其他networking语言就像PHP在这方面的作用是微软的“经典”的ASP ,它有一个类似的devise。
没有。 您可以使用任何语言来侦听任何端口,并在协议规则(在这种情况下是HTTP )内回应。 没有什么说这是不可能的PHP 。 你可以将它绑定到套接字,或者简单地读写STDIN , STDOUT并从xinet启动,甚至可以与其他应用程序(如apache或nginx ,这些应用程序知道的HTTP比大多数人想要在他们的拥有。