- 为什么我不应该在生产环境中使用带有线程 MPM 的 Apache2?
-
PHP 是粘合剂。它是用来构建酷炫的 Web 应用程序的粘合剂,它将数十个第三方库粘合在一起,并通过直观且易于学习的语言接口使所有这些都显得像一个连贯的实体。PHP 的灵活性和强大功能依赖于底层平台的稳定性和健壮性。它需要一个可工作的操作系统、一个可工作的 Web 服务器和可工作的第三方库来粘合在一起。当这些任何一个停止工作时,PHP 需要一些方法来识别问题并快速修复它们。当你不使用完全独立的执行线程、完全独立的内存段和一个强健的沙箱来为每个请求提供一个游戏场所时,会进一步降低底层框架的复杂性,从而在 PHP 的系统中引入更多弱点。
如果你想使用线程 MPM,请查看 PHP 在自己的内存空间中运行的 FastCGI 配置。
- Unix/Windows:我的 php.ini 文件应该放在哪里?
-
在 Unix 上,默认情况下它应该位于 /usr/local/lib 中,即 <install-path>/lib。大多数人希望在编译时使用 --with-config-file-path 标志更改此设置。例如,你可以使用以下命令设置它:
--with-config-file-path=/etc
然后,你将 php.ini-development 从发行版复制到 /etc/php.ini,并对其进行编辑以进行任何所需的本地更改。
--with-config-file-scan-dir=PATH
在 Windows 上,php.ini 文件的默认路径是 Windows 目录。如果你使用 Apache Web 服务器,php.ini 将首先在 Apaches 安装目录中搜索,例如 c:\program files\apache group\apache。这样你就可以在同一台机器上为不同版本的 Apache 拥有不同的 php.ini 文件。
另请参阅有关 配置文件 的章节。
- Unix:我安装了 PHP,但是每次我加载文档时,都会收到“文档不包含数据”的消息!这是怎么回事?
-
这可能意味着 PHP 遇到了一些问题,并且正在进行核心转储。查看服务器错误日志以确定是否出现了这种情况,然后尝试使用一个小的测试用例重现问题。如果你知道如何使用 'gdb',那么在你提供带有错误报告的回溯时,它非常有用,这样可以帮助开发人员找到问题所在。如果你将 PHP 作为 Apache 模块使用,请尝试以下操作:
-
停止你的 httpd 进程
-
gdb httpd
-
停止你的 httpd 进程
-
> run -X -f /path/to/httpd.conf
-
然后使用你的浏览器获取导致问题的 URL
-
> run -X -f /path/to/httpd.conf
-
如果你正在进行核心转储,gdb 现在应该会通知你。
-
输入:bt
-
你应该在错误报告中包含你的回溯。这应该提交到 » https://github.com/php/php-src/issues
如果你的脚本使用正则表达式函数(preg_match() 及其朋友),你应该确保你已使用相同的正则表达式包编译 PHP 和 Apache。这应该在 PHP 和 Apache 1.3.x 中自动完成。
- Unix:我使用 RPM 安装了 PHP,但 Apache 无法处理 PHP 页面!这是怎么回事?
-
假设你从 RPM 包安装了 Apache 和 PHP,你需要在你的 httpd.conf 文件中取消注释或添加以下部分或全部行:
# Extra Modules
AddModule mod_php.c
AddModule mod_perl.c
# Extra Modules
LoadModule php_module modules/mod_php.so
LoadModule php5_module modules/libphp5.so
LoadModule perl_module modules/libperl.so
并添加
AddType application/x-httpd-php .php
... 到全局属性中,或添加到要添加 PHP 支持的 VirtualDomain 的属性中。
- Unix:我用 FrontPage 扩展补丁修补了 Apache,突然 PHP 不工作了。PHP 与 Apache FrontPage 扩展不兼容吗?
-
不,PHP 可以与 FrontPage 扩展一起正常工作。问题是 FrontPage 补丁修改了几个 Apache 结构,PHP 依赖于这些结构。在应用 FP 补丁后重新编译 PHP(使用 'make clean ; make')将解决问题。
- Unix/Windows:我已经安装了 PHP,但是当我尝试通过浏览器访问 PHP 脚本文件时,我得到一个空白屏幕。
-
在 Web 浏览器中执行“查看源代码”,你可能会发现你可以看到 PHP 脚本的源代码。这意味着 Web 服务器没有将脚本发送到 PHP 进行解释。服务器配置存在问题 - 仔细检查服务器配置是否符合 PHP 安装说明。
- Unix/Windows:我已经安装了 PHP,但是当我尝试通过浏览器访问 PHP 脚本文件时,我得到一个 500 服务器错误。
-
服务器在尝试运行 PHP 时出现了问题。要查看有意义的错误消息,请从命令行中,更改到包含 PHP 可执行文件(在 Windows 上为 php.exe)的目录,并运行 php -i。如果 PHP 在运行时遇到任何问题,将会显示合适的错误消息,这将为你提供有关接下来需要执行的操作的线索。如果你得到一屏幕的 HTML 代码(phpinfo() 函数的输出),那么 PHP 正在工作,你的问题可能与你的服务器配置有关,你应该仔细检查。
- 某些操作系统:我已经成功安装了 PHP,但是当我尝试启动 Apache 时,我得到未定义符号错误
[mybox:user /src/php5] root# apachectl configtest
apachectl: /usr/local/apache/bin/httpd Undefined symbols:
_compress
_uncompress
-
这实际上与 PHP 无关,而是与 MySQL 客户端库有关。一些库需要 --with-zlib,而另一些则不需要。MySQL 常见问题解答中也对此进行了说明。
- Windows:我已经安装了 PHP,但是当我尝试通过浏览器访问 PHP 脚本文件时,我得到以下错误
cgi error:
The specified CGI application misbehaved by not
returning a complete set of HTTP headers.
The headers it did return are:
-
此错误消息意味着 PHP 根本没有输出任何内容。要查看有意义的错误消息,请从命令行中,更改到包含 PHP 可执行文件(在 Windows 上为 php.exe)的目录,并运行 php -i。如果 PHP 在运行时遇到任何问题,将会显示合适的错误消息,这将为你提供有关接下来需要执行的操作的线索。如果你得到一屏幕的 HTML 代码(phpinfo() 函数的输出),那么 PHP 正在工作。
PHP 在命令行中正常工作后,请再次尝试通过浏览器访问该脚本。如果仍然失败,则可能是以下原因之一:
-
你的 PHP 脚本、php.exe、php5ts.dll、php.ini 或你正在尝试加载的任何 PHP 扩展的文件权限,使得匿名 Internet 用户
ISUR_<machinename>
无法访问它们。
-
脚本文件不存在(或者可能不在你认为的 Web 根目录中的相对位置)。请注意,对于 IIS,你可以通过在 Internet 信息服务管理器中设置脚本映射时勾选“检查文件是否存在”框来捕获此错误。如果脚本文件不存在,服务器将返回 404 错误。此外,IIS 还会根据脚本文件上的 NTLanMan 权限为你执行任何所需的身份验证。
- Windows:我已经按照所有说明操作,但仍然无法使 PHP 和 IIS 协同工作!
-
确保任何需要运行 PHP 脚本的用户都具有运行 php.exe 的权限!IIS 使用在安装 IIS 时添加的匿名用户。此用户需要 php.exe 的权限。此外,任何经过身份验证的用户也需要执行 php.exe 的权限。对于 IIS4,你需要告诉它 PHP 是一个脚本引擎。此外,你可能想阅读 此常见问题解答。
- 在将 PHP 作为 CGI 与 IIS、PWS、OmniHTTPD 或 Xitami 一起运行时,我收到以下错误:
安全警告!PHP CGI 无法直接访问。
-
您必须将 cgi.force_redirect 指令设置为 0
。默认值为 1
,因此请确保该指令没有被注释掉(用 ;
)。与所有指令一样,此指令在 php.ini 中设置。
由于默认值为 1
,因此您必须 100% 确定正在读取正确的 php.ini 文件。阅读 此常见问题解答 以获取详细信息。
- 如何知道我的 php.ini 是否被找到并读取?看起来它没有被读取,因为我的更改没有被实现。
-
为了确保您的 php.ini 被 PHP 读取,请调用 phpinfo()。在顶部附近,将有一个名为 Configuration File (php.ini)
的列表。这将告诉您 PHP 在哪里查找 php.ini 以及它是否被读取。如果只有一个目录 PATH 存在,那么它没有被读取,您应该将您的 php.ini 放入该目录。如果 php.ini 包含在 PATH 中,则它正在被读取。
如果 php.ini 正在被读取,并且您正在将 PHP 作为模块运行,那么请确保在更改 php.ini 后重新启动 Web 服务器。
另请参见 php_ini_loaded_file()。
- 如何在 Windows 上使 php.ini 文件可供 PHP 使用?
-
有多种方法可以做到这一点。如果您使用的是 Apache,请参考 Apache 文档,否则您必须设置 PHPRC 环境变量。
- 是否可以使用 Apache 内容协商(MultiViews 选项)与 PHP?
-
如果指向 PHP 文件的链接包含扩展名,那么一切正常。此常见问题解答仅适用于指向 PHP 文件的链接不包含扩展名,并且您希望使用内容协商从没有扩展名的 URL 中选择 PHP 文件的情况。在这种情况下,请将 AddType application/x-httpd-php .php
行替换为
AddHandler php5-script php
AddType text/html php
此解决方案不适用于 Apache 1,因为 PHP 模块不会捕获 php-script
。
- PHP 是否仅限于处理 GET 和 POST 请求方法?
-
不,可以处理任何请求方法,例如 CONNECT。可以使用 header() 发送正确的响应状态。如果只应处理 GET 和 POST 方法,则可以通过以下 Apache 配置实现
<LimitExcept GET POST>
Deny from all
</LimitExcept>