fix20152
@fix20152
javascript developer

Почему не работает рекурсия в php?

Всем привет.
Ребята, помогите, вроде бы легкая задача, но решить сам не могу.
Есть код, который вытягивает страницы через url
function getData($url,$post=''){
	$dir = dirname(__FILE__).'/cookie.txt';
	$ch=curl_init();   
	$proxy = lastIp();
	curl_setopt($ch, CURLOPT_URL, $url); 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_TIMEOUT, 35);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 35); 
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  //Переходим по редиректам
	curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 );	
	curl_setopt($ch, CURLOPT_PROXY, $proxy);
	//curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
	curl_setopt($ch, CURLOPT_FAILONERROR, true);
	//curl_setopt($ch, CURLOPT_POST, true);
	//curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
	curl_setopt($ch, CURLOPT_REFERER, "https://www.google.ru/");
	curl_setopt($ch, CURLOPT_COOKIEJAR, $dir);  // Записываем cookies в файл, чтобы потом можно было их считать
	curl_setopt($ch, CURLOPT_COOKIEFILE, $dir); // Теперь читаем cookies с файла;
	curl_setopt($ch, CURLOPT_USERAGENT, get_random_user_agent()); 
	$res=curl_exec($ch);		
	curl_close($ch);

	if(strlen($res)>0){
		updateIp($proxy,'success');
		return $res;
	}else{
		updateIp($proxy,'error');
		logs('Bad proxy '.$proxy.' on url '.$url);
		unset($res);
		sleep(1);
		getData($url);
		logs('recursia not work');
		return false;
	}
	
}

Я ее вызываю getData($url,$post='') ее и по идее она должна повторяться до тех пор, пока не в рез что-то будет. Но почему-то она не перегружается, когда я в коде пишу getData($link), она продолжает работать и возвращает мне пустое значение.
У кого какие идеи?
  • Вопрос задан
  • 2940 просмотров
Пригласить эксперта
Ответы на вопрос 2
Потому что в ветке условия else рекурсивный вызов функции никуда не возвращается.
Ответ написан
Комментировать
MaximAL
@MaximAL
Одно из необходимых требований рекурсии — обязательная возможность нерекурсивного выхода.
Это значит, что возврат из функции по какой-то проверке где-то должен идти до рекурсивного вызова.
В вашем коде такого случая нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы