Wie führe ich einen Befehl innerhalb eines Skripts aus, ohne den genauen Speicherort anzugeben?

1

Also habe ich ein PHP-Skript, das wgetzum Herunterladen einiger Bilder verwendet wird. Es sieht ungefähr so ​​aus:

exec('wget -O saveImage.png http://location.of.image');

Wenn ich mein Skript auf einem anderen Computer ausführe, funktioniert es. Wenn ich es jedoch lokal ausführe, funktioniert es nicht. Ich denke, das hat damit zu tun, wie ich installiert habe wget. Vor Ort verwende ich Mac OS X 10.6 Snow Leopard und installiere es wgetmit Homebrew . Also , wenn ich laufen which wget(wie mich) , um die Lage von wgetIS /usr/local/bin/wget(das ist ein symbolischer Link auf das Homebrew Keller ist). Ich habe festgestellt, dass der Benutzer, der das Skript ausführt, aufgerufen wird daemon. Ich weiß, dass das wgetSkript der staffGruppe gehört und ich glaube nicht, dass der daemonBenutzer Teil dieser Gruppe ist (aber ich weiß nicht, wie ich das überprüfen soll). Wie auch immer, ich glaube nicht, dass der daemonBenutzer die Berechtigung zum Ausführen des Befehls hat und / oder das Skript nicht finden kann. Was soll ich machen?

Update: So konnte ich das Skript ausführen, als ich den genauen Speicherort angab:

exec('/usr/local/bin/wget ...etc');

Dies lässt mich glauben, dass es sich nicht um ein Berechtigungsproblem handelt, sondern vielmehr um ein Problem, bei dem wget nicht gefunden werden kann. Ich glaube nicht, dass ich den genauen Speicherort angeben kann, da er auf den verschiedenen Computern, auf denen dieses Skript ausgeführt wird, unterschiedlich ist. Was soll ich also tun, um dieses Problem zu umgehen?

Lösung:

Durch Hinzufügen /usr/local/binder Umgebungsvariablen $PATHkonnte PHP wget finden. So habe ich es in PHP gemacht:

//help PHP find wget since it may be in /usr/local/bin
putenv('PATH=' . getenv('PATH') . PATH_SEPARATOR . '/usr/local/bin');
if (exec('which wget') == null) {
    throw new Exception('Could not find wget, so image could not be downloaded.');
}

//now we know wget is available, so download the image
exec('wget ...');
Andrew
quelle

Antworten:

1

Eine halbe Antwort ...

Stellen Sie sicher, dass sich wget in Ihrer Standard-Umgebungsvariablen PATH für den Benutzer befindet, mit dem Sie das Skript ausführen (auf jedem Computer). Ein Blick auf die Ausgabe von exec('echo $PATH')könnte ein guter Weg sein, dies zu tun. Das Ergebnis muss so sein ...:/usr/local/bin:....

Keine Ahnung, wie man den Standard-PATH-Wert unter OSX ändert.

Stéphane Gimenez
quelle
1
Denken Sie auch daran, dass bestimmte nicht interaktive Umgebungen, z. B. Cronjobs, sich aus Sicherheitsgründen anders verhalten und möglicherweise andere oder leere Umgebungseinstellungen aufweisen, insbesondere in Bezug auf den Pfad, um zu verhindern, dass böswillige Elemente in den Pfad aufgenommen und automatisch ausgeführt werden.
Stephanie