본문 바로가기

카테고리 없음

php 비동기 요청

상황

1. n개의 서버에서 자료를 읽어 DB에 저장해야 한다.

2. 각 서버에 요청하고 자료를 받는데 걸리는 시간이 다양하다.

3. 이 과정을 수십~수백회 반복해야 한다.

4. 작업은 php로 해야 한다.




execute.php::서버에서 자료를 읽어오는 요청


$url = 'http://[URL]/request.php';

$current_date = new DateTime();

$max_num = 100;

for ( $i=0; $i<$max_num; $i++ ) {

    $current_date->add( new DateInterval("P{$i}D") );


    $params = array();   

    $params['START_DATE'] = $current_date->format('Y-m-d');

    $params['END_DATE'] = $params['START_DATE'];

    

    curl_request_async_curl( $url, $params );

}



function curl_request_async_curl( $url, $params )

{

  $post_params = array();

  foreach ( $params as $key => &$val ) {

    if ( is_array($val) ) {

      $val = implode(',', $val);

    }

    $post_params[] = $key . '=' . urlencode($val);

  }

  $post_string = implode('&', $post_params);

  

  $ch = curl_init();

  curl_setopt($ch, CURLOPT_URL, $url);

  curl_setopt($ch, CURLOPT_HEADER, 0);

  curl_setopt($ch, CURLOPT_POST, 1);

  curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);

  curl_setopt($ch, CURLOPT_TIMEOUT, 30);

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);

  curl_exec($ch);

  curl_close($ch);

}





request.php::각 서버에서 자료을 읽어 DB에 저장.


if ( $_SERVER['REMOTE_ADDR'] != $_SERVER['SERVER_ADDR'] ) {

  exit;  // execute.php과 동일 서버에서 접근 허용.

}



// http://www.php.net/manual/en/features.connection-handling.php#93441

ob_end_clean();

ignore_user_abort(true); // optional

header("Connection: close\r\n");

header("Content-Encoding: none\r\n");

header("Content-Length: 0");

ob_end_flush();

flush();

ob_end_clean();



// 각 서버에서 자료를 읽어 DB에 저장

......