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

标签 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) ".

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

最佳答案

如果这是运行 SELinux(或使用 SELinux 的任何非 Red Hat 衍生产品)的 Red Hat 派生发行版(RHEL、CentOS、Fedora、ScientificLinux),则在撰写本文时的默认策略设置是禁止 Apache 进行外部与其他服务器或数据库的连接。作为 root,您必须启用以下两个 SELinux bool 值。使用 -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?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8139451/

相关文章:

javascript - 如何在没有注册的情况下记住用户

php - 使用 Postman 通过原始 JSON 发送 POST 数据

php - 我的 select PHP 函数无法正常工作

PHP/MYSQL/ key : Inserting Table into Two Tables Consistently

java - 我应该关闭数据库连接吗?

Java "Connection"类未连接到数据库

PHP 脚本在 Internet Explorer 和 Firefox 中不起作用

mysql - 对字符串列使用索引

mysql - 在 mysql 中使用某些查询查看表的每个单元格的特定查询值?

connection - Npgsql:从池中获取连接时超时