2

この質問は私を何度か混乱させました.phpループでcurlを使用する適切な方法はどれですか

$ch = curl_init();
for($i=0; $i<10; $i++){
  // curl options skiped ..
  curl_setopt($ch,CURLOPT_URL,"https://secure.imvu.com/login/login/");
  $response = curl_exec($ch);
   // print $response;
}
curl_close($ch);

また

for($i=0; $i<10; $i++){
  $ch = curl_init();
  // curl options skiped ..
  curl_setopt($ch,CURLOPT_URL,"https://secure.imvu.com/login/login/");
  $response = curl_exec($ch);
    // print $response;
  curl_close($ch);
}

なぜ ?

私が考えていることから、最初のものはラグを取り除き、2番目のものよりも低いプロセスを使用します.2番目のものは
多くのプロセスを生成する各ループでcurlハンドラを開閉する必要があるためですが
、たとえば、問題が発生する場合があります。cURL cookie ファイルはcurl_close();呼び出し後にのみ保存されるため、ループで閉じられていない限り削除できません。

どちらがより適切で、その理由、それぞれの長所と短所を知る必要があります。

4

1 に答える 1

3

パフォーマンスの観点からは問題ありません。スクリプトの残りの部分で必要な機能を補完する方法を選択してください。curl_init() を実行するのに必要な時間は、HTTP 要求を行うのにかかる時間に比べればほんのわずかです。

これらの小さなスクリプトの両方をテストしました。最初の実行時間は 3,293.014 ミリ秒で、2 番目の実行時間は 3,176.957 ミリ秒でした。2 番目のスクリプトは最初のスクリプトよりも多くの命令を繰り返すため、これは少し直感に反するように見えます。しかし、これら 2 つの時間差を見ると、1 リクエストあたり約 6 ミリ秒であり、20 の HTTP リクエストを作成するプロセス全体に 6 秒かかる場合、おそらく「丸め誤差」の範囲内になります。

自分でテストしたい場合は、以下のコードを利用できます。

<?php // RAY_class_Stopwatch.php
error_reporting(E_ALL);


// DEMONSTRATE A SCRIPT TIMER FOR ALL OR PART OF A SCRIPT PHP 5+
// MAN PAGE http://php.net/manual/en/function.microtime.php


class StopWatch
{
    protected $a; // START TIME
    protected $s; // STATUS - IF RUNNING
    protected $z; // STOP TIME

    public function __construct()
    {
        $this->a = array();
        $this->s = array();
        $this->z = array();
    }

    public function __destruct()
    {
        $ret = $this->readout();
        if (!$ret) return FALSE;
        echo
          __CLASS__
        . '::'
        . __FUNCTION__
        . '() '
        ;
        echo "<b>$ret</b>";
        echo PHP_EOL;
    }

    // A METHOD TO REMOVE A TIMER
    public function reset($name='TIMER')
    {
        // RESET ALL TIMERS
        if ($name == 'TIMER')
        {
            $this->__construct();
        }
        else
        {
            unset($this->a[$name]);
            unset($this->s[$name]);
            unset($this->z[$name]);
        }
    }

    // A METHOD TO CAPTURE THE START TIME
    public function start($name='TIMER')
    {
        $this->a[$name] = microtime(TRUE);
        $this->z[$name] = $this->a[$name];
        $this->s[$name] = 'RUNNING';
    }

    // A METHOD TO CAPTURE THE END TIME
    public function stop($name='TIMER')
    {
        $ret = NULL;

        // STOP ALL THE TIMERS
        if ($name == 'TIMER')
        {
            foreach ($this->a as $name => $start_time)
            {
                // IF THIS TIMER IS STILL RUNNING, STOP IT
                if ($this->s[$name])
                {
                    $this->s[$name] = FALSE;
                    $this->z[$name] = microtime(TRUE);
                }
            }
        }

        // STOP ONLY ONE OF THE TIMERS
        else
        {
            if ($this->s[$name])
            {
                $this->s[$name] = FALSE;
                $this->z[$name] = microtime(TRUE);
            }
            else
            {
                $ret .= "ERROR: CALL TO STOP() METHOD FOR '$name' IS NOT RUNNING";
            }
        }

        // RETURN AN ERROR MESSAGE, IF ANY
        return $ret;
    }

    // A METHOD TO READ OUT THE TIMER(S)
    public function readout($name='TIMER', $dec=3, $m=1000, $eol=PHP_EOL)
    {
        $str = NULL;

        // GET READOUTS FOR ALL THE TIMERS
        if ($name == 'TIMER')
        {
            foreach ($this->a as $name => $start_time)
            {
                $str .= $name;

                // IF THIS TIMER IS STILL RUNNING UPDATE THE END TIME
                if ($this->s[$name])
                {
                    $this->z[$name] = microtime(TRUE);
                    $str .= " RUNNING ";
                }
                else
                {
                    $str .= " STOPPED ";
                }

                // RETURN A DISPLAY STRING
                $lapse_time = $this->z[$name] - $start_time;
                $lapse_msec = $lapse_time * $m;
                $lapse_echo = number_format($lapse_msec, $dec);
                $str .= " $lapse_echo";
                $str .= $eol;
            }
            return $str;
        }

        // GET A READOUT FOR ONLY ONE TIMER
        else
        {
            $str .= $name;

            // IF THIS TIME IS STILL RUNNING, UPDATE THE END TIME
            if ($this->s[$name])
            {
                $this->z[$name] = microtime(TRUE);
                $str .= " RUNNING ";
            }
            else
            {
                $str .= " STOPPED ";
            }


            // RETURN A DISPLAY STRING
            $lapse_time = $this->z[$name] - $this->a[$name];
            $lapse_msec = $lapse_time * $m;
            $lapse_echo = number_format($lapse_msec, $dec);
            $str .= " $lapse_echo";
            $str .= $eol;
            return $str;
        }
    }
}



// DEMONSTRATE THE USE -- INSTANTIATE THE STOPWATCH OBJECT
$sw  = new Stopwatch;

// TIME OSA'S SCRIPTS
ob_start();
$sw->start('ENTIRE');
$sw->start('FIRST');
$ch = curl_init();
for($i=0; $i<10; $i++){
  // curl options skiped ..
  curl_setopt($ch,CURLOPT_URL,"https://secure.imvu.com/login/login/");
  $response = curl_exec($ch);
   // print $response;
}
curl_close($ch);
$sw->stop('FIRST');

$sw->start('SECOND');
for($i=0; $i<10; $i++){
  $ch = curl_init();
  // curl options skiped ..
  curl_setopt($ch,CURLOPT_URL,"https://secure.imvu.com/login/login/");
  $response = curl_exec($ch);
    // print $response;
  curl_close($ch);
}
$sw->stop('SECOND');
$sw->stop('ENTIRE');
ob_end_clean();
$sw->readout();

よろしくお願いします、〜レイ

于 2012-12-30T16:26:43.847 に答える