mod_php vs cgi vs fast-cgi

Posted

技术标签:

【中文标题】mod_php vs cgi vs fast-cgi【英文标题】: 【发布时间】:2011-04-26 14:39:12 【问题描述】:

我一直在尝试理解将 php 作为 apache 模块与其他模块相比的确切含义/目的。

当 php 作为 apache 模块安装时,究竟会发生什么?例如,每次php请求来或单独加载php模块时都会读取php-ini文件吗?

【问题讨论】:

【参考方案1】:

php.ini 在 PHP 模块在 mod_php、FastCGI 和 FPM 中加载时被读取。在常规 CGI 模式下,必须在运行时读取配置文件,因为没有任何类型的预分叉进程。

我认为在 Web 服务器中将 PHP 作为模块运行的唯一真正优势是配置可能更容易。当您在 FastCGI 或 FPM 模式下运行它并且可以使用线程或事件(而不是分叉)Apache,或者当您可以完全抛弃 Apache 时,您会获得更好的性能。

【讨论】:

所以更具体地说,假设我有一个可以被所有请求使用的变量。换句话说,假设我们必须让 php 解释器查找与特定路径(/home/user/documents)相关的文件。我能否将 /home/user/documents 存储在配置中并将其加载到某个全局变量中?这样,如果用户发出 file_get_contents("new.txt"),它就会被翻译成 file_get_contents("/home/user/documents/new.txt") 查看 PHP 设置 auto_prepend_file,这将使您有机会在解析实际请求之前预先运行 PHP 代码。在您的 auto_prepended 文件中,使用 chdir() 更改目录。请注意,这将拦截所有文件操作,甚至包括 include() 和 require()! @Karthick:为什么 PHP 解释器会存储这些信息?这类信息是让您的代码烦恼的。当您不提供文件的绝对路径时,它看起来相对于 PHP 解释器正在执行的脚本。不,不同的 PHP 解释器实例不能也不能在它们之间共享数据。 @Meher.. 因此,如果要在多个实例之间共享任何此类数据,那么唯一的方法是将它们放入配置文件并在每个请求仪式中读取它们? @Karthick - 每个请求都必须读取共享数据,但配置文件有替代方案,例如数据库、APC、memcached 或 redis【参考方案2】:

此链接可能会有所帮助:http://2bits.com/articles/apache-fcgid-acceptable-performance-and-better-resource-utilization.html

结论

如果你追求的是纯粹的速度,那就继续使用 mod_php。

但是,为了更好地利用资源和提高效率,请考虑迁移到 fcgid。

【讨论】:

引用的文章现在建议使用 2013 年 5 月的 mod_php。我还建议使用 mod_php,特别是如果在 cdn 上运行带有静态内容的大量 PHP 网站(你应该这样做)。 2019年内存便宜,cdn服务甚至可以免费,用mod_php代替fcgid。【参考方案3】:

对于 Apache 模块,在加载模块时读取 php.ini。 PHP CGI 使用 php 解释器可执行文件,就像任何其他 shell 脚本一样。由于每次调用都不涉及任何状态,因此在使用 CGI 的情况下,每次都必须读取配置文件。

【讨论】:

请阅读我刚刚发布到另一个答案的评论。看看你能不能得到那个!

以上是关于mod_php vs cgi vs fast-cgi的主要内容,如果未能解决你的问题,请参考以下文章

就内存使用而言,PHP 作为 thttpd 模块 vs CGI

apache php 与nginx php 的区别

[Linux]php+apache 和 php+nginx的区别

Wireshark vs Firebug vs Fiddler - 利弊? [关闭]

中间件漏洞|29期

CGI与Servlet的比较