我已经使用Java webapps了很长一段时间了。我想知道基于PHP的webapps与基于Java的webapps有何不同。我可以找到一些关于安全性,库的可用性等方面的差异,
基本上,基于Java(servlet)的webapps是多线程环境,通过单个进程可以满足不同请求的需求。这在PHP中如何工作?
a)每个请求都是一个进程吗?在这种情况下,我们如何确保内存利用率和其他共享资源得到控制?
b)在基于PHP的webapps中是否有一个名为application scope / singleton的概念?
c)我们可以有连接池吗?
基本上,PHP与CGI有何不同?
这个问题对于PHP开发人员来说可能听起来很愚蠢我很高兴知道已经有一个记录差异的地方。感谢。
答案 0 :(得分:2)
Java Web应用程序托管(即在其中运行)有状态的,长期运行的Java进程;因此,您可以利用内存中对象缓存和操作线程的能力。
标准CGI模型(暂时忽略FastCGI)非常简单:启动进程并传入传入的HTTP请求。 CGI进程处理请求本身(如果需要,包括创建自己的线程),然后将HTTP响应返回到生成子CGI进程的进程。然后终止CGI进程 - 因此保留在内存中的任何内容都将丢失,并且必须序列化为某种持久性介质,例如磁盘上的数据库或文件。
(推测:CGI的设计可能与20世纪90年代早期服务器上可用的有限资源有关,以及如何不经常访问网站,因此使用这样的内存是没有意义的;最后如果你'重新开发一个巨大的可扩展项目,那么你可能不会对内存缓存感兴趣,因为你将拥有一个专用的状态服务器。)
PHP是一个CGI系统,所以它继承了“每个请求一个服务器进程”模型的限制 - 就像不支持线程一样:它似乎是PHP开发人员的有意识的决定,因为它极大地简化了系统(不需要)例如,担心同步,并且因为PHP可能是头号“初学者的语言”,现在有理由不给他们足够的绳索来挂起自己) - 除此之外,如果你需要在webserving场景中使用多线程,那么PHP可能是首先使用的错误工具。
PHP与CGI没有什么不同 - PHP实现了CGI。 Java Web服务器不使用CGI(至少不提供Java应用程序,并注意到存在Java servlet主机的CGI实现,但不要让事情复杂化。)
因为PHP不是有状态的,这意味着它无法汇集连接 - 但实际上这不是问题。当您将PHP与MySQL配对时,您会发现操作非常便宜。您可以连接到数据库,从SELECT中获取一些数据,并在5ms内返回格式良好的HTML表,即使在十年前的机器上也是如此。只要页面生成时间保持在30毫秒(我的个人客观时间限制以获得良好的用户体验),您使用的平台无关紧要。