0

なぜこれが機能しないのか正確にはわかりません.答えがあるかどうかをグーグルで調べてみましたが、多くの人が通常の for ループの代わりに foreachloop を思いつきました。

<?php
$list = array("GOOG", "AAP", "MSFT");

    for($i=0; $i<3; $i++)
    {
        echo "why isn't this working <br>";

        $fp = fopen ("http://finance.yahoo.com/d/quotes.csv?s=GOOG&f=sl1ve1x&e=.csv","r");
        $data = fgetcsv ($fp, 1000, ",");
        $exit = str_replace('"',"",$data[3]);
        $exchange = str_replace('"',"",$data[4]);

        echo "$data[0] <br>";
        echo "$data[1] <br>";
        echo "$data[2] <br>";

    }
?>

Google情報を3回出力すると予想していましたが、fopenを単独で取り出した場合はそうではありませんが、複数回実行すると、期待したことは何もしません

出力例

why isn't this work
Goog
8398
789
why isn't this work
Goog
8398
789
why isn't this work
Goog
8398
789
4

2 に答える 2

2

なぜforeachを使わないのですか?

<?php
$lists = array("GOOG", "AAP", "MSFT");

foreach($lists as $list)
{
    echo "<h3>Values for ".$list."</h3>";

    $fp = fopen ("http://finance.yahoo.com/d/quotes.csv?s=".$list."&f=sl1ve1x&e=.csv","r");
    $data = fgetcsv ($fp, 1000, ",");
    fclose($fp);

    echo $data[0]."<br/>",
         $data[1]."<br/>",
         $data[2]."<br/>";
}
/* Result
Values for GOOG
GOOG
681.72
1582936
Values for AAP
AAP
80.44
1306227
Values for MSFT
MSFT
29.86
43408272
*/
?>

編集:

また、fopen でループすると、curl_multi を使用する場合よりも約 4.6 倍遅くなることに興味があるかもしれません。curl multi を使用すると、すべての要求が同時に行われます。結果は次のとおりです。

シンプルカール多機能:

<?php
function curl_multi_get($data) {
    $curly = array();
    $result = array();

    $mh = curl_multi_init();
    foreach ($data as $id=>$d) {
        $curly[$id] = curl_init();
        curl_setopt($curly[$id], CURLOPT_URL,            'http://finance.yahoo.com/d/quotes.csv?s='.$d.'&f=sl1ve1x&e=.csv');
        curl_setopt($curly[$id], CURLOPT_HEADER,         0);
        curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curly[$id], CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($curly[$id], CURLOPT_TIMEOUT,        30);
        curl_setopt($curly[$id], CURLOPT_AUTOREFERER,    true);
        curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, true);

        curl_multi_add_handle($mh, $curly[$id]);
    }
    $running = null;
    do {
        curl_multi_exec($mh, $running);
    } while($running > 0);
    foreach($curly as $id => $c) {
        $result[$id] = curl_multi_getcontent($c);
        curl_multi_remove_handle($mh, $c);
    }
    curl_multi_close($mh);
    return $result;
}
?>

0.50315880775452秒で Curl マルチを実行しました

<?php
//Benchmark test 1 curl_multi
$time_start = microtime(true);
//---------------------------------------

$lists  = array("GOOG", "AAP", "MSFT");
$result = curl_multi_get($lists);

foreach($result as $data)
{
    $data = explode(',',$data);

    echo "<h3>Values for ".$data[0]."</h3>";

    echo $data[0]."<br/>",
         $data[1]."<br/>",
         $data[2]."<br/>";
}

//--------------------------------------
$time_end = microtime(true);
$time = $time_end - $time_start;

echo "Did Curl multi in $time seconds\n";
//end first test
//Did Curl multi in 0.50315880775452 seconds
?> 

2.3253791332245秒で fopen() を実行しました

<?php
//Benchmark test 2 fopen()
$time_start = microtime(true);
//--------------------------------------

$lists = array("GOOG", "AAP", "MSFT");
foreach($lists as $list)
{
    echo "<h3>Values for ".$list."</h3>";

    $fp = fopen ("http://finance.yahoo.com/d/quotes.csv?s=".$list."&f=sl1ve1x&e=.csv","r");
    $data = fgetcsv ($fp, 1000, ",");
    fclose($fp);

    echo $data[0]."<br/>",
         $data[1]."<br/>",
         $data[2]."<br/>";
}

//--------------------------------------
$time_end = microtime(true);
$time = $time_end - $time_start;

echo "Did fopen() in $time seconds\n";
//end second test
//Did fopen() in 2.3253791332245 seconds 
?>

それが役に立てば幸い

于 2012-11-07T06:44:03.930 に答える