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 を使用して、プロキシが使用可能かどうかを確認します。そうでない場合は、前述のようにPOSTwithを作成します。関数には次のようなものがあります。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 に答える