1

我又来了,对PHP的了解越来越多,但是对于我的场景还是有一些问题,我的大部分场景已经编程解决了没有问题,但是我发现了一个问题,但是要理解它,我需要解释一下第一的:

我有一个可以由任何客户端调用的 PHP 脚本,它的工作是接收请求,从我手动定义的列表中 ping 到代理,以了解代理是否可用,如果可用,我继续检索使用带有 POST 方法的“curl”的响应。逻辑是这样的:

$proxyList = array('192.168.3.41:8013'=> 0, '192.168.3.41:8023'=>0, '192.168.3.41:8033'=>0);
$errorCounter = 0;

foreach ($proxyList as $key => $value){
 if(!isUrlAvailable($key){ //It means it is NOT available so I count errors
    $errorCounter++;
 } else { //It means it is AVAILABLE
    $result = callThisProxy($key);
 }
}

该函数"isUrlAvailable"使用 $fsockopen 来了解代理是否可用。如果没有,我像前面提到的那样做一个,这个函数有POST这样的东西:CURLcallThisProxy()

 $ch = curl_init($proxyUrl);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,'xmlQuery='.$rawXml);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $info = curl_exec ($ch);
    if($isDebug){echo 'Info in the moment: '.$info.'<br/>';}
    curl_close ($ch);

但是,我们正在测试一些场景,如果我在验证代理可用性和调用之间关闭代理会发生什么?我是说:

foreach ($proxyList as $key => $value){
 if(!isUrlAvailable($key){ //It means it is NOT available so I count errors
    $errorCounter++;
 } else { //It means it is AVAILABLE
    $result = callThisProxy($key);//What happen if I kill the proxy when the result is being processed?
 }
}

我对其进行了测试,当我这样做时, $result 以空字符串的形式出现''。但问题是我丢失了那个请求,我的目标是用下$key一个代理重试它。"do, while"所以,当我调用结果时,我一直在考虑。但不确定,如果可以或者有更好的方法可以做到这一点,所以请我就这个问题寻求帮助。提前感谢您的时间,欢迎任何答案。谢谢。

4

2 回答 2

1

也许是这样的:

$result = "";

while ($result == "")
{
    foreach ($proxyList as $key => $value)
    {
        if (!isUrlAvailable($key))
        {
            $errorCounter++;
        }
        else
        {
            $result = callThisProxy($key);
        }
    }
}

// Now check $result, which should contain the first successful callThisProxy()
//   result, or nothing if none of the keys worked.
于 2013-06-20T21:42:42.057 回答
1

您可以只保留您仍需要尝试的代理列表。当您遇到错误或获得有效响应时,您将从代理列表中删除代理以尝试。如果您没有得到良好的响应,请将其保留在列表中,稍后再试。

$proxiesToTry = $proxyList;
$i = 0;

while (count($proxiesToTry) != 0) {
    // reset to beginning of array
    if($i >= count($proxiesToTry)) 
        $i = 0;

    $proxy = $proxiesToTry[$i];

    if (!isUrlAvailable($proxy)) { //It means it is NOT available so I count errors
        $errorCounter++;
        unset($proxiesToTry[$i]);
    } else { //It means it is AVAILABLE
        $result = callThisProxy($proxy); 
        if($result != "") // If we got a response remove it from the array of proxies to try.
            unset($proxiesToTry[$i]);
    }

    $i++;
}

注意:如果您没有从某个代理获得有效响应,您将永远不会跳出这个循环。

于 2013-06-21T14:51:10.140 回答