Подскажите, пожалуйста. На сайте периодически в журнале ошибок появляется примерно такое:
2020-09-2819:36:46 - PHP Warning: fopen(сайт.ру/storage/cache/cache.seopro.cat_tree.1601325405): failed to open stream: No such file or directory in сайт.ру/system/library/cache/file.php on line 282020-09-2819:36:46 - PHP Warning: flock() expects parameter 1 to be resource, boolean given in сайт.ру/html/system/library/cache/file.php on line 302020-09-2819:36:46 - PHP Warning: filesize(): stat failed for сайт.ру/storage/cache/cache.seopro.cat_tree.1601325405in сайт.ру/system/library/cache/file.php on line 322020-09-2819:36:46 - PHP Warning: fread() expects parameter 1 to be resource, boolean given in сайт.ру/system/library/cache/file.php on line 322020-09-2819:36:46 - PHP Warning: flock() expects parameter 1 to be resource, boolean given in сайт.ру/system/library/cache/file.php on line 342020-09-2819:36:46 - PHP Warning: fclose() expects parameter 1 to be resource, boolean given in сайт.ру/system/library/cache/file.php on line 36
Файл /system/library/cache/file.php выглядит в этом месте так:
Подскажите, из-за чего это и как это можно исправить? Заранее благодарен.
Алеандр
maximka77 : Подскажите, из-за чего это и как это можно исправить? Заранее благодарен.
Отсутствует файл, с которым должны производиться действия. Возможно, что файл должен создаваться ранее автоматически, может быть проблема в правах на папку, т.е. этот файл невозможно там создать из-под пользователя, из-под которого работает скрипт. Это или юзер apache может быть или юзер с именем вашего аккаунта FTP и т.д., смотря что за сервер/хостинг. Следовательно, нужно проверить права на эту самую папку, которая DIR_CACHE (storage/cache/) и разрешить в нее запись для нужного пользователя.
Вся остальная пачка проблем в том, что по определению проверяется не наличие открываемого файла, а лишь указание его имени. Имя приехало, файла на месте нет. Учитывая, что это кэш, он должен автоматом создаваться и обновляться. Так что, первым делом копайте в сторону прав на директорию, а если не поможет — нужно искать кто и где должен был создать этот файл ранее и уже там смотреть, почему не создался.
maximka77
Алеандр , права на папку /system/library/cache/file.php стоят — 755, на сам файл file.php — 655.
Это правильно?
Андрей Воробьев
В коде явно напрашивается в `if` добавить проверку на наличие файла,
что-то типа `if ($files and array_key_exists(0, $files) and file_exists($files[0])) {`
+ проверить результат `fopen` на `false`.
Проверьте, может в новой версии cms/расширения это уже реализовано,
если нет, то напишите разработчикам и скиньте им этот лог с предупреждениями.
LEOnidUKG
Кэш очистили руками когда шёл запрос к сайту вот и всё. Ничего страшного нет, нормальная работа.
В коде явно напрашивается в `if` добавить проверку на наличие файла,
А glob по вашему что делает? Из воздуха этот файл берёт? Это вам не самописная CMS.
Возможно, что файл должен создаваться ранее автоматически, может быть проблема в правах на папку, т.е. этот файл невозможно там создать из-под пользователя, из-под которого работает скрипт.
Если Opencart/ocStore не видели в глаза, зачем эту ахинею писать? Если файл не создался, то и запрашивать будет нечего, так работает там система.
Андрей Воробьев
О, вот узнаю типичное хамское поведение на рунетовском форуме.
> Ничего страшного нет
Согласен
> нормальная работа
Нет, предупреждения по возможности надо исправлять, но это не критично, да.
> А glob по вашему что делает? Из воздуха этот файл берёт?
Во время работы glob файл есть, когда работает fopen файла уже нет.
Такую ситуацию file_exists перед fopen отловит, если нет — то проверка результата fopen на false.
LEOnidUKG
Андрей Воробьев #:
О, вот узнаю типичное хамское поведение на рунетовском форуме.
> Ничего страшного нет
Согласен
> нормальная работа
Нет, предупреждения по возможности надо исправлять, но это не критично, да.
> А glob по вашему что делает? Из воздуха этот файл берёт?
Во время работы glob файл есть, когда работает fopen файла уже нет.
Такую ситуацию file_exists перед fopen отловит, если нет — то проверка результата fopen на false.
А вот типичное проявление глупость в рунете, лезьте с советами туда, в чём ничего не понимаешь. Классика!
А если и после fopen он исчезнет как быть? На каждую строчку писать условия проверки?
Такое поведение не стандартное для движка и вызвано «третьей стороной». Поэтому делать ничего не нужно.
Хотя можно сделать, рекомендую перевести на memcache или redis кэш, в разы бодрее будет работать движок.
maximka77
Спасибо большое всем за помощь!
Андрей Воробьев
> А если и после fopen он исчезнет как быть? На каждую строчку писать условия проверки?
Да.
С таким подходом можно и тесты не писать — а зачем?
> Такое поведение не стандартное для движка и вызвано «третьей стороной». Поэтому делать ничего не нужно.
Но это же происходит не один раз, а периодически, с этим надо что-то делать — перенести кэш в мемкеш норм вариант.
Если на такое забивать, то когда-нибудь в потоке такого мусорного шума будет пропущено важное.
V_G
Андрей Воробьев #:
> А если и после fopen он исчезнет как быть? На каждую строчку писать условия проверки?
Да.
С таким подходом можно и тесты не писать — а зачем?
> Такое поведение не стандартное для движка и вызвано «третьей стороной». Поэтому делать ничего не нужно.
Но это же происходит не один раз, а периодически, с этим надо что-то делать — перенести кэш в мемкеш норм вариант.
Если на такое забивать, то когда-нибудь в потоке такого мусорного шума будет пропущено важное.
Проблема инвалидации кеша идет именно в ситуации «стая собак». Это когда один процесс инициирует инвалидацию кеша, а второй еще успевает получить ответ что файл кеша есть. Но на момент доступа файла фиически уже и еще нет.
LEOnidUKG
Андрей Воробьев #:
> А если и после fopen он исчезнет как быть? На каждую строчку писать условия проверки?
Да.
Мде… сразу видно человека, который вообще никогда не работал с высоконагруженными проектами. Даже в голову не приходит вам, что каждая проверка = жор ресурса диска.
maximka77
Подскажите, пожалуйста. На сайте периодически в журнале ошибок появляется примерно такое:
Файл /system/library/cache/file.php выглядит в этом месте так:
Подскажите, из-за чего это и как это можно исправить? Заранее благодарен.
Алеандр
Подскажите, из-за чего это и как это можно исправить? Заранее благодарен.
Отсутствует файл, с которым должны производиться действия. Возможно, что файл должен создаваться ранее автоматически, может быть проблема в правах на папку, т.е. этот файл невозможно там создать из-под пользователя, из-под которого работает скрипт. Это или юзер apache может быть или юзер с именем вашего аккаунта FTP и т.д., смотря что за сервер/хостинг. Следовательно, нужно проверить права на эту самую папку, которая DIR_CACHE (storage/cache/) и разрешить в нее запись для нужного пользователя.
Вся остальная пачка проблем в том, что по определению проверяется не наличие открываемого файла, а лишь указание его имени. Имя приехало, файла на месте нет. Учитывая, что это кэш, он должен автоматом создаваться и обновляться. Так что, первым делом копайте в сторону прав на директорию, а если не поможет — нужно искать кто и где должен был создать этот файл ранее и уже там смотреть, почему не создался.
maximka77
Алеандр , права на папку /system/library/cache/file.php стоят — 755, на сам файл file.php — 655.
Это правильно?
Андрей Воробьев
В коде явно напрашивается в `if` добавить проверку на наличие файла,
что-то типа `if ($files and array_key_exists(0, $files) and file_exists($files[0])) {`
+ проверить результат `fopen` на `false`.
Проверьте, может в новой версии cms/расширения это уже реализовано,
если нет, то напишите разработчикам и скиньте им этот лог с предупреждениями.
LEOnidUKG
Кэш очистили руками когда шёл запрос к сайту вот и всё. Ничего страшного нет, нормальная работа.
В коде явно напрашивается в `if` добавить проверку на наличие файла,
А glob по вашему что делает? Из воздуха этот файл берёт? Это вам не самописная CMS.
Возможно, что файл должен создаваться ранее автоматически, может быть проблема в правах на папку, т.е. этот файл невозможно там создать из-под пользователя, из-под которого работает скрипт.
Если Opencart/ocStore не видели в глаза, зачем эту ахинею писать? Если файл не создался, то и запрашивать будет нечего, так работает там система.
Андрей Воробьев
LEOnidUKG
А вот типичное проявление глупость в рунете, лезьте с советами туда, в чём ничего не понимаешь. Классика!
А если и после fopen он исчезнет как быть? На каждую строчку писать условия проверки?
Такое поведение не стандартное для движка и вызвано «третьей стороной». Поэтому делать ничего не нужно.
Хотя можно сделать, рекомендую перевести на memcache или redis кэш, в разы бодрее будет работать движок.
maximka77
Андрей Воробьев
> А если и после fopen он исчезнет как быть? На каждую строчку писать условия проверки?
Да.
С таким подходом можно и тесты не писать — а зачем?
> Такое поведение не стандартное для движка и вызвано «третьей стороной». Поэтому делать ничего не нужно.
Но это же происходит не один раз, а периодически, с этим надо что-то делать — перенести кэш в мемкеш норм вариант.
Если на такое забивать, то когда-нибудь в потоке такого мусорного шума будет пропущено важное.
V_G
> А если и после fopen он исчезнет как быть? На каждую строчку писать условия проверки?
Да.
С таким подходом можно и тесты не писать — а зачем?
> Такое поведение не стандартное для движка и вызвано «третьей стороной». Поэтому делать ничего не нужно.
Но это же происходит не один раз, а периодически, с этим надо что-то делать — перенести кэш в мемкеш норм вариант.
Если на такое забивать, то когда-нибудь в потоке такого мусорного шума будет пропущено важное.
Проблема инвалидации кеша идет именно в ситуации «стая собак». Это когда один процесс инициирует инвалидацию кеша, а второй еще успевает получить ответ что файл кеша есть. Но на момент доступа файла фиически уже и еще нет.
LEOnidUKG
> А если и после fopen он исчезнет как быть? На каждую строчку писать условия проверки?
Да.
Мде… сразу видно человека, который вообще никогда не работал с высоконагруженными проектами. Даже в голову не приходит вам, что каждая проверка = жор ресурса диска.
Благо вы не разработчик данной CMS.