90% всіх проблем можна вже зараз вирішити за допомогою chatgpt. Як наприклад зараз:Ці помилки виникають не через права доступу, а через те, що PHP не може відкрити файл – тобто функція fopen() повертає false, тому подальші виклики flock(), fread() та fclose() отримують невірний (boolean) параметр.
Можливі причини та рекомендації
Файл не існує або був видалений
Метод get() використовує функцію glob() для пошуку файлів за певним патерном. Якщо знайдений файл видаляється (наприклад, через логіку в конструкторі, яка видаляє прострочені файли), то між викликом glob() і fopen() файл може стати недоступним.
Відсутність перевірок помилок
У коді не перевіряється, чи вдалося відкрити файл. Якщо fopen() повертає false, подальші операції з файлом викликають помилки.
Невірна конфігурація шляху
Переконайтеся, що константа DIR_CACHE вказує на правильну директорію, і що ця директорія існує та доступна для читання/запису.
Рекомендації до покращення коду
Додайте перевірку після fopen()
Перевірте, чи вдалося відкрити файл, перш ніж виконувати інші операції. Наприклад:
public function get($key) {
$files = glob(DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.*');
if ($files) {
$handle = @fopen($files[0], 'r');
if (!$handle) {
// Файл не вдалося відкрити – можна повернути false або обробити помилку іншим способом.
return false;
}
flock($handle, LOCK_SH);
$data = fread($handle, filesize($files[0]));
flock($handle, LOCK_UN);
fclose($handle);
return json_decode($data, true);
}
return false;
}
Перевірте правильність шляху та імен файлів
Переконайтеся, що DIR_CACHE має вірне значення і директорія існує. Також перевірте, чи немає проблем із символами в іменах файлів, які можуть впливати на пошук.
Обробка видалених файлів
Якщо файл може бути видалений між викликом glob() та fopen(), розгляньте можливість додаткової перевірки на існування файлу (наприклад, file_exists()) перед його відкриттям.
Підсумовуючи, проблема не в правах доступу (хоча вони завжди варто перевіряти), а в тому, що функція fopen() не знаходить файл, і ваш код не враховує цей випадок. Внесення відповідних перевірок допоможе уникнути попереджень та стабілізує роботу кешу.