Здравствуйте, регулярно (каждую неделю появляются снова) замечаю ошибки, связанные с кэшем на моем сайте.
"file_put_contents(/var/www/cp.easydonate.ru/storage/framework/cache/eb/41/eb4195f1b305264ee4e97076c6d26ba8162dc3ef): failed to open stream: No such file or directory" on line 133 of /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php

Такая ошибка появляется, когда происходит какое-то действие. Например, в данном случае через Ajax запрос я обновляю форму для вывода денежных средств в личном кабинете. Ajax обработчик выглядит так:

public function onChosePaymentType()
{
    $payment_type = post('payment_type');
    if (!$payment_type) {
        throw new ApplicationException('Что-то пошло не так. Пожалуйста, обновите страницу.');
    }

    if (!in_array($payment_type, ['qiwi', 'card', 'webmoney', 'mc', 'yandex'])) {
        throw new ApplicationException('Выбранная платежная система не поддерживается.');
    }

    return [
        '#payout-form' => $this->renderPartial("@payout-form-{$payment_type}", [
            'user' => $this->user,
            'lastPayout' => $this->user->payouts->where('payment_type', $payment_type)->last()
        ])
    ];
}

Никакие кэш-методы я не использую.
Вот кэш-конфиг:

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Default Cache Store
    |--------------------------------------------------------------------------
    |
    | This option controls the default cache connection that gets used while
    | using this caching library. This connection is used when another is
    | not explicitly specified when executing a given caching function.
    |
    */

    'default' => 'file',

    /*
    |--------------------------------------------------------------------------
    | Cache Stores
    |--------------------------------------------------------------------------
    |
    | Here you may define all of the cache "stores" for your application as
    | well as their drivers. You may even define multiple stores for the
    | same cache driver to group types of items stored in your caches.
    |
    */

    'stores' => [

        'apc' => [
            'driver' => 'apc'
        ],

        'array' => [
            'driver' => 'array'
        ],

        'database' => [
            'driver' => 'database',
            'table'  => 'cache',
            'connection' => null,
        ],

        'file' => [
            'driver' => 'file',
            'path'   => storage_path('framework/cache'),
        ],

        'memcached' => [
            'driver'  => 'memcached',
            'servers' => [
                [
                    'host'   => '127.0.0.1',
                    'port'   => 11211,
                    'weight' => 100,
                ],
            ],
        ],

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
        ],

    ],

    /*
    |--------------------------------------------------------------------------
    | Cache Key Prefix
    |--------------------------------------------------------------------------
    |
    | When utilizing a RAM based store such as APC or Memcached, there might
    | be other applications utilizing the same cache. So, we'll specify a
    | value to get prefixed to all our keys so we can avoid collisions.
    |
    */

    'prefix' => 'october',

    /*
    |--------------------------------------------------------------------------
    | Cache Key for the CMS' PHP code parser cache
    |--------------------------------------------------------------------------
    |
    | This option controls the cache key used by the CMS when storing generated
    | PHP from the theme PHP sections. Recommended to change this when multiple
    | servers running OctoberCMS are connected to the same cache server to
    | prevent conflicts.
    |
    */

    'codeParserDataCacheKey' => 'cms-php-file-data',

    /*
    |--------------------------------------------------------------------------
    | Disable Request Cache
    |--------------------------------------------------------------------------
    |
    | The request cache stores cache retrievals from the cache store
    | in memory to speed up consecutive retrievals within the same request.
    |
    | true  - always disable this in-memory request cache
    |
    | false - always enable; be aware that long-running console commands
    |         (including queue workers) may retain cache entries in memory that
    |         have been changed in other processes or would have otherwise
    |         expired, causing issues with the `queue:restart` command, for
    |         example
    |
    | null  - enable for HTTP requests, disable when running in CLI
    |
    */

    'disableRequestCache' => null,
];

php artisan cache:clear помогает, но этого недостаточно. Как я уже сказал выше, такие ошибки появляются сами по себе регулярно

  • DontFollow123 Это тебе ответ на "иного выхода не нашел". На вопрос по теме уже даже причины дал выше. Другим помочь не могу, доступа к серверу не имею, понимая по настройкам не знаю, гадать на гуще - не возможно.

    Смотри в первую очередь настройки сервера, если не уверен в правах. Либо отключай файловое кеширование путем установки default => 'array'. Если уверен в том что у тебя хорошо настроенный сервер и дело не в правах, тогда один из вариантов поставить memcache или redis, скинув Кеш из файлов туда. Там в принципе ни права, ни настройки сервера не должны мешать.

Вам и не обязательно что-то использовать для кеширования. Кеш данные это не только те данные которые именно Вы туда кладете. Система может кешировать какие-то вспомогательные данные, например данные страниц или настройки.

В данном случае необходимо удостовериться что на storage стоят разрешенные права доступа 777, либо удостовериться в верной настройке сервера, чтобы пользователь php имел доступ на запись и работу с каталогом storage.

Папка storage с правами 777
php-fpm работает от имени root, как и nginx

  • LeMaX10 ответили на это сообщение.

    DontFollow123 это точно? ибо от рута их ни кто никогда не делает из соображений безопасности.
    Права рекурсивные ?

      LeMaX10 это точно. От рута мне нужно запускать, чтобы в процессе использовать Linux-команды через PHP. Понимаю, что безопасностью рискую, но иного выхода я не нашел. Да и вообще это не по теме 🙂

      • LeMaX10 ответили на это сообщение.

        Есть костыльный вариант решения этой проблемы: через cron запускать php artisan cache:clear. Может быть, есть более удачное решение?

        LeMaX10, дело не в правах, я думаю. Я использовал chmod -R 777 /var/www/cp.easydonate.ru/*, чтобы рекурсивно выдать 777 права на всю директорию и подкаталоги

        • LeMaX10 ответили на это сообщение.

          DontFollow123 нужные команды можно дать доступ пользователю на исполнение этих команд.
          Часть команд выместить на выполнение, например - в очередях.

            DontFollow123 ошибка на попытку записи. Возможные причины:

            1. Права доступа
            2. Корявые настройки доступов nginx, fpm
            3. Не хватает объема разрешенного ОЗУ для помещения содержимого в файл - выдается exception в результате чего такая ошибка недоступности каталога
            4. Место на диске

            Я больше склоняюсь к правам и корявым настройкам nginx, fpm

              LeMaX10, давайте не будем сейчас о безопасности исполнения скриптов, я сам знаю эту проблему и буду решать её в будущем. Сейчас вопрос об ошибках кэширования

              • LeMaX10 ответили на это сообщение.

                LeMaX10 вот полный стэк ошибки

                ErrorException: file_put_contents(/var/www/cp.easydonate.ru/storage/framework/cache/eb/41/eb4195f1b305264ee4e97076c6d26ba8162dc3ef): failed to open stream: No such file or directory in /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:133
                Stack trace:
                #0 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'file_put_conten...', '/var/www/cp.eas...', 133, Array)
                #1 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php(133): file_put_contents('/var/www/cp.eas...', '1608110163N;', 2)
                #2 /var/www/cp.easydonate.ru/vendor/october/rain/src/Filesystem/Filesystem.php(244): Illuminate\Filesystem\Filesystem->put('/var/www/cp.eas...', '1608110163N;', true)
                #3 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Cache/FileStore.php(74): October\Rain\Filesystem\Filesystem->put('/var/www/cp.eas...', '1608110163N;', true)
                #4 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(211): Illuminate\Cache\FileStore->put('partials1615413...', NULL, 600)
                #5 /var/www/cp.easydonate.ru/vendor/october/rain/src/Halcyon/MemoryRepository.php(60): Illuminate\Cache\Repository->put('partials1615413...', NULL, Object(Illuminate\Support\Carbon))
                #6 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Cache/Repository.php(383): October\Rain\Halcyon\MemoryRepository->put('partials1615413...', NULL, Object(Illuminate\Support\Carbon))
                #7 /var/www/cp.easydonate.ru/vendor/october/rain/src/Halcyon/Builder.php(649): Illuminate\Cache\Repository->remember('partials1615413...', Object(Illuminate\Support\Carbon), Object(Closure))
                #8 /var/www/cp.easydonate.ru/vendor/october/rain/src/Halcyon/Builder.php(324): October\Rain\Halcyon\Builder->getCached(Array)
                #9 /var/www/cp.easydonate.ru/vendor/october/rain/src/Halcyon/Builder.php(258): October\Rain\Halcyon\Builder->get()
                #10 /var/www/cp.easydonate.ru/vendor/october/rain/src/Halcyon/Builder.php(248): October\Rain\Halcyon\Builder->first()
                #11 /var/www/cp.easydonate.ru/modules/cms/classes/CmsObject.php(118): October\Rain\Halcyon\Builder->find('wallet/payout-f...')
                #12 /var/www/cp.easydonate.ru/modules/cms/classes/ComponentPartial.php(104): Cms\Classes\CmsObject::loadCached(Object(Cms\Classes\Theme), 'wallet/payout-f...')
                #13 /var/www/cp.easydonate.ru/modules/cms/classes/Controller.php(1003): Cms\Classes\ComponentPartial::loadOverrideCached(Object(Cms\Classes\Theme), Object(DontFollow\EasyDonate\Components\Wallet), 'payout-form-qiw...')
                #14 [internal function]: Cms\Classes\Controller->renderPartial('::payout-form-q...', Array)
                #15 /var/www/cp.easydonate.ru/modules/cms/classes/ComponentBase.php(143): call_user_func_array(Array, Array)
                #16 /var/www/cp.easydonate.ru/plugins/dontfollow/easydonate/components/Wallet.php(41): Cms\Classes\ComponentBase->renderPartial('@payout-form-qi...', Array)
                #17 /var/www/cp.easydonate.ru/modules/cms/classes/ComponentBase.php(187): DontFollow\EasyDonate\Components\Wallet->onChosePaymentType()
                #18 /var/www/cp.easydonate.ru/modules/cms/classes/Controller.php(874): Cms\Classes\ComponentBase->runAjaxHandler('onChosePaymentT...')
                #19 /var/www/cp.easydonate.ru/modules/cms/classes/Controller.php(742): Cms\Classes\Controller->runAjaxHandler('onChosePaymentT...')
                #20 /var/www/cp.easydonate.ru/modules/cms/classes/Controller.php(374): Cms\Classes\Controller->execAjaxHandlers()
                #21 /var/www/cp.easydonate.ru/modules/cms/classes/Controller.php(225): Cms\Classes\Controller->runPage(Object(Cms\Classes\Page))
                #22 /var/www/cp.easydonate.ru/modules/cms/classes/CmsController.php(50): Cms\Classes\Controller->run('wallet')
                #23 [internal function]: Cms\Classes\CmsController->run('wallet')
                #24 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
                #25 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction('run', Array)
                #26 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Routing/Route.php(219): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Cms\Classes\CmsController), 'run')
                #27 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Routing/Route.php(176): Illuminate\Routing\Route->runController()
                #28 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Routing/Router.php(681): Illuminate\Routing\Route->run()
                #29 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(130): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
                #30 /var/www/cp.easydonate.ru/plugins/alxy/captcha/middleware/CaptchaMiddleware.php(51): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
                #31 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Alxy\Captcha\Middleware\CaptchaMiddleware->handle(Object(Illuminate\Http\Request), Object(Closure))
                #32 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
                #33 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))
                #34 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
                #35 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
                #36 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(56): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
                #37 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
                #38 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
                #39 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
                #40 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
                #41 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
                #42 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
                #43 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Routing/Router.php(683): Illuminate\Pipeline\Pipeline->then(Object(Closure))
                #44 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Routing/Router.php(658): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
                #45 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Routing/Router.php(624): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))
                #46 /var/www/cp.easydonate.ru/vendor/october/rain/src/Router/CoreRouter.php(20): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
                #47 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(170): October\Rain\Router\CoreRouter->dispatch(Object(Illuminate\Http\Request))
                #48 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(130): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
                #49 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(63): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
                #50 /var/www/cp.easydonate.ru/vendor/october/rain/src/Foundation/Http/Middleware/CheckForMaintenanceMode.php(25): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
                #51 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): October\Rain\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
                #52 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
                #53 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(145): Illuminate\Pipeline\Pipeline->then(Object(Closure))
                #54 /var/www/cp.easydonate.ru/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(110): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
                #55 /var/www/cp.easydonate.ru/index.php(46): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
                #56 {main}
                • LeMaX10 ответили на это сообщение.

                  DontFollow123 Это тебе ответ на "иного выхода не нашел". На вопрос по теме уже даже причины дал выше. Другим помочь не могу, доступа к серверу не имею, понимая по настройкам не знаю, гадать на гуще - не возможно.

                  Смотри в первую очередь настройки сервера, если не уверен в правах. Либо отключай файловое кеширование путем установки default => 'array'. Если уверен в том что у тебя хорошо настроенный сервер и дело не в правах, тогда один из вариантов поставить memcache или redis, скинув Кеш из файлов туда. Там в принципе ни права, ни настройки сервера не должны мешать.

                    LeMaX10, я использую дефолтные настройки веб-сервера. ОЗУ хостинга 8гб, место на диске 100гб (использовано 5%)

                    DontFollow123 по стеку не сказать в чем именно проблема.
                    Виден запуск страницы, на которой вызывается wallet компонент и рендерится форма через partial, которая как раз и кешируется системой. Но возникает ошибка "отсутсвие директории", такая ошибка - причины в позапрошлом сообщении.

                    Последние 2 пункта можно откинуть, по стеку они не подходят, в принципе.

                    LeMaX10, спасибо за помощь. Поставил по дефолту метод кэширования array, ошибка больше не появляется. Посмотрим, будет ли так продолжаться

                    • LeMaX10 ответили на это сообщение.

                      DontFollow123 метод кеширования "array" эквивалентно отключению кеширования. Тоесть аппликейшен кладет данные для кеша в память каждый раз при каждом запросе, и очищает при окончании запроса.

                      Так что будь аккуратнее с этим.