2013-02-15 13 views
7

Attualmente ho uno script php in esecuzione quando un browser browser naviga nella pagina web. Quello che sto cercando di fare è scrivere un file di testo quando viene eseguito lo script che memorizza una variabile. Il proprietario della cartella è apache, ma tutti hanno letto la scrittura, rigorosamente a scopo di test. (Ho pensato che potrebbe essere un problema di autorizzazioni) SELINUX è abilitato sul server, e quando eseguo lo script dalla console crea il file di testo bene e nella giusta directory.file_put_contents non crea il file txt

file_put_contents("My working file location", $myString); 

sto usando questa linea per cercare di scrivere e creare il file di testo, so che la mia posizione file funziona becaus posso correre e crearlo in modalità non in linea, vale a dire eseguendolo attraverso la console. Il problema è che la variabile che sto cercando di scrivere è popolata tramite HTTP Post, e quando eseguo lo script tramite il browser, o quando apache esegue lo script, non scrive né crea il file. Cosa devo fare per consentire l'accesso a scrivere/modificare la sintassi per ottenere che questo script scriva questo file di testo?

+1

l'utente apache dovrebbe disporre dei diritti sulla directory: provare a eseguire lo script come utente apache dalla riga di comando per verificare se funziona. – user1914292

+2

Controllare il log degli errori di apache, potrebbe fornire alcuni dettagli sul punto in cui non è riuscito. –

+0

qual è il valore $ myString? è corretto ? – Cooper

risposta

9

Il problema è probabile a causa del fatto che Apache non dispone delle autorizzazioni per scrivere nel percorso del file specificato. Vai a tale directory e controllare le autorizzazioni e le proprietà del gruppo con il comando ls:

cd "My working file location" 
ls -l . 

Ci sono tre colonne nell'output che mostrano i permessi, il proprietario e di gruppo per la directory. Molto probabilmente sono di proprietà di root e non dispongono delle autorizzazioni per apache per scrivere nella directory.

In questo caso, verrà visualizzato un errore nel registro di apache quando tenta di creare il file. Prova tailing il log durante l'esecuzione dello script nel browser:

tail -f /var/log/apache2/error.log 
+0

Ho risolto il problema che era il culmine di autorizzazioni selinux e autorizzazioni apache. – choppyfireballs

+2

Potrebbe andare bene per condividere la tua risposta. Google mi ha reindirizzato qui e io sono ancora bloccato. –

+1

@VenderAeloth Sembra che Choppyfireballs non sia molto attivo qui, ma se non risponde, assicurati di condividere la tua risposta con noi quando la trovi! –

-2

Hai provato chmodding la directory per 777?

Prova questo:

if(file_put_contents('file.txt', 'text')){ 
    die('yes'); 
} else { 
    die('no'); 
} 

Potenza di qualcosa scritto male.^

+1

a volte questo è un buon modo di vedere cosa non funziona – tofutim

1

Ho avuto lo stesso problema di recente e sono incappato in questa domanda. Purtroppo il choppyfireballs OP ha detto in un commento che ha trovato la sua soluzione e ha appena accettato una risposta che non aiutava nessuno di noi ... Poi dopo una ricerca e un successo per rendere file_put_contents lavoro di nuovo ho deciso di condividere la mia soluzione.

I permessi dei miei file e directory erano ok ad accettare qualsiasi forma scritta (assicurarsi che le directory sono chmod 757 questo darà la radice e altri la concessione di scrivere file nella posizione). Se continua a non funzionare come se non fosse per me, è perché il tuo sistema è probabilmente il sistema SELinux (Security Enhanced Linux).

Se si vuole essere sicuri di scrivere setenforce 0 questo trasformerà selinux in modalità permissiva, eseguirà nuovamente lo script, se funziona allora significa che il problema è ben descritto.

In tal caso, ruotare selinux sul retro setenforce 1 e provare ls -Zl nella directory in cui si trova la directory del progetto.questo vi darà una linea come

drwx---r-x. 9 root root system_u:object_r:httpd_sys_content_t:s0 4096 Dec 8 00:25 project 

o qualcosa di diverso ma httpd_sys_content_t se è stato utilizzato chcon per trasferire il contesto da una directory a questo. ma se non si dispone di httpd_sys_content_t è ok perché abbiamo bisogno di cambiare il contesto di quella directory comunque.

Per prima cosa è necessario accettare qualsiasi contesto public_content_rw_t per scrivere il file. Digitare

setsebool -P httpd_anon_write on 

Questo imposterà (P) ermanently SELinux booleano httpd_anon_write true e qualsiasi contesto definito come public_content_rw_t avrà i diritti per scrivere i file nella loro posizione.

Ora si deve dire SELinux che la directory del progetto è public_content_rw_t o non sarà ancora possibile scrivere file. Tipo:

semanage fcontext --add --type public_content_rw_t "/project(/.*)?" 

e restorecon -RvF /project per dire SELinux per applicare le specifiche di cui sopra.

Ora la directory è public_content_rw_t e dovresti riuscire a scrivere file.

-1

Sono notare sicuro se la mia soluzione è veramente chiara ma ha funzionato:

cd /mydir/ 
setsebool -P allow_httpd_anon_write true 

migliori saluti

0

ho incontrato anche questo problema. Nel mio caso, ho trovato che la proprietà della directory era sbagliata. Per un'installazione tipica di Apache, la directory dovrebbe essere di proprietà di www-data: www-data, non root: root.

+0

Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https: // StackOverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/17017422) –