2012-03-16 8 views
18

Sto lavorando a un progetto CakePHP 2. Inizialmente era iniziato in 2.0.x e poi migrato di recente a 2.1.0. Durante l'intero processo di sviluppo, ho ricevuto il seguente messaggio di errore.SplFileInfo :: openFile (/ app/tmp/cache/persistent/cake_core_cake_console _): impossibile aprire lo stream: autorizzazione negata in /lib/.../FileEngine.php riga 293

Si apre nella parte superiore della pagina in modo imprevedibile. Può accadere quando visualizzo solo pagine diverse o anche dopo aver aggiunto un record al database (tuttavia il record lo salva correttamente).

Warning: 
SplFileInfo::openFile(/var/www/cake_prj/app/tmp/cache/persistent/cake_core_cake_console_): 
failed to open stream: 
Permission denied in 
    /var/www/cake_prj/lib/Cake/Cache/Engine/FileEngine.php on line 293 

ho ricorsivamente impostare il proprietario e il gruppo della cartella tmp ad Apache, e ancora ricevuto il messaggio. Inoltre, ho impostato ricorsivamente le autorizzazioni per leggere, scrivere ed eseguire per tutti (chmod 777). Il messaggio di errore appare ancora.

Anche dopo aver cambiato sia il proprietario, il gruppo, e le autorizzazioni, il file in questione:

cake_prj/app/tmp/cache/persistent/cake_core_cake_console_ 

avrà il suo proprietario e il gruppo arretrato a radice, e le sue autorizzazioni impostate di nuovo a difetto.

Che cosa potrebbe causare questo problema? C'è un modo per garantire che ogni volta che viene generato questo file, esso sia sempre apache: apache con permessi di lettura/scrittura/esecuzione?

risposta

13

C'era un bug report lì http://cakephp.lighthouseapp.com/projects/42648/tickets/2172 ma è stato considerato come non essere un bug.

Ciò che ho notato personalmente è che alcuni proprietari di file possono essere modificati quando si utilizza lo script cake nella console (ad esempio per creare un bake). I file modificati appartengono quindi all'utente che si utilizza nella console.

Ciò significa che si chiama cake mentre si è root? O hai qualche cron di root che chiama uno script di Cake shell?

Personaly Ora ho l'abitudine di chmod l'intero contenuto della cartella tmp per tornare all'utente apache dopo aver utilizzato lo script cake e sembra impedire l'apparizione dell'avviso.

+0

nIcO, grazie per la risposta. Io chiamo cake mentre esegui il login come root. Anche se ho impostato la mia intera cartella tmp per avere il suo proprietario e il gruppo come apache: apache', e quindi 'chmod 777' l'intera cartella in modo ricorsivo. E poi ho lanciato la torta, ma in seguito le autorizzazioni erano ancora impostate correttamente. Quindi lo script 'cake' non sembra causarlo. –

+0

Non sono sicuro che rigeneri i file ogni volta che usi lo script 'cake'. Quindi potrebbe non ricreare sempre i file che appartengono a root anche se questo è l'utente che usi. A proposito, probabilmente non dovresti usare 'root' per chiamare' cake'. – nIcO

+0

Non è successo di recente e di recente non ho eseguito 'cake', quindi mi chiedo se questo sia il problema. Continuerò a seguire questo e vedere se succede ancora. –

24

È possibile risolvere questo con l'aggiunta di una maschera per il vostro config nella core.php

Cache::config('default', array(
    'engine' => 'File', 
    'mask' => 0666, 
)); 
+0

Pensi che potresti spiegarmi cosa fa? –

+1

Mi sono appena imbattuto nello stesso problema e questo mi sembrava di sistemarlo per me. Come spiega Mark Story: "Sembra un problema di permessi, questo può accadere quando gli utenti di cli e apache sono diversi, o la tua umask non è abbastanza permissiva."La soluzione sembra essere quella di utilizzare l'opzione 'maschera' come descritto sopra e qui http://cakephp.lighthouseapp.com/projects/42648/tickets/2172 – BeesonBison

+2

Penso che questo dovrebbe andare in bootstrap.php non core.php –

0

Se stai incontrando l'errore SplFileInfo in CakePHP2 e siete assolutamente certi che il file/permessi di directory siano impostate su correttamente, quindi un'altra cosa da controllare è la tua versione di PHP. Cake2 richiede PHP 5.2.8 o versioni successive e, sebbene tu di solito tieni avvisato sulla pagina predefinita se stavi utilizzando la versione sbagliata, non verrai avvisato se avevi sviluppato la tua app su un server e poi spostata in un'altra .

Ho riscontrato questo errore dopo aver sviluppato un'applicazione Cake2 su un server PHP5.3 e quindi spostata su un server PHP 5.1. L'aggiornamento alla 5.2.17 (che è superiore a 5.2.8) ha risolto il problema.

+0

Potrebbe aver cambiato server un paio di volte ma credo che il server su cui è stato eseguito abbia sempre i requisiti minimi di PHP (attualmente il server ha 5.3.3). Una cosa da notare però è che sembra che accada solo quando eseguo una versione di l'app su una macchina virtuale. Non sono sicuro che ciò indichi qualcos'altro? –

0

Utilizzare questo ..

cd cakephp/app/tmp/cache/persistent 

sudo chmod 666 myapp* 

cd .. 

cd models 

sudo chmod 666 myapp* 
+0

Questo sembra un grosso buco di sicurezza se rendi la tua cache leggibile e scrivibile da tutti. –

7

Invece di impostare dare accesso in lettura/scrittura a tutti gli utenti nella directory tmp/cache ho fatto questo:

chgrp -R www-data app/tmp 
chmod -R g+rw app/tmp 
find app/tmp -type d -exec chmod g+s {} \; 

Impostazione del gruppo delle directory per l'utente Apache e quindi impostando il bit setgid ti consentirà di garantire che i file creati in quella directory ottengano le autorizzazioni di gruppo appropriate indipendentemente da quale utente esegua lo script della shell. Ciò consente anche di escludere le autorizzazioni di lettura/scrittura per gli "altri" utenti.

2

Penso che la ragione del problema sia già stata spiegata, poiché il cron viene eseguito dall'utente root e i file creati in tmp non sono accessibili all'utente web. Le altre soluzioni non ha funzionato per me e non volevo per impostare le autorizzazioni tmp a 777, ho finito per l'impostazione di un job cron per l'utente web, in Debian in particolare sarebbe

crontab -u www-data -e 

tratto da questa risposta How to specify in crontab by what user to run script?

0

È necessario rendere la directory app/tmp scrivibile dal server web. Scopri quale utente esegue il tuo webserver (nel mio caso _www) e cambia la proprietà della directory app/tmp per quell'utente: $ chown -R _www app/tmp

0

Un'altra soluzione. In conflitto tra le autorizzazioni si è verificato perché più utenti condividono gli stessi file. Pertanto, se dividiamo la directory della cache in più sottodirectory, non si verificano conflitti e non è richiesta alcuna modifica dell'autorizzazione predefinita per le directory e i file.

quanto segue, ogni directory di cache secondaria è definito dal tipo di gestore api php:

define('CACHE', TMP . 'cache' . DS . php_sapi_name() . DS); 
  • Quando il browser il sito web, l'utente attivo è apache. E la sottodirectory è cache/apache2handler.
  • Quando si esegue un batch, l'utente attivo è root o utente di accesso. E la sottodirectory è cache/cli.

Altro lato, l'account utente corrente può essere utilizzato per denominare la sottodirectory. Controlla su How to check what user php is running as?

Problemi correlati