Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Потрібна допомога - flock() expects parameter 1 to be resource, bool given in


Loysik

Recommended Posts

Log.php:

 

2025-03-19 17:07:29 - PHP Warning:  fopen(/home/***/storage/cache/cache.store.1742407649): failed to open stream: No such file or directory in /home/hozbi43/public_html/system/library/cache/file.php on line 30
2025-03-19 17:07:29 - PHP Warning:  flock() expects parameter 1 to be resource, bool given in /home/***/public_html/system/library/cache/file.php on line 32
2025-03-19 17:07:29 - PHP Warning:  fread() expects parameter 1 to be resource, bool given in /home/***/public_html/system/library/cache/file.php on line 34
2025-03-19 17:07:29 - PHP Warning:  flock() expects parameter 1 to be resource, bool given in /home/***/public_html/system/library/cache/file.php on line 36
2025-03-19 17:07:29 - PHP Warning:  fclose() expects parameter 1 to be resource, bool given in /home/***/public_html/system/library/cache/file.php on line 38

 

File.php:

 

<?php
namespace Cache;
class File {
    private $expire;

    public function __construct($expire = 3600) {
        $this->expire = $expire;

        $files = glob(DIR_CACHE . 'cache.*');

        if ($files) {
            foreach ($files as $file) {
                $time = substr(strrchr($file, '.'), 1);

                if ($time < time()) {
                    if (file_exists($file)) {
                        if (!@unlink($file)) {
    clearstatcache(false, $file);
}
                    }
                }
            }
        }
    }

    public function get($key) {
        $files = glob(DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.*');

        if ($files) {
            $handle = fopen($files[0], 'r');

            flock($handle, LOCK_SH);

            $data = fread($handle, filesize($files[0]));

            flock($handle, LOCK_UN);

            fclose($handle);

            return json_decode($data, true);
        }

        return false;
    }

    public function set($key, $value) {
        $this->delete($key);

        $file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.' . (time() + $this->expire);

        $handle = fopen($file, 'w');

        flock($handle, LOCK_EX);

        fwrite($handle, json_encode($value));

        fflush($handle);

        flock($handle, LOCK_UN);

        fclose($handle);
    }

    public function delete($key) {
        $files = glob(DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.*');

        if ($files) {
            foreach ($files as $file) {
                if (file_exists($file)) {
                    if (!@unlink($file)) {
    clearstatcache(false, $file);
}
                }
            }
        }
    }
}

 

 

Права на папки стоять 755, на сам файл поставив 777. Але це не вирішило питання.

Змінено користувачем Loysik
Надіслати
Поділитися на інших сайтах


90% всіх проблем можна вже зараз вирішити за допомогою chatgpt. Як наприклад зараз:Ці помилки виникають не через права доступу, а через те, що PHP не може відкрити файл – тобто функція fopen() повертає false, тому подальші виклики flock(), fread() та fclose() отримують невірний (boolean) параметр.

Можливі причини та рекомендації

  1. Файл не існує або був видалений
    Метод get() використовує функцію glob() для пошуку файлів за певним патерном. Якщо знайдений файл видаляється (наприклад, через логіку в конструкторі, яка видаляє прострочені файли), то між викликом glob() і fopen() файл може стати недоступним.

  2. Відсутність перевірок помилок
    У коді не перевіряється, чи вдалося відкрити файл. Якщо fopen() повертає false, подальші операції з файлом викликають помилки.

  3. Невірна конфігурація шляху
    Переконайтеся, що константа 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() не знаходить файл, і ваш код не враховує цей випадок. Внесення відповідних перевірок допоможе уникнути попереджень та стабілізує роботу кешу.

Надіслати
Поділитися на інших сайтах


В 20.03.2025 в 09:55, mesateri сказав:

90% всіх проблем можна вже зараз вирішити за допомогою chatgpt. Як наприклад зараз:Ці помилки виникають не через права доступу, а через те, що PHP не може відкрити файл – тобто функція fopen() повертає false, тому подальші виклики flock(), fread() та fclose() отримують невірний (boolean) параметр.

Можливі причини та рекомендації

  1. Файл не існує або був видалений
    Метод get() використовує функцію glob() для пошуку файлів за певним патерном. Якщо знайдений файл видаляється (наприклад, через логіку в конструкторі, яка видаляє прострочені файли), то між викликом glob() і fopen() файл може стати недоступним.

  2. Відсутність перевірок помилок
    У коді не перевіряється, чи вдалося відкрити файл. Якщо fopen() повертає false, подальші операції з файлом викликають помилки.

  3. Невірна конфігурація шляху
    Переконайтеся, що константа 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() не знаходить файл, і ваш код не враховує цей випадок. Внесення відповідних перевірок допоможе уникнути попереджень та стабілізує роботу кешу.

Цей Штучний Ідіот (ШІ), як завжди, несе маячню.
Це баян і на форумі багато раз підіймалася ця тема. Пошук вверху

  • +1 1
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.