安装

本节包含有关安装 PHP 的常见问题。PHP 几乎适用于所有操作系统和所有 Web 服务器。

要安装 PHP,请按照 安装和配置 中的说明进行操作。

  1. 为什么我不应该在生产环境中使用带有线程 MPM 的 Apache2?
  2. Unix/Windows:我的 php.ini 文件应该放在哪里?
  3. Unix:我安装了 PHP,但是每次我加载文档时,都会收到“文档不包含数据”的消息!这是怎么回事?
  4. Unix:我使用 RPM 安装了 PHP,但 Apache 无法处理 PHP 页面!这是怎么回事?
  5. Unix:我用 FrontPage 扩展补丁修补了 Apache,突然 PHP 不工作了。PHP 与 Apache FrontPage 扩展不兼容吗?
  6. Unix/Windows:我已经安装了 PHP,但是当我尝试通过浏览器访问 PHP 脚本文件时,我得到一个空白屏幕。
  7. Unix/Windows:我已经安装了 PHP,但是当我尝试通过浏览器访问 PHP 脚本文件时,我得到一个 500 服务器错误。
  8. 某些操作系统:我已经成功安装了 PHP,但是当我尝试启动 Apache 时,我得到未定义符号错误:[mybox:user /src/php5] root# apachectl configtest apachectl: /usr/local/apache/bin/httpd 未定义符号:_compress _uncompress
  9. Windows:我已经安装了 PHP,但是当我尝试通过浏览器访问 PHP 脚本文件时,我得到以下错误:cgi 错误:指定的 CGI 应用程序行为不端,没有返回完整的一组 HTTP 标头。它返回的标头是
  10. Windows:我已经按照所有说明操作,但仍然无法使 PHP 和 IIS 协同工作!
  11. 在将 PHP 作为 CGI 与 IIS、PWS、OmniHTTPD 或 Xitami 一起运行时,我收到以下错误:安全警告!PHP CGI 无法直接访问。
  12. 如何知道我的 php.ini 是否被找到并读取?看起来它没有被找到,因为我的更改没有被实现。
  13. 如何在 Windows 上将我的 PHP 目录添加到 PATH 中?
  14. 如何在 Windows 上使 php.ini 文件对 PHP 可用?
  15. 是否可以使用 Apache 内容协商(MultiViews 选项)与 PHP?
  16. PHP 是否仅限于处理 GET 和 POST 请求方法?
为什么我不应该在生产环境中使用带有线程 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.exephp5ts.dllphp.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 目录添加到 PATH 中?

在 Windows 上

  • 转到控制面板并打开系统图标(开始 → 控制面板)

  • 转到高级选项卡

  • 点击“环境变量”按钮

  • 查看“系统变量”窗格

  • 找到 Path 条目(您可能需要滚动才能找到它)

  • 双击 Path 条目

  • 在末尾输入您的 PHP 目录,包括之前的“;”(例如 ;C:\php

  • 按确定

注意 确保在完成上述步骤后重新启动系统,以确保 PATH 更改生效。

如何在 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>

添加注释

用户贡献的注释 5 个注释

per dot fikse at ipj dot no
19 年前
在 Windows Server 2003 x64 上安装 PHP 4 或 5 会导致 http 错误 505。这不是 PHP 错误。这是由于在 64 位版本的 IIS 6 下运行 32 位 ISAPI DLL 造成的,如以下文档中所述:http://support.microsoft.com/?id=895976

解决方案:按照 http://support.microsoft.com/?id=894435 中的说明,翻转 Enable32bitAppOnWin64 的 Metabase 标志,
如下所示:CSCRIPT ADSUTIL.VBS SET W3SVC/AppPools/Enable32bitAppOnWin64 1

(或者使用完整路径:cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1)
charleslynch at xybersoftware dot com
16 年前
如果您收到有关没有执行权限的消息,请在以下消息中最后注意一点。您需要使用 IIS 右键单击网站并选择“属性/主目录”,然后在“执行权限”组合框中,您需要选择“仅脚本”。单击确定。另一个对话框可能会出现,询问要将操作应用于哪些目录。选择您打算在其中使用 php 的任何目录,然后单击确定。现在应该可以了。
emzeperx at emzeper dot hu
18 年前
您不必重新启动整个系统来使更改的 PATH 环境变量生效。对我来说(sbs2003)可以自动生效。
在旧系统上,您可以使用

set $Path=%path%;c:\php

命令立即扩展路径变量。
Curtis
17 年前
我有一些关于 53.7 的其他故障排除技巧,这些技巧涉及在运行 PHP 脚本时在浏览器中获得空白屏幕。

除了服务器配置错误外,也可能是 PHP 未配置为将错误输出到浏览器,如果您或您的主机使用更安全的 php.ini,就会出现这种情况。如果是这种情况,您需要找出错误记录的位置,以确定是否有任何错误阻止正常输出传递到客户端。

如果您有权访问 php.ini,请检查“display_errors”指令,该指令默认位于“error_reporting”指令下。在调试阶段开启“display_errors”很有帮助,但在生产环境中最好关闭它。

相关函数:https://php.net/ini_set | https://php.net/error_reporting | https://php.net/error_log
joerg at fenin dot de
16 年前
为了限制运行 PHP 的 Apache 服务器上的 HTTP 请求方法,您应该使用 mod_rewrite 或 mod_security 而不是 LimitExcept,以便更好地控制此类 http 错误的处理。可以放在 .htaccess 文件或 httpd.conf 中

# mod_rewrite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST)$
RewriteRule .* - [F,L]
</IfModule>

# mod_security
<IfModule mod_security.c>
SecFilterSelective REQUEST_METHOD "!^(GET|HEAD|POST)$" "deny,log,status:403"
</IfModule>

您可以使用 askapache 上的 php 请求方法扫描程序来查看您的服务器如何处理各种请求方法,并检查您的服务器是否配置正确。

http://www.askapache.com/online-tools/request-method-scanner/
To Top