Tôi có một kịch bản thử nghiệm rất đơn giản:Kết nối PDO hoạt động từ dòng lệnh, nhưng không phải thông qua 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";
}
?>
Khi tôi thực hiện kịch bản này từ dòng lệnh, nó hoạt động một cách hoàn hảo:
$ 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
Nhưng khi tôi truy cập vào kịch bản chính xác tương tự thông qua trình duyệt web của tôi , nó nói:
Could not connect to database, rawr. :-(
tôi đã thử var_dump
về lỗi, và thông điệp là: "SQLSTATE [HY000] [2003] không thể kết nối với máy chủ MySQL trên ' db.example.edu '(13) ".
Điều này thật khó hiểu. Đó là cùng một kịch bản chính xác trên cùng một máy chủ - tại sao nó hoạt động khi tôi thực thi nó từ dòng lệnh, nhưng thất bại khi Apache thực thi nó?
Đây có phải là máy chủ Linux không? Có phải Red Hat hoặc CentOS đang chạy SELinux không? Nếu vậy, bạn có thể cần phải kích hoạt các booleans SELinux 'httpd_can_network_connect' và' httpd_can_network_connect_db' để cho phép Apache thiết lập các kết nối đến một máy chủ cơ sở dữ liệu từ xa. –
thông tin thêm về lỗi này (13 = quyền bị từ chối) là ở đây: http://www.filonov.com/blog/2009/08/07/sqlstatehy000-2003-cant-connect-to-mysql-server-on-xxx -xxx-xxx-xxx-13/ – thetaiko
@Michael Vâng, đó là một máy chủ RHEL 6.1, và một cái mới sáng bóng ở đó. Ngoài ra, @thetaiko - đã hoạt động! SELinux chặn kết nối và chạy 'setsebool -P httpd_can_network_connect = 1' làm gốc đã sửa nó. Nếu bạn muốn đăng bài đó như một câu trả lời, tôi sẽ vui vẻ chấp nhận và upvote. –