2012-01-27 143 views
2

我遇到了PHP扩展中最奇怪的问题。当我从命令行使用它时,如下所示:PHP扩展:从命令行运行,但不在httpd(Apache)服务器中运行

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 

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

我的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命令起作用。什么可能导致这个问题?

回答

1

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

echo 0 >/selinux/enforce 

一切都神奇地工作。

2

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

把下列句子变成一个文件,把它上传到你的服务器,并通过网络查看它,你可能会看到你的模块尚未加载:

<?php phpinfo(); ?> 

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

相关问题