我有一个非常简单的测试脚本:
<?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
但当我通过Web浏览器访问完全相同的脚本时,它会说:
Could not connect to database, rawr. :-(
我已经尝试了var_dump
的错误,和消息是:“SQLSTATE[HY 000] [2003]无法连接到”www.example.com“上的MySQL服务器db.example.edu(13)"。
这是令人费解的,这是在完全相同的服务器上的完全相同的脚本--为什么当我从命令行执行它时,它工作,而当Apache执行它时,它失败?
4条答案
按热度按时间34gzjxbg1#
如果这是运行SELinux的Red Hat派生发行版(RHEL、CentOS、Fedora、ScientificLinux)(或使用SELinux的任何非Red Hat派生发行版),编写本文时的默认策略设置是禁止Apache与其他服务器或数据库建立外部连接。作为root用户,必须启用以下两个SELinux布尔值。使用
-P
选项可在重新引导后保留更改。请注意,
httpd_can_network_connect
可能不是必需的。请先尝试仅打开httpd_can_network_connect_db
。wlzqhblo2#
问题相同,但原因不同
我的解决方案只是简单的
apt-get install php-mysql
请务必检查phpinfo()中的pdo_mysql
找到它在这个职位:PDOException“找不到驱动程序”
我想知道为什么CLI在这样的条件下工作O_O可能是安装不正确,或者被覆盖了?好了,现在,它工作得很好!
b4qexyjb3#
我在PHP ftp ftp_connect中遇到了同样的问题,必须设置
这是令人困惑的,因为像
fil_get_contents
和curl这样的其他东西在设置之前可以通过PHP和apache正常工作。oug3syen4#
此外,使用上述公认答案
我还必须更改
httpd
试图访问的文件的安全上下文。通过apache运行的php脚本试图访问
httpd
的普通文档根目录之外的证书文件.更改文件权限以允许httpd访问不足以允许httpd访问该文件.我还必须更改安全上下文,所以在更改之前:更改上下文使用:
以获得:
现在一切都很好。一个很好的资源是
/var/log/audit/audit.log
,并密切关注错误。在我的例子中,指向解决方案方向的错误是: