PHP Conference Japan 2024

安装

本节包含有关如何安装 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. 当以 CGI 方式运行 PHP 与 IIS、PWS、OmniHTTPD 或 Xitami 时,会出现以下错误:安全警报!无法直接访问 PHP CGI。
  12. 如何知道我的 php.ini 是否被找到并读取?看起来它没有被找到,因为我的更改没有被实施。
  13. 如何在 Windows 上将我的 PHP 目录添加到 PATH?
  14. 如何在 Windows 上使 php.ini 文件可供 PHP 使用?
  15. Windows:如何在 IIS 下验证 PHP 是否可以写入临时目录?
  16. 是否可以将 Apache 内容协商(MultiViews 选项)与 PHP 一起使用?
  17. 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 服务器,则首先在 Apache 的安装目录中搜索 php.ini,例如 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 补丁修改了 PHP 依赖的几个 Apache 结构。在应用 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 是一个脚本引擎。此外,您可能需要阅读 此常见问题解答

当使用 IIS、PWS、OmniHTTPD 或 Xitami 以 CGI 方式运行 PHP 时,我收到以下错误:安全警告!无法直接访问 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 环境变量。

Windows:如何在 IIS 下验证 PHP 是否可以写入临时目录?

  1. 在文件资源管理器中右键单击临时目录 (%TEMP%) 以获取权限。临时目录可从配置或 phpinfo() 中获取。

  2. 对于 IIS,请检查用户 IIS_User 是否具有 MODIFY 权限。

是否可以将 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 条注释

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

解决方案:如 http://support.microsoft.com/?id=894435 中所述,翻转 Metabase 标志以启用 Enable32bitAppOnWin64,
例如:CSCRIPT ADSUTIL.VBS SET W3SVC/AppPools/Enable32bitAppOnWin64 1

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

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

命令立即扩展路径变量。
5
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
4
joerg at fenin dot de
17 年前
要限制运行 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