LoginSignup
4
7

More than 5 years have passed since last update.

【自分の中で】自作CURL利用クラス(PHP)【大絶賛】

Last updated at Posted at 2017-01-23

コード例はFuelPHP用ですが、
コピって、namespace消すだけで、
別にどこでも利用可能かと。

staticにしてもいいと思う。

使い方

「CURLOPT_RETURNTRANSFER」だけはデフォで設定してあるので、
オプションで指定しなくても、クロール先を出力してくれます。

$curl = new My_Curl();

$array_options = array(
    CURLOPT_FAILONERROR => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_TIMEOUT => 10,
);


$output= $curl->get_single($url, $array_options);

クラスのコード

コード
<?php
namespace Lib;

Class My_Curl {
    /**
     * シングルプロセスCURL
     *
     * @param string $str_url
     *          <br />処理対象URL
     * @param array $array_options
     *          <br />CURLにセットするオプションと値のセット
     *          <br />
     *          <br />例) array(CURLOPT_RETURNTRANSFER => 1)
     * @return $str_result
     */
    public function get_single($str_url, $array_options) {
        $ch = curl_init($str_url);

        $this->set_options($ch, $array_options);

        $str_result = curl_exec($ch);

        curl_close($ch);

        return $str_result;
    }

    /**
     * 並列処理CURL
     * 
     * @param array $array_urls
     *          <br />処理対象URLリスト
     * @param array $array_options
     *          <br />CURLにセットするオプションと値のセット
     *          <br />
     *          <br />例) array(CURLOPT_RETURNTRANSFER => 1)
     * @return $array_res
     *          <br />結果。$array_urlsと同じキーで格納。
     */
    public function get_multi($array_urls, $array_options) {
        $mh = curl_multi_init();    //並列用ハンドル作成

        $ch = array();
        foreach($array_urls as $key => $str_url) {
            //ハンドル作成
            $ch[$key] = curl_init($str_url);

            //CURLオプション設定
            $this->set_options($ch[$key], $array_options);

            //並列用ハンドルに、各ハンドルをセット
            curl_multi_add_handle($mh, $ch[$key]);
        }

        //並列処理開始
        $still_running = null;
        do {
            $mrc = curl_multi_exec($mh, $still_running);
        } while($still_running);

        //レスポンス待ち
        while($still_running && $mrc == CURLM_OK) {
            if(curl_multi_select($mh, 10) != -1) {
                //状態更新
                do {
                    $mrc = curl_multi_exec($mh, $still_running);
                } while($still_running);
            } else {}
        }

        $array_res = array();   //返却値を配列で格納
        foreach($array_urls as $key => $str_url) {
            //エラーが存在しない場合(正常時)
            if(curl_errno($ch[$key]) == '') {
                //結果取得
                $array_res[$key] = curl_multi_getcontent($ch[$key]);
            }
            //エラー
            else {
                $array_res[$key] = null;
            }

            //ハンドル後処理
            curl_multi_remove_handle($mh, $ch[$key]);
            curl_close($ch[$key]);
        }

        //並列用ハンドル削除
        curl_multi_close($mh);

        return $array_res;
    }

    /**
     * CURLオプションの設定
     * 
     * @param resource $ch
     *          <br />curlハンドル
     * @param array $array_options
     *          <br />CURLにセットするオプションと値のセット
     *          <br />
     *          <br />例) array(CURLOPT_RETURNTRANSFER => 1)
     */
    private function set_options($ch, $array_options) {
        //固定CURLオプション設定
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        //動的CURLオプション設定
        foreach($array_options as $int_option => $multi_val) {
            curl_setopt($ch, $int_option, $multi_val);
        }

        return $ch;
    }
}
4
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7