基于PHP的Web应用程序与CGI

基于PHP的Web应用程序与CGI,php,web-applications,Php,Web Applications,我已经使用Java webapps工作了很长一段时间了。我想知道基于PHP的Web应用程序与基于Java的Web应用程序有何不同。我可以在安全性、图书馆的可用性等方面找到一些差异 基本上,基于Java(servlet)的Web应用程序是多线程环境,通过单个进程满足不同请求的需要。这在PHP中是如何工作的 a) 每个请求都是一个过程吗?在这种情况下,我们如何确保内存利用率和其他共享资源得到控制 b) 在基于PHP的Web应用程序中是否有一个称为应用程序范围/单例的概念 c) 我们可以有连接池吗 基

我已经使用Java webapps工作了很长一段时间了。我想知道基于PHP的Web应用程序与基于Java的Web应用程序有何不同。我可以在安全性、图书馆的可用性等方面找到一些差异

基本上,基于Java(servlet)的Web应用程序是多线程环境,通过单个进程满足不同请求的需要。这在PHP中是如何工作的

a) 每个请求都是一个过程吗?在这种情况下,我们如何确保内存利用率和其他共享资源得到控制

b) 在基于PHP的Web应用程序中是否有一个称为应用程序范围/单例的概念

c) 我们可以有连接池吗

基本上,PHP与CGI有何不同


对于PHP开发人员来说,这个问题可能听起来很愚蠢。我很高兴知道已经有一个地方记录了这些差异。谢谢。

Java web应用程序由一个有状态的、长期运行的Java进程托管(即在其中运行);因此,您可以利用内存中的对象缓存和操作线程的能力

标准CGI模型(目前忽略FastCGI)相当简单:启动一个进程并将其传递给传入的HTTP请求。CGI进程自己处理请求(如果需要,包括创建自己的线程),然后将HTTP响应返回给生成子CGI进程的进程。然后CGI进程被终止——因此内存中保存的任何内容都将丢失,并且必须序列化到某种持久性介质,例如数据库或磁盘上的文件

(推测:CGI的设计可能与20世纪90年代早期服务器上可用的有限资源有关,以及网站不常被访问,所以这样使用内存是没有意义的;最后,如果你正在从事一个巨大的可扩展项目,那么你可能不会对内存缓存感兴趣,因为你会有一个d状态服务器)

PHP是一个CGI系统,因此它继承了“每个请求一个服务器进程”模型的局限性——比如不支持线程:这似乎是PHP开发人员有意识的决定,因为它极大地简化了系统(例如,不必担心同步,因为PHP可能是头号“初学者语言”)现在,不给他们足够的绳子来吊死自己是有意义的)-此外,如果你需要在WebService场景中使用多线程,那么PHP可能是一开始就使用的错误工具

PHP与CGI没有什么不同——PHP实现CGI。Java Web服务器不使用CGI(至少不为Java应用程序服务,请注意,确实存在Java servlet主机的CGI实现,但不要让事情复杂化)


因为PHP不是有状态的,这意味着它不能共享连接—但实际上这不是问题。当你将PHP与MySQL配对时,你会发现操作出人意料地便宜。你可以连接到数据库,从SELECT中获取一些数据,并返回一个格式良好的HTML表,即使在一台十年前的机器上,这一切都在5毫秒内完成。这不会让你感到惊讶只要页面生成时间保持在30毫秒以下,您就可以使用什么平台(我个人的目标时间限制是为了获得良好的用户体验).

虽然PHP可以通过CGI使用,但通常情况下并非如此。mod_PHP是web服务器和PHP程序之间的常用接口方式。
mod_PHP
仅适用于Apache。其他服务器如IIS、lighthttpd等不使用此功能。也有ISAPI构建。但是,无论您使用哪种web服务器API,PHP仍然是无状态的,因此可能会混淆rm是CGI提供的最低通用功能。@Quentin..mod_php在原理上与CGI不同吗?就像它仍然是每个请求一个进程/没有对连接池等的固有支持一样。
mod_php
的rite?@Gopal php脚本在Apache进程内运行,但仍然在单个线程下运行。
mod_php
的使用是不可能的不推荐使用Zend server,因为它会使网站之间的隔离和沙箱更加困难:@Gopal:您可以使用ZendServer/ZendCluster扩展PHP。Zend server是完整的应用程序服务器,它有线程池、连接pol等。请阅读www.Zend.com上的更多信息