Come eseguire il debug di problemi shell_exec
OK, qui abbiamo un problema: qualcosa funziona nel terminale e non funziona in shell_exec di php (o exec, spawn, qualunque cosa). Pensiamo: qual è la differenza tra te e php? Eccone tre:
PHP viene eseguito dalle regole del server HTTP
In effetti, il tuo terminale è in esecuzione yourname
dall'utente e php viene eseguito da www-data
. Quindi, la prima idea è quella di aprire il terminale www-data
dall'utente e provare lo stesso comando. Così....
- Apri il
/etc/passwd
file, trova la linea con l' www-data
utente e cambia la shell di accesso (l'ultima) da /bin/false
(o qualsiasi altra cosa) a /bin/bash
.
www-data
Terminale aperto :su www-data
- Prova php -v o qualunque altra cosa non puoi eseguire da php. Se non funziona, vedrai dei bei log e sarai in grado di eseguire il debug del problema.
- Non dimenticare di riparare il
/etc/passwd
file indietro mentre hai finito
PHP viene eseguito da PHP .
PHP è un enogh paranoico e ci sono molte opzioni nella configurazione di apache / nginx e php.ini che potrebbero interrompere il tuo tentativo.
Questo è un po 'più complicato per il debug. Ci sono due opzioni qui:
Abilita i log nel browser e vedi il problema. Modifica il tuo php.ini
, attiva display_errors
e tutti gli altri flag per visualizzare gli errori nel browser. Li puoi leggere ed eseguire il debug.
Ottieni www-data
la shell (vedi prima sezione) ed esegui qualcosa del genere
echo '<?php shell_exec("php -v"); ?>' | php
che eseguirà lo stesso codice php nella console e sarai in grado di vedere errori e debug.
PHP viene eseguito da SELinux / apparmor
Selinux e apparmor sono elementi di sicurezza che vietano alle applicazioni di eseguire azioni specifiche (ad esempio, generando altre applicazioni o altre specifiche applicazioni). Forse è abilitato sul tuo server.
Per verificare - disabilitare selinux / apparmor e verificare se esiste un problema.
Per risolvere: leggi il manuale appropriato e fissa le regole di scrittura consentite per il tuo caso.