2015-02-28 14 views
5

So che questo è un errore comune a molti thread ma sono stanco di cercare e non l'ho ancora risolto. Quando provo ad eseguire la funzione file_put_contents ottengo il seguente errore:Impossibile aprire lo stream su file_put_contents in PHP su CentOS 7

Warning: file_put_contents(test.txt): failed to open stream: Permission denied in /var/www/html/nurses/adminWriter.php on line 29 

ho già fatto la risposta più comune, modificare le autorizzazioni dei infermieri cartella e il file ditest.txt a 777. Quello non ha funzionato.

Attualmente sono su una nuova installazione dell'ultimo server CentOS 7.

Ho scoperto che se corro lo script php tramite la console:

# php /var/www/html/nurses/adminWriter.php 

funziona bene, ottengo l'errore solo quando si esegue attraverso il browser, ma ho davvero bisogno di eseguirlo per di qua.

I migliori saluti!

+1

Quando si esegue uno script php tramite apache, viene eseguito come (qualunque sia l'utente specificato), spesso "apache". Quando esegui uno script php attraverso la console, lo stai eseguendo come qualsiasi altro accesso. Assicurarsi che l'utente "apache" (o qualsiasi altra cosa) possa accedere a quel file (che include qualsiasi directory padre). Inoltre, puoi provare a utilizzare un percorso assoluto per test.txt - potresti provare a scrivere da qualche parte che non ti aspetti. – jedwards

+0

Hai saltato la citazione per scopo? Prova: 'file_put_contents (__ DIR__. '/test.txt');' – alfallouji

+0

Vuoi dire qualcosa come: # chown -R apache: apache/var/www/html/nurses/ – danielnovais92

risposta

4

Ok, ho trovato il problema: SELinux

ecco la soluzione: http://kb.sp.parallels.com/en/11142

Nel caso in cui la pagina va giù:

sintomi

Dopo aver modificato la directory predefinita per memorizzare il contenuto del sito Web (ad esempio, in "/ home"), non è possibile accedere al contenuto dei sottodomini e dei siti Web aggiuntivi sul Web.

Causa

Questo problema si verifica se SELinux opere in modalità "Enforcement". In questa modalità, le directory webroot per i siti Web e i sottodomini al loro interno hanno autorizzazioni diverse e il tuo server web non riesce ad accedervi. Eseguire questo comando:

# getenforce 

L'output dovrebbe essere: Applicazione

Risoluzione

Disabilita SELinux supporto: Aprire il file /etc/selinux/config in qualsiasi editor e trova questa riga:

SELINUX=<value> 

modificarla in:

SELINUX=disabled 

Se non è possibile trovare il file, aprire il file/boot/grub/grub.conf in qualsiasi editor e aggiungere il parametro selinux = 0 al boot loader GRUB:

title SE-Linux Test System 
root (hd0,0) 
kernel /boot/vmlinuz-2.4.20-selinux-XXXXXXXXXX ro root=/dev/hda1 nousb selinux=0 
#initrd /boot/initrd-2.4.20-selinux-XXXXXXXXXX.img 

riavviare il server per applicare le modifiche. Se non si desidera riavviare, eseguire questo comando:

# setenforce 0 
+1

La disabilitazione di SELinux non è consigliata. Ci sono modi migliori per farlo. –

+1

@Ilia Rostovtsev Mi sono imbattuto in questo stesso problema e disabilitare SELinux l'ha risolto, quali altri modi migliori per farlo senza disabilitare SELinux? – technomage

9
chcon -Rv --type=httpd_sys_rw_content_t /dir 

Questo può aiutare, piuttosto che spegnere il SELinux.

+1

Puoi spiegare cosa questo per favore? – Mike

+0

grazie 'aureport -a' prima di eseguire chcon {{{ 24. 09-10-2017 16:25:31 httpd system_u: system_r: httpd_t: s0 2 file read unconfined_u: object_r: user_home_t: s0 negato 923 25. 09-10-2017 16:26:42 httpd system_u: system_r: httpd_t: s0 2 file read unconfined_u: object_r: user_home_t: s0 negato 924 26. 09-10-2017 16:29:38 httpd system_u: system_r: httpd_t: s0 2 file read unconfined_u: object_r: user_home_t: s0 negato 925 }}} –

+0

Questo ha funzionato per me. Ho salvato il mio tempo dopo aver lavorato per molte ore. usa sudo chcon -Rv --type = httpd_sys_rw_content_t/dir – Vara