Warning: fopen(./cache/) [function.fopen]: failed to open stream:

vojack

Постоялец
Регистрация
11 Окт 2009
Сообщения
129
Реакции
9
Добрый день уважаемые веб-мастера. Подскажите как решить проблему. На странице выдает следующую ошибку:
Warning: fopen(./cache/) [function.fopen]: failed to open stream: Is a directory in /home/dorko/data/www/site.com/funcs.php on line 98

права на файл стоят 777
вот то место на которую ссылается сообщение
Код:
$res = unserialize($res);
        if (is_array($res))
        {
            foreach ($res as $filename => $binary)
            {
                $filename = $cache_dir.'/'.$filename;
                $fl = fopen($filename,'wb'); //вот это 98 строка
                if ($fl)
                {
                    fwrite($fl, base64_decode($binary));
                    fclose($fl);
                    chmod($filename, 0755);
                }
            }
        }
    }
 
результом
$filename = $cache_dir.'/'.$filename;
является директория, а не имя файла
нужно смотреть, что получается в результате десериализации $res, воспользуйся временно var_dump после $res = unserialize($res), чтоб увидеть, что хранится в переменной
походу $filename который является ключиком гдето имеет пустое (???) значение
 
добавь проверку на file_exists в начале цикла после инициализации $filename что-то вроде
PHP:
if (!file_exists($filename) ) continue;
при получении файлов из директории ф-цией readdir так же получаются и директории и так же пустое значение, если я не ошибаюсь, как текущая директория
 
помочь то оно поможет, но суть проблемы понять стоило бы. почему десериализация возвращает пустые значения? если интересно всё таки узнать, в чём же дело, попробуйте вывести значение переменной $res var_dump-ом, до и после десериализации.
 
Ну до десериализации var_dump'ить все-таки лишнее, до десериализации $res - всего лишь строка вида{a:5:12345, ...}, там смотреть особо не на что, разве что увидеть пустую строку с нулевой длиной, а вот после десериализации проверить было бы правильнее всего. Но это если нужно докопаться до проблемы. Если же не стоит вопрос с потерей данных, то после строки
Код:
$filename = $cache_dir.'/'.$filename;
можно добавить условие а-ля
Код:
if (!is_dir($filename)) {
, так оно как-то лаконичнее.
 
Ну до десериализации var_dump'ить все-таки лишнее, до десериализации $res - всего лишь строка вида{a:5:12345, ...}, там смотреть особо не на что, разве что увидеть пустую строку с нулевой длиной, а вот после десериализации проверить было бы правильнее всего. Но это если нужно докопаться до проблемы.
в принципе да, до сериализации нечего по сути смотреть, в случае если там нету явной ошибки в самом строке до десериализации, а так может помочь понять, что не так. мы же не знаем каким образом получены $res данные, возможно в процессе сериализации есть недочёт.
 
Ну ошибка там какбе имеется, иначе откуда берется пустой элемент в массиве. Другое дело - надо ли это ТС, искать эту ошибку.
 
Назад
Сверху