php – 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]无法连接到’db.example.edu’上的MySQL服务器(13)”.

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

最佳答案
如果这是运行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.

转载注明原文:php – PDO连接是从命令行工作,但不是通过Apache? - 代码日志