Подскажите код получения ответа сервера

Тема в разделе "Thunder 3.X", создана пользователем ddn128, 26 апр 2017.

  1. ddn128

    ddn128 Опытный Пользователь

    31 дек 2015
    520
    238
    Мужской
    Собственно есть
    Код:
    <?php
    
    $url = 'http://ya.ru';
    $headers = get_headers($url);
    
    echo substr($headers[0], 9, 3);
    ?>
    
    Т.е. проверяем лик и получаем ответ сервера.
    В шабе такое
    Код:
    {%  set response = php_get_headers(url) %}
    не работает :(
    Собственно как эту ф-цию оформить в плагин? Чё-то мне не хватает моска
    Или мож. есть другое решение?

    P.S. Зачем это? Например при кешировании картинок, если картинка битая, то получим всеми любимый
    " Slim Application Error "
    а так, зная ответ заранее, можем либо подставить другую картинку, либо не кешировать, либо ... - стр. сгенерится.
    ХЗ, мож и с таймаут CURL так можно будет победить. А может и нед.
     
  2. Art

    Art Участник

    23 фев 2017
    28
    9
    Мужской
    php\html\css developer
    Вобще интересная мысль проверять перед загрузкой.
    Если что-то сделаю номральное отпишусь.
    Пока мне хватает, того что сделал небольшой fix фунции кеширования изображений:

    PHP:
    $url_arr preg_split('/[\?#]/'$url);
    $info = new SplFileInfo($url_arr[0]);
    Заметил что ссылки на изображения иногда приходять, типа:
    image.jpg?bla=bla
    image.jpg#bla

    и я их предварительно разделяю по этим знакам (#,?), чтобы ошибка не выскакивала.

    А Curl разве из-за битых ссылок выскакивает? С локалки тестишь или с сервера?
     
  3. ddn128

    ddn128 Опытный Пользователь

    31 дек 2015
    520
    238
    Мужской
    #3 ddn128, 26 апр 2017
    Последнее редактирование: 26 апр 2017
    я чищу регуляркой

    Код:
    {% set patterns_i = ['/\\.jpg.*/','/\\.jpeg.*/','/\\.png.*/','/\\.gif.*/' ] %}
    {% set replacements_i = ['.jpg','.jpeg','.png','.gif'] %}
    {% set img_rpl_h = php_preg_replace(patterns_i,replacements_i,post_images[0]) %}
    
    нет, но там же явно не 200 приходит (подозреваю 500) ещё не отлавливал, вот этот ответ думаю (в теории) можно отловить и отослать запрос ещё раз или взять др. ПС или не вывести без парсинга - кому как.
    Да, долго, но зато стр. сгенерится
     
  4. Art

    Art Участник

    23 фев 2017
    28
    9
    Мужской
    php\html\css developer
    Ок, норм вариант.

    Сейчас попробовал у себя на первом баннере с яндекса:
    Код:
    {%  set response = php_get_headers('https://awaps.yandex.net/0/c1/tx21lszVAoU5vGvVMTT5HdeOV1qDKWHxMRU7tbdyzVD-oRt4SwT6mrHeS97Hv_tv6T-AvcjIjDS99mUT-z+YpPAtsGLpfQwJSsbHqq2+0fwwNQvEZ-NhxJUyisP_tobp2kt9IQSXxlekB4DGbD9K0NRe3JBZSvDxcTzyxtxC+CicWowIJQ5pjM+Za_tkwy9CB3tmMruKe4gNh+vkc2hJkMmfFqgb-wzEDKRYA5HChiaTOB+0EwRawn+_tRWN7O207OPINGLsAWAqKiaJI8TqYv8hs0kWyfD0KGuWQZof0UAEh9hFwrQzu_tVczaU0oyrlVzU+jNJehf0rx8EVf3S9yLGAu6uwZ4mbPgGxMmDb5EpOUDlJrq_t4dGafKjDLbImks08957OrlqREF31-NyZxaLy3O4NhFRccEegEhqY9F6PfDpl_VWdNA9ktgbkMb2Q4CEn++RKI6Asq4_A_.gif') %}
    {{ php_print_r(response) }}
    
    В ответ получил такое:
    Код:
    Array
    (
        [0] => HTTP/1.1 200 OK
        [1] => Server: nginx
        [2] => Date: Wed, 26 Apr 2017 15:26:07 GMT
        [3] => Content-Type: image/png
        [4] => Content-Length: 10060
        [5] => Connection: close
        [6] => Cache-Control: no-cache, no-store, must-revalidate, max-age=5
        [7] => P3P: CP="NOI DEVa TAIa OUR BUS UNI STA"
        [8] => Access-Control-Allow-Credentials: true
        [9] => Accept-Ranges: bytes
    )
    1

    А у тебя вобще не работает или не работает только с битыми ссылками?
     
    ddn128 нравится это.
  5. ddn128

    ddn128 Опытный Пользователь

    31 дек 2015
    520
    238
    Мужской
    точно, на серваке робит. А на локалке скотина не хочет :(
     
  6. Art

    Art Участник

    23 фев 2017
    28
    9
    Мужской
    php\html\css developer
    Ну да, у меня на локалке тоже иногда Curl timeout при загрузке изображений выскакивает.
     
  7. ddn128

    ddn128 Опытный Пользователь

    31 дек 2015
    520
    238
    Мужской
    Угу. Раньше всегда работал напрямую с серв., пока "тру" прогр. не начали чмырить :) - типо нафига, если можно на локалке - а вот фигушки, оказывается - возвращаюсь на серв.
     
  8. Art

    Art Участник

    23 фев 2017
    28
    9
    Мужской
    php\html\css developer
    #8 Art, 20 июн 2017
    Последнее редактирование: 20 июн 2017
    ...
     
  9. Art

    Art Участник

    23 фев 2017
    28
    9
    Мужской
    php\html\css developer
    Сорри, плохо протестил.) Оказалось, не работает с этим параметром. Я лучше затру прошлое сообщение.
     
  10. Art

    Art Участник

    23 фев 2017
    28
    9
    Мужской
    php\html\css developer
    Нашлось банальное решение, чтобы не ловить ошибку Curl :

    Код:
            $options = array(
                'follow_redirects' => true,
                'useragent'=>'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36',
                'cookies' => $this->container['cookie']
            );
            try {
    
                $response = Requests::get($url,array(), $options);
    
                if($response->success === false){
    
                    return null;
                }
    
            } catch (Requests_Exception $e) {
    
                return null;
            }
    
    т.е. если вдруг бан по ip и еще что-то , то просто отдаст null , а не ошибку :)
    кстати ютуб меня начал банить, когда много обращений с одной ip
     
    ddn128 нравится это.
  11. Glokken

    Glokken Участник

    26 окт 2015
    144
    32
    Мужской
    А куда все это пихать??? Как использовать? Для чайников, плиз! :)
     
    heyner нравится это.
  12. Art

    Art Участник

    23 фев 2017
    28
    9
    Мужской
    php\html\css developer
    Это нужно в плагинах поискать вот эту строчку:
    Код:
    $response = Requests::get($url,array(), $options);
    и просто обернуть ее в try catch:
    Код:
    try {
    
                $response = Requests::get($url,array(), $options);
    
                if($response->success === false){
    
                    return null;
                }
    
            } catch (Requests_Exception $e) {
    
                return null;
            }
     

Поделиться этой страницей