PHP:cURLのコールバック

curl_setopt()の「CURLOPT_HEADERFUNCTION」と「CURLOPT_WRITEFUNCTION」の説明がわかりづらくて、かつどこにも説明してるサイトがなかったので自分でまとめてみました。

CURLOPT_HEADERFUNCTIONは、「ヘッダが読まれたときにコールバックする関数」を指定し、
CURLOPT_WRITEFUNCTIONは、「コンテンツが読み込まれた時に逐次コールバックされる関数」を指定します。
全部読み込んで一気に処理するのではなく、戻ってきた分を逐次処理して返す場合に有効。

<?php
set_time_limit(0);

$c = curl_init() ;
curl_setopt( $c , CURLOPT_URL , $url ) ;
curl_setopt( $c , CURLOPT_USERAGENT , $useragent ) ;
curl_setopt( $c , CURLOPT_COOKIE , $cookies );

// curl_setopt( $c , CURLOPT_RETURNTRANSFER , TRUE ) ; // 不要

curl_setopt( $c , CURLOPT_HTTPHEADER , $headers ) ;
curl_setopt( $c , CURLOPT_HEADERFUNCTION , hdcallback ) ;
curl_setopt( $c , CURLOPT_WRITEFUNCTION , wrcallback ) ;

$r = curl_exec( $c ) ;
curl_close( $c );

////////////////////////////// callback function

function hdcallback( $res , $response )
{
    $h1 = explode( "\r\n" , $response ) ;

    foreach( $h1 as $hout )
    {
        if ( $hout == "Transfer-Encoding: chunked" ) continue ;
        header( $hout ) ;
    }
    return strlen( $response ) ;
}

function wrcallback( $res , $response )
{
        echo $response ;
        ob_flush() ;
        return strlen( $response ) ;
}

まず、PHPじゃこういう使い方しませんものね。(偏見)

《追記》CURLOPT_RETURNTRANSFERを指定すると変なことになっちゃいましたので外しました。

Comments are closed.