0

トークンを使用してFacebookのステータスを高く評価するために、次のスクリプトを作成します。問題は、5つのトークンの実行に時間がかかりすぎることです。10秒以上かかります。

foreach ($tokens as $token) 

{           
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://graph.facebook.com/post_id/like');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.001 (windows; U; NT4.0;    en-US; rv:1.0) Gecko/25250101');
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('access_token' => $token));
    curl_exec($ch);
    curl_close($ch);
}
4

3 に答える 3

1

その関数をcurlmultiリクエストに使用します。入力は、URLを含む配列であり、出力は、結果を含む配列です。

私にとってはとても役に立ちました。

あなたの問題のために、あなたはトークンのための新しい入力を入れて、curlリクエストに1つのパラメータを追加する必要があります。

function multiRequest($data, $options = array()) {

      // array of curl handles
      $curly = array();
      // data to be returned
      $result = array();

      // multi handle
      $mh = curl_multi_init();


      // loop through $data and create curl handles
      // then add them to the multi-handle
      foreach ($data as $id => $d) {

        $curly[$id] = curl_init();

        $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
        curl_setopt($curly[$id], CURLOPT_URL,            $url);
        curl_setopt($curly[$id], CURLOPT_HEADER,         0);
        curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);

        //Set proxy type

        // post? 
        if (is_array($d)) {
          if (!empty($d['post'])) {
            curl_setopt($curly[$id], CURLOPT_POST,       1);
            curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
          }
        }

        // extra options?
        if (!empty($options)) {
          curl_setopt_array($curly[$id], $options);
        }

        curl_multi_add_handle($mh, $curly[$id]);
      }

      // execute the handles
      $running = null;
      do {
        curl_multi_exec($mh, $running);
      } while($running > 0);

      // get content and remove handles
      foreach($curly as $id => $c) {
        $result[$id] = curl_multi_getcontent($c);
        curl_multi_remove_handle($mh, $c);
      }

      // all done
      curl_multi_close($mh);

      return $result;
    }
于 2013-01-27T00:32:20.913 に答える
1

すべての反復でhttp接続を開いたり閉じたりします:)

curl_multi_init()を使用します。

$chm = curl_multi_init();// <---

foreach ($tasks as $task) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://graph.facebook.com/post_id/like');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.001 (windows; U; NT4.0;    en-US; rv:1.0) Gecko/25250101');
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('access_token' => $token));
    curl_multi_add_handle($cmh, $ch);// <---
}

php.netで見ることができるcurl_multi_init()に関する詳細情報

于 2013-01-27T00:06:09.673 に答える
0

新しいカールセッションを開くたびに、同じデータを設定してリクエストを送信します。おそらく、ループの外側で変更されないデータを宣言することで、以下は少し速くなります。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://graph.facebook.com/post_id/like');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.001 (windows; U; NT4.0;    en-US; rv:1.0) Gecko/25250101');

foreach ($tokens as $token) {           
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('access_token' => $token));
    curl_exec($ch);
}

curl_close($ch);
于 2013-01-27T00:04:29.800 に答える