Warning: file_get_contents

Тема в разделе "Как сделать...", создана пользователем Sankaboy, 19 июн 2012.

  1. Sankaboy

    Sankaboy Постоялец

    Регистр.:
    1 фев 2012
    Сообщения:
    112
    Симпатии:
    3
    Привет! Сделал авторизацию через твиттер. И иногда выдает такую ошибку(опасность) -
    Warning: file_get_contents(http://twitter.com/users/show.json?screen_name=mudris..) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /index.php on line 22
    Warning: Division by zero in /index.php on line 25

    Как это понять?
    http://twitter.com/users/show.json?screen_name=mudris.. - рабочая. Твиттер лагает что ли?

    Строка с ошибкой:
    PHP:
    $response file_get_contents($url); 
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.183
    Вообще 400 ошибку сервисы любят выдавать при неверных параметрах в запросе, попробовал с твоим запросом поизвращаться поэкспериментировать, 400 получить не смог. Так что приводи скрипт полностью или как минимум всё до момента ошибки.
     
    Sankaboy нравится это.
  3. Sankaboy

    Sankaboy Постоялец

    Регистр.:
    1 фев 2012
    Сообщения:
    112
    Симпатии:
    3
    Вот текст:
    PHP:
    $url_api_info_user "http://twitter.com/users/show.json?screen_name=$nam";
    $json_file_get_info_user file_get_contents($url_api_info_user);
    $aviable_user_info json_decode($json_file_get_info_usertrue);
    Стоит на странице, которая постоянно обновляется. Может из-за больше количества обновлений оно глючит?
     
  4. -=Xardas=-

    -=Xardas=-

    Регистр.:
    17 сен 2008
    Сообщения:
    250
    Симпатии:
    58
    Да, скорее всего так и есть, твитер отдает 400 ошибку из за слишком частых запросов от тебя, добавь кеширование ответа, например так:
    PHP:
    <?php
    //путь к папке куда будем кешировать (используем временную папку системы)
    $twitterCacheDir sys_get_temp_dir()."/twitterCache";

    //имя файла в который кешируем
    $cacheFileName $twitterCacheDir."/".$nam.".twittcache";

    //время инвалидации кеша, возьмем 10 минут
    $cacheInvalidate 600;

    //проверим, существует ли папка в которую мы будем писать кеш, если нет - создадим ее
    if(!file_exists($twitterCacheDir))
          
    mkdir($twitterCacheDir);

    $url_api_info_user "http://twitter.com/users/show.json?screen_name=$nam";

    //условия инвалидации кеша
    if(!file_exists($cacheFileName) or (time() - filemtime($cacheFileName) >= $cacheInvalidate))
    {
          
    //кешируем данные
          
    $json_file_get_info_user file_get_contents($url_api_info_user);
          
    file_put_contents($cacheFileName$json_file_get_info_user);
    }

    //берем данные из кеша
    else
         
    $json_file_get_info_user file_get_contents($cacheFileName);

    $aviable_user_info json_decode($json_file_get_info_usertrue);
     
    Sankaboy нравится это.
  5. Sankaboy

    Sankaboy Постоялец

    Регистр.:
    1 фев 2012
    Сообщения:
    112
    Симпатии:
    3
    Решил испытать.
    Ошибки:

    Код:
    Warning: file_exists() [function.file-exists]: open_basedir restriction in effect. File(/tmp/temporarycache) is not within the allowed path(s (/home/alexa102/:/usr/local/php5/lib/php/) in /home/alexa102/domains/сайт/public_html/файл.php on line 31
    Warning: mkdir() [function.mkdir]: open_basedir restriction in effect. File(/tmp/temporarycache) is not within the allowed path(s (/home/alexa102/:/usr/local/php5/lib/php/) in /home/alexa102/domains/ сайт /public_html/ файл .php on line 32
    Warning: file_exists() [function.file-exists]: open_basedir restriction in effect. File(/tmp/temporarycache/HancCox.infocache) is not within the allowed path(s (/home/alexa102/:/usr/local/php5/lib/php/) in /home/alexa102/domains/ сайт /public_html/ файл .php on line 37
    Warning: file_put_contents() [function.file-put-contents]: open_basedir restriction in effect. File(/tmp/temporarycache/HancCox.infocache) is not within the allowed path(s (/home/alexa102/:/usr/local/php5/lib/php/) in /home/alexa102/domains/ сайт /public_html/ файл .php on line 41
    Warning: file_put_contents(/tmp/temporarycache/HancCox.infocache) [function.file-put-contents]: failed to open stream: Operation not permitted in/home/alexa102/domains/ сайт /public_html/ файл .php on line 41
    
    Папка с временными файлами называется - phptmp. Хотя думаю это не важно.
    Помогите пожалуйста.
     
  6. ev-goo

    ev-goo Создатель

    Регистр.:
    28 май 2012
    Сообщения:
    10
    Симпатии:
    9
    sys_get_temp_dir() - Возвращает путь к каталогу который указан в настройках. По умолчанию это tmp
    А у тебя настройками хостинга запрещен доступ к папке tmp. Следовательно данная функция работать не будет.

    Поэтому делай без этой функции, как-нибудь так, имя папки ставь какое нужно.

    PHP:
    //путь к папке куда будем кешировать (используем временную папку системы)
    $twitterCacheDir "/twitterCache";
     
    if(!
    file_exists($twitterCacheDir)){
        
    //создаем каталог, с правами 0777
        
    @mkdir ($twitterCacheDir0777);
        @
    chmod ($twitterCacheDir0777);//на всякий случай :)
    }
    Ну или проси хостера отключить open_basedir))))
     
    Sankaboy нравится это.
  7. Yaggi Jah

    Yaggi Jah Постоялец

    Регистр.:
    15 ноя 2006
    Сообщения:
    75
    Симпатии:
    31
    У вас просто нет прав писать в папку /tmp, создайте tmp в папке со скриптом и пишите туда (не забудьте chmod 777 на неё)
     
    Sankaboy нравится это.
  8. ev-goo

    ev-goo Создатель

    Регистр.:
    28 май 2012
    Сообщения:
    10
    Симпатии:
    9
    Гениально, как же мы сами не догадались...
     
  9. Sankaboy

    Sankaboy Постоялец

    Регистр.:
    1 фев 2012
    Сообщения:
    112
    Симпатии:
    3
    Разве так можно делать?:)
     
  10. web-cool

    web-cool Создатель

    Регистр.:
    27 май 2007
    Сообщения:
    37
    Симпатии:
    7
    Попробуй использовать это
    Код:
    function file_get_contents_curl($url) {
        $ch = curl_init();
     
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Set curl to return the data instead of printing it to the browser.
        curl_setopt($ch, CURLOPT_URL, $url);
     
        $data = curl_exec($ch);
        curl_close($ch);
     
        return $data;
    }