Ich habe ein bestimmtes PHP -Skript, das exec () aufruft, um einen Befehl zum Konvertieren eines PDF in JPG auszuführen. Dieser Befehl funktioniert gut in Bash.
Beachten Sie Folgendes, um Ihre ersten Fehler bei der Fehlerbehebung zu vermeiden:
Wenn ich dieses PHP -Skript vom Browser aus aufrufe (besuche http://www.example.com/script.php ), führt exec () sein Argument nicht aus.
IMPORTANT: Ich weiß, dass es keine Probleme mit meinem Skript oder der Art und Weise gibt, wie ich den bash-Befehl erstellt habe, denn von bash aus kann ich das Skript mit 'php' ausführen und es funktioniert (zB 'php script. PHP konvertiert die Datei)
Ich habe auch versucht, exec () mit system () auszuschalten.
Zuletzt hatte ich dieses Problem schon einmal in der Vergangenheit, kann mich aber nicht erinnern, wie ich es behoben habe.
Ich weiß, dass etwas fehlt, was ich vermisse, also hoffe ich, dass jemand anderes dies erlebt hat und ich erinnere mich, wie ich es reparieren kann!
Vielen Dank im Voraus für jegliche Unterstützung, die Sie leisten können.
Alex
Fügen Sie am Ende Ihres Befehls 2>&1
hinzu, um Fehler von stderr nach stdout umzuleiten. Dies sollte deutlich machen, was schief läuft.
Nur eine Vermutung, es könnte sein, dass Ihr Webserver-Prozessbenutzer keine Berechtigungen dafür hat.
Da es funktioniert, wenn von der Befehlszeile aus (die sich unter Ihrem eigenen Benutzerkonto befindet), klingt es für mich wie das Konto, unter dem der Webserver ausgeführt wird (häufig "www-data"), keine Ausführungsberechtigung für das Konvertierungsprogramm hat .
Haben Sie über Dateiberechtigungen nachgedacht? Im Browser wird PHP unter einem Benutzer ausgeführt. Wenn Sie es jedoch in Bash ausführen, wird es wahrscheinlich mit Ihren Benutzerberechtigungen ausgeführt.
Es ist das erste, was ich überprüfen würde.
Amy
Verfügt Ihr Apache/Webserver-Benutzer über die erforderlichen Rechte, um den Shell-Befehl auszuführen?
Wenn Sie vom Cl aus starten, werden Sie wahrscheinlich als anderer Benutzer ausgeführt, was möglicherweise erklärt, welcher Cl funktioniert, aber über den Browser nicht.
Dem Apache-Benutzer www-data
müssen Berechtigungen zum Ausführen bestimmter Anwendungen mit Sudo
erteilt werden.
Sudo visudo
aus. Eigentlich möchten wir die Datei in etc/sudoers
bearbeiten. Um dies zu tun, verwenden Sie Sudo visudo
im Terminal und duplizieren (temp) sudoers
die zu bearbeitende Datei. www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount
(Dies setzt voraus, dass Sie die Befehle restart
und mount
mit Superuser-Berechtigungen (.). (Root) ausführen möchten.)
Wenn Sie jedoch jede Anwendung mit den Superuser-Privilegien .__ ausführen möchten, fügen Sie Folgendes anstelle des oben genannten hinzu. Möglicherweise möchten Sie dies nicht tun, nicht für ALL
-Befehle. Dies ist sehr gefährlich.
www-data ALL=NOPASSWD: ALL
3 .Nachdem Sie die Sudoers-Datei bearbeitet haben (durch visudo
bearbeiten wir die temporäre Datei von sudoers
. Speichern und beenden Sie die temporäre Datei (visudo), um sie in sudoers
-Datei zu schreiben. (wq!
)
4. Das ist es nun, verwenden Sie exec()
auf folgende Weise in Ihrem xxx.php
script .Denken Sie daran, Sudo
zu verwenden, bevor Sie den Befehl im PHP-Skript verwenden.
ex:-
exec ("Sudo /etc/init.d/smokeping restart 2>&1");
Fügen Sie also in Ihrem Problem die Befehle, die Sie verwenden möchten, zu step no (2.)
hinzu, während Sie Ihr PHP-Skript hinzufügen und als das, was Sie möchten, ändern.
Es kann daran liegen, dass die verschiedenen Benutzer das Skript über den Webserver und das Skript über die Bash ausführen.
Normalerweise haben die Skripts/exec wie beim Benutzer 'www' über den Server aufgerufen, und dieser Benutzer hat keinen Schreibzugriff auf Ihre Region. Wenn Sie das Skript jedoch in Bash ausführen, verfügen Sie über Schreibberechtigungen.
Ich habe festgestellt, dass dies ein Problem mit ImageMagick ist, nicht mit PHP. Ich versuche ein paar Korrekturen, und wenn sie nicht funktionieren, werde ich am Ende eine gemeinsame PHP - Bibliothek (wahrscheinlich imagick) verwenden, um die Arbeit zu erledigen.
Standardausgabegerät wird geändert.
login als www (nach dem Aktivieren) gibt die Ausgabe über Shell aus, jedoch nicht über PHP.