mod_php与cgi与fast-cgi的区别

55

我一直在努力理解将php作为apache模块加载与其他方式的确切意义/目的。

当php被安装为apache模块时,会发生什么?例如,读取php-ini文件是每次出现php请求时发生还是仅在加载php模块时进行?

3个回答

25

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

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


1
@Karthick:为什么PHP解释器要存储这些信息?这种信息应该由你的代码处理。当你没有给一个文件一个绝对路径时,它相对于被PHP解释器执行的脚本。不同的PHP解释器实例不能并且不应该共享数据。 - Anand
3
@Karthick - 共享数据必须被每个请求读取,但是有一些替代配置文件的方法,例如数据库、APC、memcached或redis。 - Mark Baker
为什么你这么说?在FastCGI或FPM模式下运行可以获得更好的性能。 - Val Kornea
@vladkornea 因为你可以运行一个线程或事件驱动的Apache而不是使用prefork。PHP不是线程安全的。当你的CPU接近100%工作时,你会获得最佳性能,但不能超过100%。Prefork Apache有数百个进程,每个连接一个进程,所有进程都在争夺CPU,协调很少。因此,由于上下文切换和类似的低效率,您会浪费时间。在基于事件的系统中,您可能有一两个Apache worker可以处理数千个连接。然后,每个CPU有1个应用程序服务器(例如一个FastCGI进程)。 - Emil Vikström
更多的进程总是意味着更多的开销。上下文切换很昂贵。CPU缓存未命中也很昂贵。各种锁争用都会带来问题。有一种折衷方案可以减少Apache进程的数量:在预派生的Apache前面放置Nginx作为反向代理通常可以获得大部分好处。我们在需要Apache的服务器上使用这种方法。 - Emil Vikström
显示剩余4条评论

14

2
引用的文章现在建议使用mod_php,截至2013年5月。我也建议使用mod_php,特别是如果您正在运行一个PHP重型网站,并在CDN上使用静态内容(这是您应该做的)。 2019年的RAM很便宜,CDN服务甚至可以免费,使用mod_php而不是fcgid。 - Tim Eckel

2

当Apache模块加载时,会读取php.ini文件。PHP CGI使用类似于任何其他shell脚本的php解释器可执行文件。由于每次调用都没有状态涉及,所以在CGI的情况下必须每次都读取配置文件。


请阅读我刚刚发布在另一个答案中的评论。看看你能否理解它! - Karthick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接