2015-05-01 10 views
9

Nel mio ambiente di sviluppo locale, Apache e PHP sono installati su Windows 7. Sto chiamando 7-Zip dal mio programma PHP con exec. Ho provato in un primo momento conPerché PHP non riconosce un programma nel PATH del sistema Windows quando lo uso con Apache?

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

ma non ha creato il file zip. Dopo aver controllato il log degli errori di Apache, ho trovato

'7z' non è riconosciuto come comando interno o esterno, programma eseguibile o file batch.

Dopo aver modificato il exec per includere il percorso completo di 7-Zip.exe, ha funzionato.

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

Ma C:\Program Files\7-Zip è incluso nel mio percorso di sistema di Windows. Lo stesso codice PHP funziona dalla riga di comando senza utilizzare il percorso completo.

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

Perché è necessario il percorso completo quando lo uso con Apache?


Un punto importante, che ho trascurato di includere quando ho originariamente postato questa domanda è che sono già in grado di utilizzare exec() per chiamare altri programmi inclusi nel percorso di sistema di Windows senza fare riferimento a loro dai loro percorsi completi.

Un altro punto che non ho menzionato in origine perché non mi rendevo conto della sua rilevanza era che 7-Zip era stato aggiunto al PERCORSO solo recentemente, e ho riavviato il servizio Apache dopo averlo aggiunto.

+4

Apache non è in esecuzione dal tuo account, non ha le impostazioni di 'PATH'. – Barmar

+0

@Barmar Ho pensato di metterlo nel sistema 'PATH' piuttosto che il mio' PATH' utente si sarebbe occupato di questo. Non è così che funziona? –

+0

... dovresti provare '/ usr/bin/7z' – hek2mgl

risposta

2

Ho appena capito cosa stava causando questo problema. In realtà non era correlato alla mia ipotesi originale.

Mi sono ricordato di vedere PATH informazioni in phpinfo(), quindi ho guardato. Nella sezione "Ambiente Apache" mostrava tutto il PATHeccetto il percorso per 7-Zip, che avevo appena aggiunto al sistema PATH di recente. Quindi sembra che apparentemente abbia accesso a quel percorso, ma non stava usando la versione corrente di esso. Perchè no?

Normalmente penserei di aver appena dimenticato di riavviare Apache dopo aver aggiornato il percorso, ma l'ho riavviato ripetutamente mentre cercavo di capirlo.Ma apparentemente lo che riavvia Apache non aggiorna questo valore. Ho dovuto stop e poi start it. Quindi il percorso 7-Zip si presentava in PATH in phpinfo, e sono stato in grado di modificare il mio programma per l'utilizzo di semplice 7z.

3

Ho installato WAMP su Windows 8 e dopo aver letto la domanda ho deciso di provare un paio di cose.

Esecuzione echo exec('whoami'); eco:

nt authority\system 

Ciò conferma quanto @Barmar detto, Apache non è in esecuzione sotto lo stesso utente come voi, quindi, la PATH è diverso.

Ho deciso di interrompere Apache e avviarlo manualmente con l'account Administrator. poi ho provato:

echo exec('whoami'); 

Quali emesso:

computername\administrator 

ho pensato che ora il exec avrebbe funzionato con PATH e provato:

echo exec('adb'); // Android strumento adb è sul mio PATH

Sorprendentemente, nonostante Apache stesse correndo con lo stesso uso come me, lo PATH non funzionava ancora. Non ho idea del motivo per cui questo sta accadendo e se qualcuno ha un indizio per favore commentare qui sotto.

sono riuscito a usare il PATH (utilizzando l'account Administrator) con il seguente codice:

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


non ho la prova il codice qui sotto, ma si può provare a impostare il PATH con l'account Apache servizi ( nt authority\system), e quindi utilizzare il comando, vale a dire:

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

Credo che lo path sarà ancora valido tra i riavvii.


Aggiornamento:

this answer, può aiutare a impostare il PATH per l'account nt authority\system.

variabili d'ambiente personali dell'utente di sistema locale sono specificati a "HKEY_USERS.DEFAULT \ Environment". Le variabili di ambiente a livello di macchina sono specificate in "HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment". Il primo non è in realtà facilmente accessibile da ovunque tranne il Registro di sistema, ma il secondo è accessibile dalle "Variabili d'ambiente " dialogo sulla scheda "Avanzate " del "Sistema Proprietà".


Per gli utenti futuri, il modo corretto per impostare il percorso di Apache è:

È possibile utilizzare setEnv in .htaccess o putenv in PHP codice per impostare $PATH

Il credito va a hek2mgl

+0

qui il percorso non sarà valido tra i riavvii qui, cioè solo per la sessione corrente. dovrai impostare le tue variabili di ambiente altrove. questa linea mostra un esempio di questo: http://www.computerhope.com/issues/ch000549.htm – Augwa

+0

Grazie per il commento, ma ho assunto che il percorso di 'Administrator' non è lo stesso di' nt authority \ system ', quindi, impostare il percorso come indicato non risolverà il problema. –

+0

@PedroLobito Ho scoperto la vera causa di questo. Ho aggiunto una risposta per descriverlo. Dopo tutto, pensavo solo che non stavo capendo correttamente Apache. Grazie per l'interesse e scusa se ho sprecato il tuo tempo qui. –

Problemi correlati