2010-10-17 72 views
46

我一直在试图理解加载php作为apache模块vs其他的准确意义/目的。mod_php vs cgi vs fast-cgi

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

回答

22

php.ini是在mod_php,FastCGI和FPM都加载了PHP模块的情况下读取的。在常规的CGI模式下,配置文件必须在运行时读取,因为没有任何预先制作的进程。

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

+0

所以更具体一点说,如果我有一个可以被所有请求使用的变量。换句话说,假设我们必须让php解释器查找与cerstain路径相关的文件(/ home/user/documents)。我能够将/ home/user/documents存储在配置中并将其加载到一个全局变量中吗?这样,如果用户发出file_get_contents(“new.txt”),它会被转换为file_get_contents(“/ home/user/documents/new.txt”) – 2010-10-17 15:30:00

+0

检查PHP设置auto_prepend_file,这会给你机会添加PHP代码在解析实际请求之前运行。在您的auto_prepended文件中,使用chdir()更改目录。请注意,这将拦截所有文件操作,甚至包括()和require()! – 2010-10-17 15:35:18

+1

@Karthick:为什么PHP解释器会存储这些信息?这类信息对于你的代码来说很麻烦。当你不给文件的绝对路径时,它看起来与PHP解释器正在执行的脚本相关。不,不同的PHP解释器实例不能也不能在它们之间共享数据。 – Anand 2010-10-17 15:37:05

2

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

+0

请阅读我刚发布给其他答案的评论。看看如果你能得到那一个! – 2010-10-17 15:31:08

相关问题