Случайное предупреждение об ошибке, когда CakePHP записывает в кеш

Я разрабатываю сайт CakePHP 2.2 локально с помощью MAMP. Время от времени я получаю одно или несколько предупреждений, подобных этому, о невозможности записи в один или несколько файлов кеша:

Warning: SplFileInfo::openFile(/Applications/MAMP/htdocs/mywebsite/www/app/tmp/cache/persistent/myapp_cake_core_cake_console_en-au): failed to open stream: Permission denied in /Applications/MAMP/htdocs/mywebsite/www/lib/Cake/Cache/Engine/FileEngine.php on line 313

Странно то, что /tmp — это 777, tmp/cache — это 777, а tmp/cache/persistent — это 777 (не волнуйтесь… на сервере не будет 777!). Сам файл внутри tmp/cache/persistent имеет номер 644, но я предполагаю, что Cake создает и управляет этим файлом, и делает это с необходимыми разрешениями.

Если я просто обновлю страницу, ошибка исчезнет (а затем снова появится через некоторое время). Я не делаю никакого явного кэширования, так что все это просто Cake делает то, что он делает автоматически.

Итак, мой вопрос:

а) Как работает это автоматическое кэширование Cake? Пытается ли он писать в этот файл при каждом обновлении страницы и терпит неудачу только время от времени? Или он пытается записать в этот файл только время от времени, но каждый раз терпит неудачу?

б) Если это происходит только время от времени, могу ли я просто игнорировать это? И если он терпит неудачу каждый раз, когда пытается, как я могу это исправить?

Заранее благодарю за любую помощь!


person joshua.paling    schedule 03.10.2012    source источник
comment
Не сильно помогает, но у меня такое было несколько раз. К сожалению, я действительно не нашел способа исправить это, кроме как запустить sudo chmod -R 777 app/tmp, когда я сталкиваюсь с этим.   -  person Martin Bean    schedule 04.10.2012
comment
У меня была эта проблема, когда я случайно набрал chown -R 0777, хех   -  person tigrang    schedule 05.10.2012


Ответы (4)


Вероятно, это происходит, когда процесс, отличный от Apache, создает файлы в кеше. Это может иметь место, например, когда вы запускаете команды оболочки, поскольку вы, вероятно, делаете это от имени пользователя, отличного от apache.

По умолчанию файловый кеш создает файлы с разрешениями, позволяющими изменять их только пользователю, создавшему файлы, но это можно исправить, установив маску в конфигурации кеша в core.php:

Cache::config('_cake_core_', array(
    'engine' => $engine,
    'prefix' => 'cake_core_',
    'path' => CACHE . 'persistent' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666
));

Cache::config('_cake_model_', array(
    'engine' => $engine,
    'prefix' => 'cake_model_',
    'path' => CACHE . 'models' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666
));
person nIcO    schedule 04.10.2012
comment
Хорошо спасибо. Я не могу представить, какой процесс, кроме apache, будет изменять эти файлы, но тем не менее. Я добавил эту маску и буду следить за ней в течение следующих нескольких дней, чтобы увидеть, работает ли она. - person joshua.paling; 04.10.2012
comment
Хорошо, кажется, это работает. Примечание для других: вам также необходимо удалить существующие файлы кеша, чтобы торт воссоздал их с разрешениями 666. В противном случае они просто останутся с разрешением 664. - person joshua.paling; 05.10.2012
comment
Хм, интересно то, что это НЕ в API. То, что я ранее использовал для решения этой проблемы, — это простой сценарий bash, который вызывает консоли Cake, которые мне нужно запустить, а затем изменяет разрешения для всех файлов в App/tmp. Я передам это команде Cake. - person Borislav Sabev; 05.10.2012
comment
Похоже, в торте 3 также - person Kyle Goslan; 17.05.2016
comment
Дополнительный совет, в чем отличие установки «маски» => 0666: если вы установите ее, файлы кеша будут иметь права на чтение и запись для пользователя, группы И всех остальных пользователей (-rw-rw-rw-). Если вы не установите опцию «маска», только пользователь и группа имеют права на чтение и запись, остальные пользователи могут ТОЛЬКО читать (-rw-rw-r--). Без этой настройки маски у вас возникают проблемы, когда вы используете Cake Shell, и он работает от имени другого пользователя, как пользователь apache, например стек bitnami LAMP: Apache работает как пользователь-демон, Cake Shell обычно работает как пользователь bitnami - person makkus; 14.08.2017

Если вы не хотите предоставлять доступ на чтение/запись к «другой» группе, ознакомьтесь с моим другим решением здесь:

https://stackoverflow.com/a/18703956/385979

person Code Commander    schedule 09.09.2013

На самом деле все просто, если предположить, что вы sudoer и ваше имя пользователя martinlutherking.

sudo adduser martinlutherking www-data

Таким образом, консольные команды торта могут читать файлы кеша, созданные apache2, однако вам может потребоваться выполнить обратную группу, чтобы гарантировать, что www-data может читать файлы кеша, созданные martinlutherking.

person Soup Cup    schedule 16.08.2017

На всякий случай, если кто-нибудь увидит это и задастся вопросом, как это работает в cakePHP 3.x:

изменить /config/app.php и добавить 'mask' => 0666 к

/**
 * Configure the cache adapters.
 */
'Cache' => [
    'default' => [
        'className' => 'File',
        'path' => CACHE,
        'url' => env('CACHE_DEFAULT_URL', null),
        'mask' => 0666
    ],

и, вероятно, вы также хотите добавить его в файлы журнала:

/**
 * Configures logging options
 */
'Log' => [
    'debug' => [
        'className' => 'Cake\Log\Engine\FileLog',
        'path' => LOGS,
        'file' => 'debug',
        'levels' => ['notice', 'info', 'debug'],
        'url' => env('LOG_DEBUG_URL', null),
        'mask' => 0666
    ],
    'error' => [
        'className' => 'Cake\Log\Engine\FileLog',
        'path' => LOGS,
        'file' => 'error',
        'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
        'url' => env('LOG_ERROR_URL', null),
        'mask' => 0666
    ],
],
person makkus    schedule 16.02.2018