SplFileInfo:: openFile (/app/tmp/cache/persistent/cake_core_cake_console _): не удалось открыть поток: разрешение отклонено в строке /lib/.../FileEngine.php 293
Я работаю над проектом CakePHP 2. Первоначально он начинался с версии 2.0.x, а затем перешел на 2.1.0. На протяжении всего процесса разработки я получил сообщение об ошибке ниже.
Он появляется в верхней части страницы непредсказуемо. Это может быть, когда я просто просматриваю разные страницы или даже после добавления записи в базу данных (все же запись правильно сохраняется).
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
Я рекурсивно устанавливаю владельца и группу папки tmp на apache и все равно получаю сообщение. Кроме того, я затем рекурсивно устанавливаю разрешения для чтения, записи и выполнения для всех (chmod 777). Сообщение об ошибке все еще появляется.
Даже после изменения владельца, группы и разрешений соответствующий файл:
cake_prj/app/tmp/cache/persistent/cake_core_cake_console_
будет иметь свой владелец и группу, установленную в корневую папку, и ее разрешения вернутся к умолчанию.
Что может вызвать эту проблему? Есть ли способ гарантировать, что каждый раз, когда будет создан этот файл, всегда будет apache: apache с разрешениями на чтение/запись/выполнение?
Ответы
Ответ 1
Там был отчет об ошибке http://cakephp.lighthouseapp.com/projects/42648/tickets/2172, но он считался не ошибкой.
Я лично заметил, что некоторые владельцы файлов могут быть изменены при использовании cake
script в консоли (например, для создания bake
). Измененные файлы затем принадлежат пользователю, который вы используете в консоли.
Будет ли это означать, что вы вызываете cake
в то время как root? Или у вас есть задание root cron, которое вызывает оболочку Cake script?
Персонализация У меня теперь есть привычка к chmod
содержимому всей папки tmp обратно пользователю apache после использования cake
script и, похоже, чтобы предупреждение не появлялось.
Ответ 2
Вы можете решить эту проблему, добавив маску в свою конфигурацию в файле core.php
Cache::config('default', array(
'engine' => 'File',
'mask' => 0666,
));
Ответ 3
Вместо того, чтобы устанавливать доступ для чтения/записи для всех в каталоге tmp/cache, я сделал это:
chgrp -R www-data app/tmp
chmod -R g+rw app/tmp
find app/tmp -type d -exec chmod g+s {} \;
Настройка группы каталогов для пользователя Apache, а затем установка бита setgid позволит вам убедиться, что файлы, созданные в этом каталоге, получают правильные групповые разрешения независимо от того, какой пользователь запускает оболочку script. Это также позволяет исключить права на чтение и запись для "других" пользователей.
Ответ 4
Я думаю, что причина проблемы уже объяснена, поскольку cron работает под пользователем root, а созданные файлы в tmp недоступны веб-пользователю. Другие решения не работали для меня, и я не хотел устанавливать разрешения tmp на 777
, я закончил настройку задания cron для веб-пользователя, в debian именно это было бы
crontab -u www-data -e
Взято из этого ответа Как указать в crontab, какой пользователь запускать script?
Ответ 5
Если вы сталкиваетесь с ошибкой SplFileInfo в CakePHP2, и вы абсолютно уверены, что права на файл/каталог настроены правильно, то еще одна вещь, которую нужно проверить, - это ваша версия PHP. Для Cake2 требуется PHP 5.2.8 или выше, и хотя вы обычно будете получать предупреждение на странице по умолчанию, если используете неправильную версию, вы не будете предупреждены, если бы разработали приложение на одном сервере, а затем перенесли его на другой.
Я испытал эту ошибку после разработки приложения Cake2 на сервере PHP5.3, а затем переместил его на сервер PHP 5.1. Модернизация до 5.2.17 (которая выше 5.2.8) решила проблему.
Ответ 6
Используйте это.
cd cakephp/app/tmp/cache/persistent
sudo chmod 666 myapp*
cd ..
cd models
sudo chmod 666 myapp*
Ответ 7
Вам нужно сделать каталог app/tmp доступным для записи на веб-сервере. Узнайте, какой пользователь работает в вашем веб-сервере (в моем случае _www) и измените права собственности на каталог app/tmp этому пользователю: $ chown -R _www app/tmp
Ответ 8
Другое решение. Возникли конфликты, связанные с тем, что несколько пользователей используют одни и те же файлы. Таким образом, если мы разделяем каталог кеша на несколько подкаталогов, конфликт не возникает и не меняется разрешение по умолчанию для каталогов и файлов.
Как показано ниже, каждый каталог дополнительного кэша определяется типом обработчика php api:
define('CACHE', TMP . 'cache' . DS . php_sapi_name() . DS);
- При просмотре веб-сайта активным пользователем является apache. И суб
каталог cache/apache2handler.
- При запуске пакета активным пользователем является пользователь root или logging-in.
И подкаталог cache/cli.
Другая сторона, текущая учетная запись пользователя может использоваться для обозначения подкаталога. Проверить на
Как проверить, какой пользовательский php работает как?