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

D
На сайте с 28.06.2008
Offline
1104
128

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

Думал сперва что быстро паршу - поставил задержу, проблему не решило. Если найти ту страницу где была проблема и прогнать ее парсером 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;  //почему он не срабатывает и не перебрасывает в начало цикла?
                }


S3
На сайте с 29.03.2012
Offline
319
#1
Если вы учитесь, то за такое бьют линейкой по рукам, если вам действительно нужно парсить, освойте нормальные инструменты типа селениума или BS
D
На сайте с 28.06.2008
Offline
1104
#2
Sly32 #:
Если вы учитесь, то за такое бьют линейкой по рукам, если вам действительно нужно парсить, освойте нормальные инструменты типа селениума или BS

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

H2
На сайте с 18.04.2011
Offline
72
#3

ну так оператор так в цикле и не будет работать - вот почитайте тут об этом  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 Оператор используется для перехода в другую часть программы. Место, куда необходимо перейти указывается с помощью метки, за которой ставится двоеточие, после оператора указывается желаемая метка для перехода. Оператор не является неограниченным "". Целевая метка должна находиться в том же...
D
На сайте с 28.06.2008
Offline
1104
#4
hellhead2011 #:

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

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

H2
На сайте с 18.04.2011
Offline
72
#5
Dram #:

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

в пределах цикла сработает только выход из него
D
На сайте с 28.06.2008
Offline
1104
#6
hellhead2011 #:
в пределах цикла сработает только выход из него

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

D
На сайте с 28.06.2008
Offline
1104
#7

придумал

  • $n- -
  •  
    И continue
H2
На сайте с 18.04.2011
Offline
72
#8

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

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

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

continue;
Cras amet qui numquam amavit quique amavit cras amet

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий