2015-05-01 4 views
9

In meiner lokalen Entwicklungsumgebung habe ich Apache und PHP unter Windows 7 installiert. Ich rufe 7-Zip von meinem PHP-Programm mit exec. Ich versuchte zuerst mitWarum erkennt PHP ein Programm im Windows-Systempfad nicht, wenn ich es mit Apache verwende?

exec('7z a example.zip example.pdf'); 

, aber es erstellte die ZIP-Datei nicht. Nach dem Überprüfen des Apache-Fehlerprotokolls fand ich

'7z' wird nicht als interner oder externer Befehl, ausführbares Programm oder Batch-Datei erkannt.

Nachdem der exec geändert wurde, um den vollständigen Pfad zu 7-Zip.exe zu enthalten, funktionierte es.

exec('"C:\\Program Files\\7-Zip\\7z" a example.zip example.pdf'); 

Aber C:\Program Files\7-Zip wird in meinem Windows-System-Pfad enthalten. Derselbe PHP-Code funktioniert von der Befehlszeile aus, ohne den vollständigen Pfad zu verwenden.

php -r "exec('7z a example.zip example.pdf');" 

Warum ist es den vollständigen Pfad erforderlich ist, wenn ich es mit Apache verwenden?


Ein wichtiger Punkt, den ich sind vernachlässigt, als ich ursprünglich diese Frage gestellt ist, dass ich bereits in der Lage bin exec() zu verwenden, um andere Programme in der Windows-Systempfad enthalten aufrufen, ohne von ihren vollständigen Pfade zu ihnen zu beziehen.

Ein weiterer Punkt, den ich ursprünglich nicht erwähnt habe, weil ich seine Relevanz nicht erkannte, war, dass 7-Zip erst kürzlich dem PATH hinzugefügt wurde und ich den Apache-Dienst nach dem Hinzufügen neu gestartet hatte.

+4

Apache ist nicht von Ihrem Konto ausgeführt wird, es muss nicht Ihre 'PATH' Einstellungen. – Barmar

+0

@Barmar Ich dachte, es in das System 'PATH' zu setzen, anstatt dass mein Benutzer' PATH' dafür sorgen würde. Geht das nicht so? –

+0

... sollten Sie versuchen '/ usr/bin/7z' – hek2mgl

Antwort

2

Ich habe gerade herausgefunden, was dieses Problem verursacht hat. Es war eigentlich nicht mit meiner ursprünglichen Annahme verwandt.

Ich erinnerte mich zu sehen PATH Informationen in phpinfo(), also habe ich mir das angesehen. In der "Apache Environment" -Abschnitt zeigte es alle PATHaußer den Pfad zu 7-Zip, die ich soeben zum System PATH hinzugefügt hatte. Offensichtlich scheint es, Zugriff auf diesen Pfad zu haben, aber es verwendete nicht die aktuelle Version davon. Warum nicht?

Normalerweise würde ich denken, ich hätte gerade vergessen, Apache neu zu starten, nachdem ich den Pfad aktualisiert hatte, aber ich hatte es wiederholt neu gestartet, während ich versuchte, das herauszufinden.Aber anscheinend Neustart Apache aktualisiert diesen Wert nicht. Ich musste Anschlag es und dann starten. Dann erschien der 7-Zip-Pfad in PATH in phpinfo, und ich konnte mein Programm wieder auf 7z zurücksetzen.

3

Ich habe WAMP auf Windows 8 installiert und nach dem Lesen Ihrer Frage habe ich beschlossen, ein paar Dinge zu testen.

Lauf echo exec('whoami'); hallte:

nt authority\system 

Dies bestätigt, was @Barmar sagte Apache nicht unter dem gleichen Benutzer ausgeführt wird, wie Sie, so die PATH unterscheidet.

Ich habe beschlossen, Apache zu stoppen und es manuell unter dem Administratorkonto zu starten. Dann habe ich versucht:

echo exec('whoami'); 

Welche ausgegeben:

computername\administrator 

ich davon aus, dass nun die exec mit PATH funktionieren würde und versuchte:

echo exec('adb'); // android adb-Tool auf meinem PATH

ist

Überraschenderweise lief Apache mit der gleichen Verwendung r wie ich, die PATH immer noch nicht funktioniert. Ich habe keine Ahnung, warum das passiert und wenn jemand eine Ahnung hat, bitte unten kommentieren.

ich es geschafft, die PATH (mit dem Administrator-Konto) mit dem folgenden Code zu verwenden:

https://stackoverflow.com/users/171318/hek2mgl $ WshShell = new COM ("WScript.Shell"); $ oExec = $ WshShell-> Run ("cmd/C 7z ein example.zip example.pdf", 0); // 0 unsichtbare/1 sichtbar


Ich habe den Code nicht testen, aber man kann versuchen, die PATH unter dem Apache-Dienstkonto ( nt authority\system) einstellen und dann den Befehl, das heißt:

echo exec('set PATH=%PATH%;C:/path/to/7z'); 
echo exec('7z a example.zip example.pdf'); 

Ich glaube, die path wird weiterhin zwischen Neustarts gültig sein.


Update:

this answer, können Sie die PATH für das Konto nt authority\system Einstellung helfen.

Die Lokale sind persönliche Umgebungsvariablen des Systembenutzer bei "HKEY_USERS.DEFAULT \ Environment" angegeben. Die maschinenweite Umgebung Variablen sind unter "HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Sitzung Manager \ Umgebung" angegeben. Ersteres ist nicht wirklich leicht von überall außer der Registrierung, aber diese ist von dem „Umgebungsvariablen“ Dialog auf dem „Erweitern“ -Register des „System Eigenschaften“.


Für zukünftige Anwender, die richtige Art und Weise der Apache PATH zu setzen:

Sie setEnv in .htaccess oder putenv in PHP Code können Sie einstellen, $PATH

Kredit geht an hek2mgl

+0

Der Pfad ist zwischen Neustarts hier nicht gültig, dh nur für die laufende Sitzung. Sie müssen Ihre Umgebungsvariablen anderswo einstellen. Diese Zeile zeigt ein Beispiel dafür: http://www.computerhope.com/issues/ch000549.htm – Augwa

+0

Vielen Dank für den Kommentar, aber ich nahm an, der Pfad von 'Administrator' ist nicht das gleiche wie' nt Autorität \ System ', das Festlegen des Pfades wie angewiesen wird das Problem nicht lösen. –

+0

@PedroLobito Ich entdeckte die eigentliche Ursache dafür. Ich habe eine Antwort hinzugefügt, um es zu beschreiben. Ich denke, schließlich habe ich Apache nicht richtig verstanden. Danke für Ihr Interesse und Entschuldigung, wenn ich Ihre Zeit hier verschwendet habe. –

Verwandte Themen