PHP扩展:从命令行工作,但不在httpd(Apache)服务器中



我的PHP扩展遇到了最奇怪的问题。当我从命令行使用它时,就像这样:

php -r '$mc = new MyClass("foo"); echo $mc->getField();'

它按预期打印出"foo"。

然而,如果我试图在index.php中做同样的事情,我会得到一个未找到类的错误。

Fatal error: Class 'MyClass' not found in /var/www/html/index.php on line 12

这怎么会发生?我甚至将httpd设置为在运行php-r命令时以与自己相同的用户身份运行。

我的index.php看起来是这样的:

<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <p>
 <?php 
  error_reporting(E_ALL); 
  ini_set('display_errors', '1');
  $mc = new MyClass("foo"); 
  echo $mc->getField();
 ?> 
 </p>
 </body>
</html>

httpd.conf的php部分如下所示:

# PHP Configuration for Apache
#
# Load the apache module
#
LoadModule php5_module modules/libphp5.so
#
# Cause the PHP interpreter handle files with a .php extension.
#
<Files *.php>
SetOutputFilter PHP
SetInputFilter PHP
LimitRequestBody 9524288
</Files>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php

很明显,我的php.ini设置是正确的,因为我的php-r命令是有效的。可能是什么原因导致了这个问题?

您在命令行上运行的php可执行文件与您通过Apache运行的libphp5.so库不同。

将以下内容放入文件中,上传到服务器并通过网络查看,您可能会发现您的模块尚未加载:

<?php phpinfo(); ?>

该文件将告诉您已经加载了哪些模块,正在使用哪个php.ini文件,以及许多其他信息。它应该能帮助你诊断你的问题。您可能需要设置Apache配置参数来加载正确的php.ini文件或直接加载模块的.so文件。

事实证明,该问题是由SELinux引起的。如果像这样关闭:

echo 0 >/selinux/enforce

一切都很神奇。

我遇到了同样的问题,并解决了恢复扩展文件的SELinux上下文的问题,这应该是理想的,而不是禁用SELinux,如以下示例:

# restorecon -R -v /usr/lib64/php
# restorecon -R -v /etc/php.d

相关内容

  • 没有找到相关文章

最新更新