goto PHP не срабатывает.


Dram
105

Паршу сайт в цикле, и рандомного редко возникает такая ситуация, когда как будто на сайте слетает верстка.

Думал сперва что быстро паршу — поставил задержу, проблему не решило. Если найти ту страницу где была проблема и прогнать ее парсером 50-100 раз, то 1-2 раза я получу кашу в получаемых данных.

Причину я так и не понял, но пытался ее решить с помощью goto эта конструкция почему то у меня не срабатывает.

Вот код

 for ($n = 0; $n < count($links_IP_array); $n++) {
up:
....... 
$url2 = "https://site.ru" . $links_IP_array[$n];
$pars2 = getPageByUrl($url2);

... далее распаршиваю страницу
                if (preg_match('~^<em(.*)~m', $statusORG, $statusORGMatch)){
                    //словил баг, хочу эту страницу в этом же цикле опять перезагрузить. То что регулярка работает верно, проверил
                    goto up;  //почему он не срабатывает и не перебрасывает в начало цикла?
                }


Sly32

Если вы учитесь, то за такое бьют линейкой по рукам, если вам действительно нужно парсить, освойте нормальные инструменты типа селениума или BS


Dram

Sly32 #:
Если вы учитесь, то за такое бьют линейкой по рукам, если вам действительно нужно парсить, освойте нормальные инструменты типа селениума или BS

Понятно что готу плохо и т.п. Но почему не срабатывает?


hellhead2011

ну так оператор так в цикле и не будет работать — вот почитайте тут об этом  https://www.php.net/manual/ru/control-structures.goto.php

Ключевое предложение там по вашей ошибке: Вы  не можете перейти внутрь любой циклической структуры или оператора switch. Но вы можете выйти из них, и обычным применением оператора goto является использование его вместо многоуровневых break .

PHP: goto — Manual

  • www.php.net
(PHP 5 >= 5.3.0, PHP 7) Изображение предоставлено » xkcd Оператор используется для перехода в другую часть программы. Место, куда необходимо перейти указывается с помощью метки, за которой ставится двоеточие, после оператора указывается желаемая метка для перехода. Оператор не является неограниченным «». Целевая метка должна находиться в том же…


Dram

hellhead2011 #:

ну так оператор так в цикле и не будет работать —

Мне не нужно ВНУТРЬ, я хочу в пределах ЭТОГО ЖЕ цикла подняться выше.


hellhead2011

Dram #:

Мне не нужно ВНУТРЬ, я хочу в пределах ЭТОГО ЖЕ цикла подняться выше.

в пределах цикла сработает только выход из него


Dram

hellhead2011 #:
в пределах цикла сработает только выход из него

Понял, спасибо! Есть какие то другие пути подняться вверх внутри данного цикла?


Dram

придумал

  • $n- —

  •  
    И continue

hellhead2011

ну так цикл подразумевает уже поднятие и опускание, пока есть условие для этого 🙂 просто поставьте условие, когда баг словлен, то вашей переменной N задайте нужное значение :

 if (preg_match('~^<em(.*)~m', $statusORG, $statusORGMatch)){
                    //словил баг, хочу эту страницу в этом же цикле опять перезагрузить. То что регулярка работает верно, проверил
                 $n = $n-1 ; //например
                }
главное чтобы это не превратилось в постоянный цикл, если спаршиваемая страница будет недоступна или ещё
какой-либо баг отдавать - лучше подстраховаться и сделать количество попыток на парсинг определённой страницы


Skom

Если нужно  скипнуть остальную часть цикла, то просто

continue;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *