SplFileInfo :: openFile (/ app / tmp / cache / persistent / cake_core_cake_console _): не удалось открыть поток: в строке /lib/.../FileEngine.php отказано в разрешении 293 - PullRequest
20 голосов
/ 16 марта 2012

Я работаю над проектом 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_

, его владельцу и группе будет возвращен root.и его разрешения установлены по умолчанию.

Что может быть причиной этой проблемы?Есть ли способ гарантировать, что при каждом создании этого файла всегда будет apache: apache с разрешениями на чтение / запись / выполнение?

Ответы [ 8 ]

26 голосов
/ 23 апреля 2012

Вы можете решить эту проблему, добавив маску к вашей конфигурации в core.php

Cache::config('default', array(
    'engine' => 'File',
    'mask' => 0666,
));
15 голосов
/ 16 марта 2012

Там был отчет об ошибке http://cakephp.lighthouseapp.com/projects/42648/tickets/2172, но это считалось ошибкой.

Что я лично заметил, так это то, что некоторые владельцы файлов могут быть изменены при использовании сценария cake в консоли (например, для создания bake). Затем измененные файлы принадлежат пользователю, которого вы используете в консоли.

Значит ли это, что вы звоните cake, будучи root? Или у вас есть какое-либо задание root cron, которое вызывает скрипт оболочки Cake?

Лично у меня теперь есть привычка chmod весь контент папки tmp возвращать пользователю apache после использования сценария cake, и, похоже, предупреждение не появляется.

7 голосов
/ 09 сентября 2013

Вместо настройки предоставления доступа на чтение / запись всем в каталоге 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 позволитвы должны убедиться, что файлы, созданные в этом каталоге, получают надлежащие права доступа группы независимо от того, какой пользователь запускает сценарий оболочки.Это также позволяет исключить разрешения на чтение / запись для «других» пользователей.

2 голосов
/ 24 октября 2015

Я думаю, что причина проблемы уже объяснена, так как cron работает от имени пользователя root, а созданные в tmp файлы недоступны для веб-пользователя.Другие решения не работали для меня, и я не хотел устанавливать разрешения tmp на 777, в итоге я настроил задание cron для веб-пользователя, в частности, в Debian это будет

crontab -u www-data -e

Takenиз этого ответа Как указать в crontab каким пользователем запускать скрипт?

0 голосов
/ 22 июня 2017

Другое решение. Конфликт разрешений произошел, потому что несколько пользователей используют одни и те же файлы. Таким образом, если мы разделим каталог кэша на несколько подкаталогов, конфликт не возникнет, и не потребуется изменение разрешения по умолчанию для каталогов и файлов.

Как показано ниже, каждый каталог дополнительного кэша определяется типом обработчика php api:

define('CACHE', TMP . 'cache' . DS . php_sapi_name() . DS);
  • При просмотре веб-сайта активным пользователем является apache. И суб каталог cache / apache2handler .
  • При запуске пакета активный пользователь является пользователем root или пользователем, выполняющим вход. И подкаталог является cache / cli .

Другая сторона, текущая учетная запись пользователя может использоваться для именования подкаталогов. Проверьте в Как проверить, какой пользователь php работает?

0 голосов
/ 21 февраля 2016

Вам нужно сделать каталог app / tmp доступным для записи веб-сервером. Узнайте, под каким пользователем работает ваш веб-сервер (в моем случае _www), и измените владельца каталога app / tmp на этого пользователя: $ chown -R _www app/tmp

0 голосов
/ 28 августа 2013

Используйте это ..

cd cakephp/app/tmp/cache/persistent 

sudo chmod 666 myapp*

cd ..

cd models

sudo chmod 666 myapp*
0 голосов
/ 06 мая 2012

Если вы столкнулись с ошибкой SplFileInfo в CakePHP2, и вы абсолютно уверены, что ваши права доступа к файлам / каталогам настроены правильно, то еще одна вещь, которую нужно проверить, - это версия PHP.Cake2 требует PHP 5.2.8 или более поздней версии, и, хотя вы, как правило, будете получать оповещения на странице по умолчанию, если вы используете неправильную версию, вы не будете предупреждены, если разработаете свое приложение на одном сервере, а затем переместите его на другой.

Я столкнулся с этой ошибкой после разработки приложения Cake2 на сервере PHP5.3 и его перемещения на сервер PHP 5.1.Обновление до 5.2.17 (выше 5.2.8) решило проблему.

...