我正在使用代理。无论出于何种原因,假设代理失败,我假设这是403,如果返回;我想用另一个代理(从数组)替换代理。我不确定如何实现它。假设在函数顶部有一个代理数组,名为proxies
public static function get_http_response_code($url, &$redirect = null, $proxy = '23.244.68.94:80') {
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $url)) return false;
if (!is_null($proxy)){
$useragent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36";
$ch = curl_init();
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
$header = curl_exec($ch);
curl_close($ch);
}
// Pattern to find the status code
$codepattern = '/[0-9]{3}/';
preg_match($codepattern, $header, $codematch);
// Pattern to find the redirect link
$linkpattern = '/https?:\/\/(.+)\//';
preg_match($linkpattern, $header, $linkmatch);
// Store results in an array
$statuscode = (array_values($codematch)[0]);
// Store the redirect link in the $redirect variable
if ($statuscode == 301 || $statuscode == 302 || $statuscode == 303) {
if (strpos(array_values($linkmatch)[0], 'http') !== false) {
$redirect = array_values($linkmatch)[0];
} else {
}
}
return $statuscode;
}
$statuscode
将返回代码。如果它是403,我想从数组中获取下一个代理并重新启动该函数。我在考虑做$proxy = next($proxies);
,但只是不确定在哪里添加这个
答案 0 :(得分:0)
好的,当我开始回答这个问题时,就会提出一些完全不同的问题。因此,我的答案不再完全有效,但它可能包含有用的信息,所以无论如何我都把它留在这里。
听起来我的问题是一个范围问题。由于$ name是函数的本地名称,因此它会回退到函数外部定义的值,因为函数本地的变量在函数结束时被销毁。
在下面的示例中,$ name成为函数的全局变量,因此在函数内部更改时会将其值保留在函数之外。
function addtekst() {
global $name;
$name = $name . "y";
}
$name = "Adam";
echo $name . " is 22 years old";
addtekst();
addtekst();
echo "<br>" . $name . " is 22 years old";
输出:
Adam年仅22岁左,Adamyy年仅22岁
说到你当前的问题,我建议你选择mopo922提供的解决方案。
答案 1 :(得分:0)
我认为您最好的解决方案可能只是在foreach
循环中使用您的函数:
$proxies = array(/*with stuff in it*/);
$url = 'my url';
$redirect = null;
foreach ($proxies as $proxy) {
$statuscode = get_http_response_code($url, $redirect, $proxy);
// If successful, break out of the foreach loop.
// Otherwise, the loop will continue to the next proxy.
if ($statuscode != 403)
break;
}
答案 2 :(得分:-1)
$name = "Adam";
$break = 0;
function add_y($name, $break) {
echo $name . " is 22 years old";
$name .= "y";
/* we need to check a condition so that function dont run for infinite time so we used $break variable and after calling add_y five time we get out of the function */
$break++;
if ($break == 5) {
exit;
}
add_y($name, $break);
}
add_y($name, $break);
那些投票的人请说明原因,以便下次我可能会小心。 ?