Mam bardzo prosty skrypt testowy:Połączenie PDO działa z linii poleceń, ale nie przez 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";
}
?>
Kiedy wykonać ten skrypt z wiersza poleceń, to działa doskonale:
$ 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
Ale kiedy dostęp do dokładnie tego samego scenariusza poprzez przeglądarce internetowej , to mówi:
Could not connect to database, rawr. :-(
próbowałem var_dump
od błędu, a wiadomość jest: „SQLSTATE [HY000] [2003] nie można połączyć się z serwerem MySQL na ' db.example.edu "(13)".
To jest zagadkowe. Jest to dokładnie ten sam skrypt na tym samym serwerze - dlaczego działa po uruchomieniu go z wiersza poleceń, ale kończy się niepowodzeniem, gdy Apache go uruchomi?
Czy to serwer Linux? Czy to Redinux, czy CentOS z SELinux? Jeśli tak, być może będziesz musiał włączyć booleany SELinux 'httpd_can_network_connect' oraz' httpd_can_network_connect_db', aby umożliwić serwerowi Apache nawiązanie połączenia ze zdalnym hostem bazy danych. –
więcej informacji na temat tego błędu (13 = uprawnienie odmówione) znajduje się tutaj: http://www.filonov.com/blog/2009/08/07/sqlstatehy000-2003-cant-connect-to-mysql-server-on-xxx -xxx-xxx-xxx-13/ – thetaiko
@Michael Tak, jest to serwer RHEL 6.1 i nowy, błyszczący. Ponadto, @thetai - to działało! To SELinux blokował połączenie, a uruchomienie 'setsebool -P httpd_can_network_connect = 1' jako root naprawiło to. Jeśli chcesz opublikować to jako odpowiedź, z przyjemnością przyjmuję i przegłosuję. –