강의 컨설팅 트레이닝 무료진단 무료책자 마케팅편지 마케팅정보공유 다이어리 서비스제휴 고객센터

PHP에서 멀티 쓰레드 흉내내기
작성자 : 99 단국강토
등록날짜 : 2009.01.08 10:17
3,371

PHP에서 네트웍 관련 프로그램을 짜다 보면 쓰레드 지원이 되지 않음으로 인해
가끔씩 불편할 때가 있습니다. 이런 경우에 사용하려고 예전에 짜두었던 건데 혹시나
필요하신 분들이 있을거 같아 올려봅니다.

알고리즘은 간단합니다.
먼저 단일처리를 하는 PHP를 작성합니다. 예를 들어 single_process.php 라고 이름합니다.
이 PHP에서는 결과를 단순 text 로 출력합니다. 예를 들어 Success 와 같이... 아니면
serialize 를 이용해서 배열을 출력할수도 있습니다.
다음에 이 단일처리 PHP를 비동기식으로 호출할 쓰레드 PHP를 작성합니다.
즉 쓰레드 PHP 에서 비동기식으로 단일처리 PHP를 여러개 호출하고 결과를 한꺼번에
받는 방식입니다.
엄밀히 말해 멀티 쓰레드를 흉내낸 멀티 프로세스 방식이라고 할수 있습니다. ^^;

무슨 말인지 잘 모르시겠죠.. 저도 써놓구 좀 그렇네요..
소스를 보면서 설명을 드리겠습니다.

# single_process.php 소스코드
<?php
mail("xxx@xxx.com", "멀티쓰레드 흉내내기 $no", "쓰레드 번호 : $no");
echo "Success";
?>

# thread.php 소스코드
<?php
include "class.Thread.php";

$obj_thread = new Thread;
$obj_thread->setURL("http://xxx.com/single_process.php");

for($i=0; $i<20; $i++) {
       $obj_thread->setParam("no", $i);
       $obj_thread->send();
}

$ret = $obj_thread->gather();
//$obj_thread->close();

echo "<pre>";
print_r($ret);
?>

위에서 보면 single_process.php 에 변수값이 달리해서 계속 접속하는 것을 볼수 있습니다.
class.Thread.php 에 보면 비동기식으로 접속하기 때문에 시간지연이 없습니다.
그후에 gather() 이란 메쏘드를 통해 결과값을 받게 됩니다. 이때도 순차적으로 받는게
아니라 먼저오는 놈부터 처리하기 때문에 약간의 시간은 경과되지만 순차적일 때보다는
상당히 빠르게 진행됩니다. 혹시 위 예제대로 했는데 메일이 20가 다 안온다고 저에게
뭐라고 하지 마십쇼 ^^; 제가 위 예제로 테스트하다보니 단박에 메일서버에서 제 아이피가
막혀버리더군요...

아래는 위에서 사용한 class.Thread.php 소스이며 class.Http.php 소스는 링크걸어놓았습니다.

<?php

require_once("class.Http.php");

class Thread extends Http {

       var $handles;

       # constructor
       function Thread($url="") {
              $this->Http($url);
              $this->handles = array();
       }

       /**
        * 데이타 전송함수
        *
        * @param string $mode : POST, GET 중 하나를 입력한다.
        * @return string
        */
       function send($mode="GET") {
              
              // 웹서버에 접속한다.
              $fp = fsockopen($this->host, $this->port, $errno, $errstr, 10);
              if(!$fp) return $this->setError($this->host."로의 접속에 실패했습니다.");

              // GET, POST 방식에 따라 헤더를 다르게 구성한다.
              if(strtoupper($mode) == "POST") $this->query = $this->postMethod();
              else $this->query = $this->getMethod();

              fputs($fp,$this->query);
              socket_set_blocking($fp, FALSE);

              $this->handles[] = $fp;
              
              // 접속을 해제한다.
              //fclose($fp);

              return $fp;
       }

       function gather() {
              $ret = array();
              $max = count($this->handles);
              while(1) {
                     $i = 0;
                     for($i=0; $i<$max; $i++) {
                            $body = '';
                            if(!$fp = $this->handles[$i]) continue;
                            if(!$buffer = fgets($fp, 1024)) continue;
                            while(trim($buffer = fgets($fp,1024)) != "") {}
                            while(!feof($fp)) {
                                   $body .= fgets($fp,1024);
                            }
                            $ret[] = $body;
                            $this->close($fp);
                            $this->handles[$i] = 0;
                     }
                     if(count($ret) == $max) break;
                     usleep(10000);
              }
              return $ret;
       }

       function close($fp="") {
              if($fp) fclose($fp);
              else {
                     foreach($this->handles as $fp) {
                            if($fp) fclose($fp);
                     }
              }
              return true;
       }

}

?> 

[출처]  웹디황용

"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기,
각종 광고, 영업, 판매, 제안서, 전단지
반응율 3배×10배 이상 높이는 마법의 8단계 공식"
자세히보기

Comments

번호 제목 글쓴이 날짜 조회
3285 이것은 AI파일 미리보기입니다. 댓글3 M 최고의하루 01.15 3595
3284 이미지미리보기pds파일미리보기파일입니다^^ 댓글2 99 단국강토 01.14 2834
3283 동영상 캡쳐(Capture) 아주 쉽게 하기~ 99 단국강토 01.14 2623
3282 자판기안의 특수문자 99 단국강토 01.13 2538
3281 ntdll.dll 오류 해결방법 M 최고관리자 01.12 4403
3280 인터넷 동영상 저장하기 - 넷트랜스포터 사용 - M 최고의하루 01.12 3110
3279 옛날 기사를 찾아보고 싶을때 99 단국강토 01.08 2242
3278 CD 음악 mp3로 바꾸기 99 단국강토 01.08 2509
3277 알씨로 초간단 동영상 슬라이드쇼 만들기 99 단국강토 01.07 2857
3276 IP 추적은 어떻게 하는가? 99 단국강토 01.07 2403
3275 일본어로 된 웹을 한글로 즐기기 99 단국강토 01.06 2360
3274 이것은 AI파일 미리보기입니다. 댓글2 M 최고의하루 01.15 4070
3273 이미지미리보기pds파일미리보기파일입니다^^ 99 단국강토 01.14 2458
3272 동영상 캡쳐(Capture) 아주 쉽게 하기~ 99 단국강토 01.14 2792
3271 공유기 차단 무력화 시키는 법 99 단국강토 01.13 3565
3270 자판기안의 특수문자 99 단국강토 01.13 2372
3269 ntdll.dll 오류 해결방법 M 최고의하루 01.12 3677
3268 인터넷 동영상 저장하기 - 넷트랜스포터 사용 - M 최고의하루 01.12 3234
3267 옛날 기사를 찾아보고 싶을때 99 단국강토 01.08 2178
3266 CD 음악 mp3로 바꾸기 99 단국강토 01.08 2495
3265 알씨로 초간단 동영상 슬라이드쇼 만들기 99 단국강토 01.07 3324
3264 IP 추적은 어떻게 하는가? 99 단국강토 01.07 2220
3263 일본어로 된 웹을 한글로 즐기기 99 단국강토 01.06 2318
3262 [컴퓨터 키보드, 특수문자 정식 명칭들] M 최고의하루 12.18 3715
3261 하드,CPU,RAM 지원표 M 최고의하루 12.18 2596
3260 award bios 어워드 바이오스 설정법 M 최고의하루 12.18 3952
3259 내장 그래픽카드 죽이는 법 M 최고의하루 12.04 4906
3258 컴퓨터 조립 M 최고의하루 12.04 2845
3257 USB 버젼 속도 차이 2 천진난만 02.20 2383
3256 제가 사용하고 있는 마케팅프로그램입니다 댓글1 3 천지인 05.23 13202
마케팅
특별 마케팅자료
다운로드 마케팅자료
창업,경영
기획,카피,상품전략
동기부여,성취