PDO-Verbindung funktioniert von der Kommandozeile aus, nicht aber durch den Apache?
Habe ich ein sehr einfaches test-script:
<?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";
}
?>
Wenn ich das Skript von der Kommandozeile, funktioniert es tadellos:
$ 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
Aber wenn ich auf die exakt gleiche Skript über meine web-browser, es sagt:
Could not connect to database, rawr. :-(
Ich habe versucht var_dump
auf den Fehler und die Meldung: "SQLSTATE[HY000] [2003] Can' T connect to MySQL server on 'db.example.edu' (13)".
Dies ist rätselhaft. Es ist das exakt gleiche script auf dem genau gleichen server-warum funktioniert es, wenn ich es ausführen von der Befehlszeile aus, aber nicht, wenn Apache ausgeführt?
- Ist dies ein Linux-server? Ist es Red Hat oder CentOS läuft SELinux? Wenn dem so ist, die Sie benötigen, um die SELinux-booleans
httpd_can_network_connect
undhttpd_can_network_connect_db
, damit Apache, um verbindungen zu einem remote-Datenbank-host. - weitere Informationen zu diesem Fehler (13 = permission denied) ist hier: filonov.com/blog/2009/08/07/...
- Ja, es ist ein RHEL 6.1 server, und ein glänzendes neues an. Auch, @thetaiko -- das hat geklappt! Es war SELinux blockiert die Verbindung, und läuft
setsebool -P httpd_can_network_connect=1
als root behoben. Wenn Sie buchen möchten, die als eine Antwort, ich werde es gerne annehmen und upvote.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn dies ist eine von Red Hat abgeleiteten distribution (RHEL, CentOS, Fedora, ScientificLinux) mit SELinux (oder alle nicht Red-Hat-Derivat mit SELinux), die Standardeinstellung der Richtlinie zum Zeitpunkt des Schreibens dieses Artikels ist, zu verbieten, Apache aus macht externe verbindungen zu anderen Servern oder Datenbanken. Als root ermöglichen, müssen Sie die folgenden zwei SELinux booleans. Verwenden Sie die
-P
option zu bestehen, die änderung über einen Neustart.Beachten Sie, dass
httpd_can_network_connect
kann nicht notwendig sein. Versuchen Sie es zuerst einschalten nurhttpd_can_network_connect_db
.httpd_can_network_connect
Linie war nicht notwendig in meinem Fall, nur diehttpd_can_network_connect_db
Linie.Ich hatte das gleiche problem bei PHP-ftp-ftp_connect und musste sich die
Es ist verwirrend, weil andere Dinge wie
fil_get_contents
und curl Arbeit über PHP und apache nur in Ordnung, bevor Sie, dass.Neben der Verwendung der oben genannten akzeptierten Antworten
Musste ich auch ändern den Sicherheitskontext einer Datei, die
httpd
zugreifen wollte.Einem php-Skript ausgeführt durch apache wurde versucht, den Zugriff auf eine Zertifikat-Datei, die außerhalb des normalen Dokument-root von
httpd
. Ändern Sie die Datei-Berechtigungen zu ermöglichen httpd-Zugang war nicht genug, um httpd-Zugang zu dieser Datei. Ich hatte zu ändern, um die Sicherheit auch dem Kontext, also vor der änderung:Kontext ändern mit:
bekommen:
Nun alles gut ist. Eine gute Ressource zu betrachten ist
/var/log/audit/audit.log
und achten Sie auf Fehler. In meinem Fall der Fehler, der zeigte in die Richtung von einer Auflösung war:Gleiche Problem aber andere Ursache hier
Meine Lösung war einfach nur eine
apt-get install php-mysql
WegSicher sein, check für pdo_mysql, die in Ihrer phpinfo()
Finden Sie auf diesen Eintrag : PDOException "could not find driver"
Frage ich mich, warum CLI arbeitete unter solchen Bedingungen O_o Vielleicht etwas falsch installiert oder überschrieben ? Naja, jetzt funktioniert es einwandfrei !