php多个卷曲网址与while循环

时间:2016-04-04 15:13:32

标签: php url curl while-loop do-while

我正在开发一个小脚本,我有点乱搞使用几个curl和while循环。

我希望在其中一个网址向我提供信息时停止处理卷曲。注意:我有多个curl请求。

所以我的概念是,

我有几个URL,我必须处理并从中获取信息。如果在特定URL上找到信息,它将给我一个字符串。如果没有找到任何信息,它将没有给我任何价值。所以我有近10个网址要处理。在所有情况下,URL中的任何一个都将向我提供信息,因此剩余的URL将不会产生任何价值。由于处理了很多URL,因此延迟是一个问题。因此,假设在下面的示例代码中,如果url以value2.php结尾给出了结果,那么我立即想要停止处理其他URL。因为我已经得到了结果,没有必要运行其他卷曲。最后我必须打印结果。

此外,我有一个条件,其中没有任何网址产生任何结果,如果有人告诉我如何处理它,那将会很棒。

我的示例代码。

<?php
///functions here
do {

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value1.php?process=$param");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$combined = curl_exec ($ch);
curl_close ($ch);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value2.php?process=$param");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$combined = curl_exec ($ch);
curl_close ($ch);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value3.php?process=$param");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$combined = curl_exec ($ch);
curl_close ($ch);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value4.php?process=$param");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$combined = curl_exec ($ch);
curl_close ($ch);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value5.php?process=$param");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$combined = curl_exec ($ch);
curl_close ($ch);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value6.php?process=$param");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$combined = curl_exec ($ch);
curl_close ($ch);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value7.php?process=$param");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$combined = curl_exec ($ch);
curl_close ($ch);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value8.php?process=$param");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$combined = curl_exec ($ch);
curl_close ($ch);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value9.php?process=$param");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$combined = curl_exec ($ch);
curl_close ($ch);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"example[dot]com/value10.php?process=$param");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$combined = curl_exec ($ch);
curl_close ($ch);

} while (strlen($combined) != 0);
echo $combied;

///functions here

?>

4 个答案:

答案 0 :(得分:3)

就像你在问题中得到它以及其他答案如何得到它一样,问题在于你必须发送每个请求,等待响应,处理数据并且只有然后做你提出后续要求。这样可以正常工作,但它的时间效率很低。比方说,例如,每个请求需要100毫秒(这可能不是不切实际的)。对于10个请求,您需要查看1秒的加载时间。相反,我建议您在找到结果并发送所有请求后忘记尝试停止发出请求... 同时。这可以通过PHP的curl_multi_*函数来完成。

// Put all of your URLs in here. I'm just using google for
// all as an example:
$urls[] = 'http://www.google.com';
$urls[] = 'http://www.google.com';
$urls[] = 'http://www.google.com';
$urls[] = 'http://www.google.com';
$urls[] = 'http://www.google.com';
$urls[] = 'http://www.google.com';

// Get cURL handles
foreach ($urls as $key => $url) {
    $chs[$key] = curl_init();

    // Set all your options for each connection here
    curl_setopt($chs[$key], CURLOPT_URL, $url);
    curl_setopt($chs[$key], CURLOPT_HEADER, 0);
}

//create the multiple cURL handle
$mh = curl_multi_init();

//add the handles
foreach ($chs as &$ch) {
    curl_multi_add_handle($mh,$ch);
}

$active = null;
//execute the handles
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

foreach ($chs as $url=>&$ch) {
    $html = curl_multi_getcontent($ch);

    // [do what you want with the HTML]

    curl_multi_remove_handle($mh, $ch); // remove the handle (assuming  you are done with it);
}

curl_multi_close($mh);

答案 1 :(得分:1)

尝试以下方法:

<?php

function callCURL($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $combined = curl_exec ($ch);
    curl_close ($ch);
    return $combined;
}


function getResult($urls) {
    $return = array();

    foreach ($urls as $url) {
        $response = callCURL($url);
        if (strlen($response) !== 0) {
            $return[] = $response;
            break;
        }
    }
    return $return;
}

$urls = array("example.com/value1.php?process=$param", "example.com/value2.php?process=$param", "example.com/value3.php?process=$param")

$result = getResult($urls);

答案 2 :(得分:0)

你可以使用这样的东西。我没有检查代码,调试后应该可以正常工作。

function callcurl($url) 
{
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL,"example[dot]com/value5.php?process=$param");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $ret = curl_exec ($ch);
  curl_close ($ch);
}

$urls = array('url1', 'url2'); /// etc
$combined = ''
$cnt = 0;
do {
  $combined = callcurl($urls[$cnt++]);
} while (strlen($combined) != 0 && $cnt < count($urls)); //

print $combined;

答案 3 :(得分:0)

您可以使用for循环来实现此目的。

$fileNames = array(
   '0' => 'valueabc',
   '1' => 'valuedef',
   [...] => [...]
);
$combined = array();
for ($i = 1; $i < 10; $i++)
{
    $ch = curl_init();
    $url = "example[dot]com/" . $fileNames[$i] . ".php?process=" . $param;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $combined[$i] = curl_exec ($ch);
    curl_close ($ch);
}

要查看所有回复,您可以foreach $combined

foreach ($combined as $value=>$response)
{
    // TODO: Work with the response
    echo "[" . $value . "]" . $response;
}