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

Тема в разделе "Как сделать...", создана пользователем vojack, 2 фев 2013.

  1. vojack

    vojack Постоялец

    Регистр.:
    11 окт 2009
    Сообщения:
    128
    Симпатии:
    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);
                    }
                }
            }
        }
     
  2. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.728
    Симпатии:
    2.105
    результом
    является директория, а не имя файла
    нужно смотреть, что получается в результате десериализации $res, воспользуйся временно var_dump после $res = unserialize($res), чтоб увидеть, что хранится в переменной
    походу $filename который является ключиком гдето имеет пустое (???) значение
     
  3. vojack

    vojack Постоялец

    Регистр.:
    11 окт 2009
    Сообщения:
    128
    Симпатии:
    9
    т.е. идет ссылка на файл, а файла самого нет?
     
  4. penguen

    penguen

    Регистр.:
    7 янв 2007
    Сообщения:
    825
    Симпатии:
    95
    либо нет либо значение нуль
     
  5. ВладимирТрой

    ВладимирТрой Постоялец

    Регистр.:
    29 янв 2013
    Сообщения:
    53
    Симпатии:
    19
    добавь проверку на file_exists в начале цикла после инициализации $filename что-то вроде
    PHP:
    if (!file_exists($filename) ) continue;
    при получении файлов из директории ф-цией readdir так же получаются и директории и так же пустое значение, если я не ошибаюсь, как текущая директория
     
  6. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.728
    Симпатии:
    2.105
    помочь то оно поможет, но суть проблемы понять стоило бы. почему десериализация возвращает пустые значения? если интересно всё таки узнать, в чём же дело, попробуйте вывести значение переменной $res var_dump-ом, до и после десериализации.
     
  7. unkn0wn

    unkn0wn

    Регистр.:
    22 дек 2006
    Сообщения:
    164
    Симпатии:
    86
    Ну до десериализации var_dump'ить все-таки лишнее, до десериализации $res - всего лишь строка вида{a:5:12345, ...}, там смотреть особо не на что, разве что увидеть пустую строку с нулевой длиной, а вот после десериализации проверить было бы правильнее всего. Но это если нужно докопаться до проблемы. Если же не стоит вопрос с потерей данных, то после строки
    Код:
    $filename = $cache_dir.'/'.$filename;
    можно добавить условие а-ля
    Код:
    if (!is_dir($filename)) {
    , так оно как-то лаконичнее.
     
    ipbfan2008 нравится это.
  8. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.728
    Симпатии:
    2.105
    в принципе да, до сериализации нечего по сути смотреть, в случае если там нету явной ошибки в самом строке до десериализации, а так может помочь понять, что не так. мы же не знаем каким образом получены $res данные, возможно в процессе сериализации есть недочёт.
     
  9. unkn0wn

    unkn0wn

    Регистр.:
    22 дек 2006
    Сообщения:
    164
    Симпатии:
    86
    Ну ошибка там какбе имеется, иначе откуда берется пустой элемент в массиве. Другое дело - надо ли это ТС, искать эту ошибку.
     
    ipbfan2008 нравится это.