Подтвердить что ты не робот

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 с разрешениями на чтение/запись/выполнение?

4b9b3361

Ответ 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 работает как?