Frente a un error de permiso de archivo al ejecutar CakePHP en Ubuntu 10.4
ubuntu-10.04 (4)
He instalado la estructura de CakePHP 2.0 siguiendo los pasos a continuación:
1. Start the terminal
2. sudo mkdir /var/www/cakephp
3.sudo cp -r ~/cakephp/* /var/www/cakephp
Cambiar el permiso de la carpeta tmp
4. sudo chmod -R 777 cakephp/app/tmp
Habilitar mod-rewrite
5. sudo a2enmod rewrite
Abra el archivo / etc / apache2 / sites-enabled / 000-default y cambie AllowOverride None
para AllowOverride All
6. sudo vim /etc/apache2/sites-enabled/000-default
Reiniciar Apache
7. sudo /etc/init.d/apache2 restart
Abrí mi navegador y escribí la dirección http: // localhost / cakephp / y escribí este mensaje de error:
Advertencia: _cake_core_ cache no pudo escribir ''cake_dev_en-us'' en Caché de archivos en / var / www / cakephp/lib/Cake/Cache/Cache.php en la línea 310
Advertencia: _cake_core_ cache no pudo escribir ''cake_dev_en-us'' en Caché de archivos en /var/www/cakephp/lib/Cake/Cache/Cache.php en la línea 310
Advertencia: / var / www / cakephp / app / tmp / cache / persistent / no se puede escribir en / var / www / cakephp /lib/Cake/Cache/Engine/FileEngine.php en la línea 320
Advertencia: / var / www / cakephp / app / tmp / cache / models / no se puede escribir en /var/www/cakephp/lib/Cake/Cache/Engine/FileEngine.php en la línea 320
Advertencia: / var / www / cakephp / app / tmp / cache / no se puede escribir en / var / www / cakephp / lib / Cake /Cache/Engine/FileEngine.php en la línea 320
El comando sudo chmod -R 777 cakephp/app/tmp
solo hace que tmp
pueda escribir, debe hacer que la caché y sus subdirectorios también sean escribibles, de lo contrario, Cake no puede escribir los archivos de caché en el directorio de caché en tmp.
Entonces, estos directorios deberían poder escribirse:
cakephp/app/tmp/cache
cakephp/app/tmp/cache/persistent
cakephp/app/tmp/cache/models
Asegúrese de que el directorio de registro también se pueda escribir: cakephp/app/tmp/logs
.
He enfrentado problemas similares. Aquí hay un par de cosas que me ayudaron:
Si no desea utilizar el enfoque "martillo" de chmod 777
(es posible que desee evitarlo en la producción , por ejemplo), las instrucciones de instalación de CakePHP proporcionan detalles sobre cómo usar ACL en su lugar:
- Para Cake 2: http://book.cakephp.org/2.0/en/installation.html#permissions
- Para Cake 3: http://book.cakephp.org/3.0/en/installation.html#permissions
Tenga en cuenta que probablemente necesite usar sudo
para los comandos setfacl
dados allí.
Sin embargo, en mi experiencia (CakePHP 2), esos comandos no son suficientes. Estos comandos dan acceso a su servidor web al caché, etc., pero cualquier cosa que ejecute desde la línea de comandos (como el comando cake
) probablemente se ejecutará como usuario en lugar de usuario del servidor web.
Por lo tanto, debe ejecutar los comandos setfacl
vinculados a arriba una segunda vez, reemplazando ${HTTPDUSER}
con su nombre de usuario. Si no está seguro de cuál es su nombre de usuario, escriba whoami
para encontrarlo.
He encontrado un problema muy similar con cachePhp 3.
Warning (512): /cache/persistent/ is not writable [CORE/src/Cache/Engine/FileEngine.php, line 439]
Warning (512): Cache engine Cake/Cache/Engine/FileEngine is not properly configured. [CORE/src/Cache/Cache.php, line 177]
Como soy nuevo en CakePhp, he depurado el archivo con el problema - CORE / src / Cache / Engine / FileEngine.php . Aquí está la función como siguiente:
protected function _active()
{
$dir = new SplFileInfo($this->_config[''path'']);
$path = $dir->getPathname();
$success = true;
if (!is_dir($path)) {
//@codingStandardsIgnoreStart
$success = @mkdir($path, 0775, true);
//@codingStandardsIgnoreEnd
}
$isWritableDir = ($dir->isDir() && $dir->isWritable());
if (!$success || ($this->_init && !$isWritableDir)) {
$this->_init = false;
trigger_error(sprintf(
''%s is not writable'',
$this->_config[''path'']
), E_USER_WARNING);
}
return $success;
}
Comprueba si el directorio de caché es escribible y obtiene datos sobre la forma del camino $this->_config[''path'']
variable. Esta variable se inicializa por defecto desde el archivo .env (si lo usa), y tiene líneas como la siguiente:
export CACHE_DEFAULT_URL="File://tmp/cache/?prefix=${APP_NAME}_default&duration=${CACHE_DURATION}"
export CACHE_CAKECORE_URL="File://tmp/cache/persistent?prefix=${APP_NAME}_cake_core&serialize=true&duration=${CACHE_DURATION}"
export CACHE_CAKEMODEL_URL="File://tmp/cache/models?prefix=${APP_NAME}_cake_model&serialize=true&duration=${CACHE_DURATION}"
He cambiado todo File:
to Null:
como el siguiente:
export CACHE_DEFAULT_URL="Null://tmp/cache/?prefix=${APP_NAME}_default&duration=${CACHE_DURATION}"
export CACHE_CAKECORE_URL="Null://tmp/cache/persistent?prefix=${APP_NAME}_cake_core&serialize=true&duration=${CACHE_DURATION}"
export CACHE_CAKEMODEL_URL="Null://tmp/cache/models?prefix=${APP_NAME}_cake_model&serialize=true&duration=${CACHE_DURATION}"
export CACHE_DRV_DEFLT = "Null"
export CACHE_DRV_MODEL = "Null"
export CACHE_DRV_CORE = "Null"
Y ayuda, mi problema fue reparado. Probablemente será útil para alguien. ¡Disfrutar!
Como solución temporal, si desea utilizar el archivo .env proporcionado y los permisos no resuelven su problema, modifique el archivo .env para usar una ruta absoluta que apunte a su directorio de aplicaciones.
export CACHE_FOLDER="/var/www/absolute_path_to_my_cakephp_app/"
export CACHE_DURATION="+2 minutes"
export CACHE_DEFAULT_URL="file://${CACHE_FOLDER}tmp/cache/?prefix=${APP_NAME}_default&duration=${CACHE_DURATION}"
export CACHE_CAKECORE_URL="file://${CACHE_FOLDER}tmp/cache/persistent?prefix=${APP_NAME}_cake_core&serialize=true&duration=${CACHE_DURATION}"
export CACHE_CAKEMODEL_URL="file://${CACHE_FOLDER}tmp/cache/models?prefix=${APP_NAME}_cake_model&serialize=true&duration=${CACHE_DURATION}"