- 为什么不应在生产环境中使用带线程 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.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 是一个脚本引擎。此外,您可能需要阅读 此常见问题解答。
- 当使用 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.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>