章 51. 安装常见问题本章包括了安装 PHP 的常见问题。PHP 可以用于几乎任何操作系统(可能除了 OS X 之前的 MacOS 之外),以及几乎任何 web 服务器。 要安装 PHP,请按照发行包中 INSTALL 文件的说明进行。Windows 用户同样还要阅读 install.txt 文件。对于 Windows 用户还有一些有用的提示在 Windows 系统下的安装一章。
PHP 是粘合剂。它将几十种第三方的库粘合到一起来创建很酷的 web 应用,并通过很直观且易于学习的语言界面使其看上去好像一个整体。PHP 的灵活与强大依赖于底层平台的稳定与耐用。起码需要将一个可运作的操作系统,一个可运作的 web 服务器以及可运作的第三方库粘合起来。其中任何一方不运作了,PHP 都需要有方法来识别出问题并且快速解决。如果没有完全独立的执行线程,完全独立的内存单元和稳定的空间对付每个请求,那底层架构就太复杂以至于不稳定因素更容易进入到 PHP 系统中。 如果必须要用线程化的 MPM,看看 FastCGI 配置,使 PHP 运行于自己独立的内存空间中。 最后需要指出,不使用线程化 MPM 的警告在 Windows 系统中没那么强烈,因为 Windows 中的大多数库都理应在多线程下安全运行。 UNIX 中默认在 /usr/local/lib 目录中,也就是 <install-path>/lib。很多人会在编译时通过 --with-config-file-path 标记来改变路径。例如可以将路径设为:
Windows 中 php.ini 文件的默认路径在 Windows 目录下。如果使用的是 Apache 服务器,则会首先在 Apache 的安装目录中寻找 php.ini,例如 C:\Program Files\Apache Group\Apache。这样同一台机器上不同版本的 Apache 就可以有不同的 php.ini 文件。 参见配置文件。 这可能意味着 PHP 发生了某类错误而导致了 core dump。查看服务器的错误日志看看是不是这样,再用一个小的测试例子试着重现此问题。如果你会用“gdb”的话,那么在 bug 报告中提供回溯跟踪很有助于帮开发人员查明问题。如果你用 Apache 的模块方式使用 PHP,试着这么做:
如果你的脚本使用了正则表达式函数(ereg() 等),应该确认在编译 PHP 和 Apache 时使用了同一个正则表达式包。在 PHP 和 Apache 1.3.x 中应该自动就是这样。 假定你的 Apache 和 PHP 都是从 RPM 包中安装的,你需要在 httpd.conf 文件中取消以下部分或所有行的注释,或者把它们添加到该文件中:
由于 PHP 3 构造的原因,不容易编译出一个完全灵活的 PHP RPM 包来。这个问题在 PHP 4 中解决了。对于 PHP 3 来说,我们目前建议你用 PHP 发行包中 INSTALL.REDHAT 文件中所描述的机制。如果你坚持要用 PHP 3 的 RPM 版本,请接着往下看。 为了简化安装以及由于 RPMS 使用了 /usr/ 而不是标准的 /usr/local/ 目录来存放文件,制作 RPM 包的人设定 RPMS 不安装任何数据库支持。你需要告诉 RPM 说明文件,你想要支持哪个数据库以及你的数据库服务器最高层路径。 下面的例子解说了如何在用模块安装下的 Apache 中加入流行的 MySQL 数据库服务器支持的过程。 当然这些信息可以调整用于任何 PHP 支持的数据库服务器。本例中我们也假定你从 RPMS 中完整安装了 MySQL 和 Apache。
兼容的。PHP 可以和 FrontPage extensions 一起工作,问题是 FrontPage 补丁修改了几个 PHP 依赖的 Apache 构造。在 FrontPage 补丁安装之后之后重新编译 PHP(用“make clean ; make”)可以解决此问题。 用浏览器中的“查看源文件”,你可能会发现能看到 PHP 脚本的源程序。这意味着 web 服务器没有把脚本发送给 PHP 解释。服务器配置在某处有问题,请对照 PHP 安装说明仔细检查服务器配置。 当服务器尝试运行 PHP 时出了错。要想看到有意义的错误信息,在命令行中转到 PHP 可执行程序(Windows 中是 php.exe)所在目录下并运行 php -i。如果 PHP 运行有任何问题,那么会显示相应的错误信息,这将给你下一步要做什么的线索。如果你得到满屏幕 HTML 代码(phpinfo() 函数的输出)的话说明 PHP 本身工作正常,你的问题可能和你的服务器配置有关,要仔细检查。 9. 某些操作系统:我已经在不出错的情况下安装了 PHP,但当我试着启动 Apache 时得到了一个未定义符号错误:
这实际上和 PHP 没有关系,而和 MySQL 的客户端库有关。有的需要 --with-zlib,有的不需要。这个问题也包括在 MySQL 的 FAQ 中。 10. Windows:我已经安装了 PHP,但当我试着通过浏览器访问 PHP 脚本时,得到如下错误:
这个错误信息意味着 PHP 根本就不能产生任何输出。要想看到有意义的错误信息,在命令行中转到 PHP 可执行程序(Windows 中是 php.exe)所在目录下并运行 php -i。如果 PHP 运行有任何问题,那么会显示相应的错误信息,这将给你下一步要做什么的线索。如果你得到满屏幕 HTML 代码(phpinfo() 函数的输出)的话说明 PHP 本身工作正常。 一旦 PHP 在命令行中工作正常,试着通过浏览器再次访问脚本。如果还失败的话那可能是如下原因之一:
确认需要运行 PHP 脚本的任何用户有权限运行 php.exe!IIS 使用了一个在安装 IIS 时添加的匿名用户,这个用户需要有访问 php.exe 的权限。同样任何认证用户也需要执行 php.exe 的权限。在 IIS4 中你还需要告诉它 PHP 是一个脚本引擎。此外,你可能还需要阅读此常见问题。 12. 当在 IIS,PWS,OmniHTTPD 或者 Xitami 中以 CGI 方式运行 PHP 时,出现如下错误:Security Alert! PHP CGI cannot be accessed directly.. 必须将 cgi.force_redirect 选项设为 0。 默认值为 1,因此要确认此选项没有被注释掉(用 ;)。和其它选项一样,是在 php.ini 中设定的。 因为默认值是 1,因此你必须百分之百确认使用了正确的 php.ini 文件。详细信息请阅读此常见问题。 要确认你的 php.ini 被 PHP 使用了,调用 phpinfo(),在接近开头的位置有一项叫做 Configuration File (php.ini)。这里将告诉你 PHP 在哪里找到了 php.ini 并且是否使用了。如果只显示一个目录则 没有使用任何 php.ini 文件,你应将你的 php.ini 文件放到该目录中。如果 php.ini 包括在该路径中则它已被应用了。 如果 php.ini 被使用了并且你是以模块方式运行 PHP 的,确保在修改了 php.ini 之后重新启动你的 web server。 在 Windows NT,2000,XP 和 2003 下:
在 Windows 98/Me 中需要编辑 autoexec.bat 文件:
PHP 手册过去提倡把文件拷贝到 Windows 系统目录中去,这是因为该目录(C:\Windows,C:\WINNT,等等)默认就在系统路径中。但是把文件拷贝到 Windows 系统目录中这一方式早已不被提倡,还可能造成问题。 有几种方法。如果使用 Apache,阅读专门的安装指示(Apache 1,Apache 2),否则就必须设定 PHPRC 环境变量: 在 Windows NT,2000,XP 和 2003 种:
在 Windows 98/Me 中需要编辑 autoexec.bat 文件:
如果到 PHP 文件的连接包含扩展名,一切都运行完美。本解答只针对到 PHP 文件的连接不包含扩展名时,而希望通过 content negotiation 来从不包含扩展名的 URL 来选择 PHP 文件的情况。在此种情况下,将 AddType application/x-httpd-php .php 替换为:
不是,PHP 有可能处理任何请求方法,例如 CONNECT。适当的回应状态可以用 header() 发送。如果仅需要处理 GET 和 POST 方法,可以通过如下的 Apache 配置实现:
| |||||||||||||||||