Java Web 应用程序托管(即在其中运行)有状态的、长时间运行的 Java 进程;因此,您可以利用内存中的对象缓存和操作线程的能力。
标准 CGI 模型(暂时忽略 FastCGI)相当简单:启动一个进程并传递传入的 HTTP 请求。CGI 进程自己处理请求(包括创建自己的线程,如有必要),然后将 HTTP 响应返回给生成子 CGI 进程的进程。然后 CGI 进程被终止 - 所以任何保存在内存中的东西都会丢失,并且必须序列化到某种持久性介质,例如磁盘上的数据库或文件。
(推测:CGI 的设计可能与 1990 年代初期服务器上可用的资源有限有关,以及网站如何不经常访问,因此使用这样的内存没有意义;最后,如果你正在研究一个巨大的可扩展项目,那么您可能不会对内存缓存感兴趣,因为您将拥有一个专用的状态服务器)。
PHP 是一个 CGI 系统,因此它继承了“一个请求一个服务器进程”模型的限制——至于不支持线程:这似乎是 PHP 开发人员的一个有意识的决定,因为它极大地简化了系统(无需担心例如,同步,并且因为 PHP 可能是当今排名第一的“初学者语言”,所以不要给他们足够的绳索来吊死自己是有道理的)——此外,如果您需要在 web 服务场景中使用多线程,那么 PHP 可能是首先使用错误的工具。
PHP 与 CGI 没有什么不同 - PHP 实现了 CGI。Java 网络服务器不使用 CGI(至少不为 Java 应用程序提供服务,请注意确实存在 Java servlet 主机的 CGI 实现,但我们不要让事情复杂化)。
因为 PHP 不是有状态的,这意味着它不能池化连接——但实际上这不是问题。当您将 PHP 与 MySQL 配对时,您会发现操作非常便宜。您可以连接到数据库,从 SELECT 中获取一些数据,并在 5 毫秒内返回格式精美的 HTML 表格,即使在十年前的机器上也是如此。只要页面生成时间保持在 30 毫秒以下(我个人对良好用户体验的客观时间限制),您使用什么平台都没有关系。