PDO连接是从命令行工作,但不是通过Apache?

时间:2011-11-15 16:13:55

标签: php mysql connection pdo

我有一个非常简单的测试脚本:

<?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]无法连接到'db.example.edu'上的MySQL服务器(13)”。< / p>

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

4 个答案:

答案 0 :(得分:30)

如果这是运行SELinux的Red Hat派生版本(RHEL,CentOS,Fedora,ScientificLinux)(或任何使用SELinux的非Red Hat衍生版本),编写本文时的默认策略设置是禁止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

答案 1 :(得分:0)

我遇到了与PHP ftp ftp_connect相同的问题,并且必须设置

setsebool -P httpd_can_network_connect=1

令人困惑,因为fil_get_contents和curl之类的其他内容在设置之前就可以通过PHP和apache工作了。

答案 2 :(得分: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

答案 3 :(得分:-1)

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

请务必检查phpinfo()中的pdo_mysql
在这篇文章中找到它:PDOException “could not find driver”

我想知道为什么CLI在这样的条件下工作O_o可能安装不正确,或者被覆盖?嗯,现在,它运作正常!