2011-11-15 58 views
7

我有一个非常简单的测试脚本:PDO连接从命令行运行,但不通过Apache?

<?php 

$DSN = "mysql:host=db.example.edu;port=3306;dbname=search_data"; 

try { 

    $DB = new PDO($DSN, "username", "super-secret-password!"); 

} catch (PDOException $e) { 

    header('Content-Type: text/plain'); 
    print "Could not connect to database, rawr. :-("; 
    exit; 

} 


$SQL = "SELECT phrase FROM search ORDER BY RAND() LIMIT 10"; 

foreach($DB->query($SQL) as $row){ 

    print $row['phrase']."\n"; 

} 

?> 

当我执行命令行这个脚本,它完美的作品:

$ php test.php 
corporal punishment 
Stretches 
voluntary agencies and the resettlement of refugees 
music and learning 
Nike Tiger Woods Scandal 
Hermeneia 
PSYCHINFO 
anthony bourdain 
Black-White Couples and their Social Worlds 
colonization, hodge 

但是当我通过网络浏览器访问完全相同的脚本,它说:

Could not connect to database, rawr. :-(

我的错误尝试var_dump,消息是:“SQLSTATE [HY000] [2003]无法连接到MySQL服务器' db.example.edu'(13)“。

这是令人费解的。它是完全相同的服务器上的完全相同的脚本 - 为什么当我从命令行执行它时会工作,但在Apache执行它时会失败?

+0

这是Linux服务器吗?运行SELinux的是Red Hat还是CentOS?如果是这样,您可能需要启用SELinux布尔型'httpd_can_network_connect'和'httpd_can_network_connect_db'以允许Apache建立到远程数据库主机的连接。 –

+1

有关此错误的更多信息(13 =权限被拒绝)在此处:http://www.filonov.com/blog/2009/08/07/sqlstatehy000-2003-cant-connect-to-mysql-server-on-xxx -xxx-xxx-xxx-13/ – thetaiko

+0

@Michael是的,它是一个RHEL 6.1服务器,并且是一个闪亮的新服务器。另外,@thetaiko - 工作!这是SELinux阻止连接,并以root身份运行'setsebool -P httpd_can_network_connect = 1'来修复它。如果你想发布这个答案,我会很乐意接受和赞成。 –

回答

24

如果这是运行SELinux(或任何非使用SELinux的红帽衍生产品)的Red Hat衍生发行版(RHEL,CentOS,Fedora,ScientificLinux),则本文写作时的默认策略设置是禁止Apache与其他服务器或数据库的外部连接。作为root用户,您必须启用以下两个SELinux布尔值。使用-P选项可在重新启动时保留更改。

setsebool -P httpd_can_network_connect=1 
setsebool -P httpd_can_network_connect_db=1 

请注意,httpd_can_network_connect可能没有必要。首先尝试使用httpd_can_network_connect_db

+2

谢谢!在我的情况下,'httpd_can_network_connect'这一行不是必需的,只是'httpd_can_network_connect_db'行。 –

+0

你救了我的一天。非常感谢◕‿◕ – PHPst

+0

如果您还没有投票赞成,请这样做... – bart2puck

0

我对PHP FTP FTP_CONNECT同样的问题,不得不设置

setsebool -P httpd_can_network_connect=1 

这是令人困惑,因为其他像fil_get_contents并通过PHP和Apache设置,以前就好了卷曲的工作。

-1

同样的问题,但不同的原因在这里
解决方案仅仅是一个简单的apt-get install php-mysql

一定要检查PDO_MYSQL在你的phpinfo()
发现它这个帖子:PDOException “could not find driver”

不知O_O也许一些安装不正确,或得到了重写在这种条件下为什么CLI工作?那么,现在,它工作正常!

+0

注意解释而不是仅仅downvoting?我仍然不知道它为什么在CLI中起作用,而不是通过Apache。如果我错过了明显的东西,请告诉我们什么。 我发布了我的解决方案,因为它*实际上解决了我的问题*,并可能帮助其他人。如果我做了完全错误的事情,请让我们高兴。 – Balmipour

0

另外,使用上述接受的答案

setsebool -P httpd_can_network_connect=1 
setsebool -P httpd_can_network_connect_db=1 

我不得不也改变httpd试图访问一个文件的安全上下文。

通过Apache运行PHP脚本试图访问是的httpd正常的文档根目录之外的证书文件。更改文件权限以允许httpd访问不足以允许httpd访问该文件。我不得不改变与安全上下文一样,所以之前的变化:

[admin]$ ls -Z ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem 
-rw-r--r--. admin apache unconfined_u:object_r:unlabeled_t:s0 ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem 

变化环境中使用:

sudo chcon -v --type=httpd_sys_content_t ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem``` 

获得:

[admin]$ ls -Z ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem 
-rw-r--r--. admin apache unconfined_u:object_r:httpd_sys_content_t:s0 ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem 

现在一切都很好。一个好的资源是/var/log/audit/audit.log,并密切关注错误。在我的情况下,指向分辨率方向的错误是:

type=AVC msg=audit(1509047616.042:4049): avc: denied { read } for pid=17096 comm="httpd" name="rds-ca-2015-root-us-east-1-BUNDLE.pem" dev="xvdb" ino=262146 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:unlabeled_t:s0 tclass=file 
相关问题