>  기사  >  백엔드 개발  >  PHP 다중 스레드 클래스 및 사용 example_php 기술

PHP 다중 스레드 클래스 및 사용 example_php 기술

WBOY
WBOY원래의
2016-05-16 20:29:211066검색

이 기사의 예에서는 PHP 멀티스레딩 클래스와 그 사용법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

일반적으로 PHP 멀티스레딩 기능은 웹 서버를 통해 구현할 수 있습니다. 물론, 멀티스레딩에 대한 깊은 이해가 있는 사람이라면 웹 서버를 통한 멀티스레딩이 멀티스레딩의 일부 효과만 흉내낼 수 있다는 것을 알고 있을 것입니다. 멀티스레딩은 진정한 의미가 아닙니다.

하지만 어쨌든 우리의 요구 사항 중 일부를 충족할 수 있습니다. 멀티스레딩과 유사한 기능이 필요한 경우에도 이 클래스를 사용할 수 있습니다.

코드 복사 코드는 다음과 같습니다.
/**
* @title: PHP多线程类(스레드)
* @version: 1.0
*
* PHP의 다양한 용도:
* require_once 'thread.class.php';
* $thread = 새 스레드();
* $thread->addthread('action_log','a');
* $thread->addthread('action_log','b');
* $thread->addthread('action_log','c');
* $thread->runthread();
*
* 함수 action_log($info) {
* $log = '로그/' . 마이크로타임() . '.통나무';
* $txt = $정보 . "rnrn" . '설정' . 날짜('h:i:s', time()) . (이중)마이크로타임() . "rn";
* $fp = fopen($log, 'w');
* fwrite($fp, $txt);
* fclose($fp);
* }
*/
클래스 스레드 {
var $hooks = 배열()
var $args = 배열()
함수 스레드() {
}
함수 addthread($func)
{
$args = array_slice(func_get_args(), 1)
$this->hooks[] = $func
$this->args[] = $args

사실을 반환합니다. }
함수 runthread()
{
if(isset($_GET['flag']))
{
$flag = intval($_GET['flag'])
}
if($flag || $flag === 0)
{
call_user_func_array($this->hooks[$flag], $this->args[$flag])
}
그렇지 않으면
{
for($i = 0, $size = count($this->hooks); $i < $size; $i )
{
$fp=fsockopen($_SERVER['HTTP_HOST'],$_SERVER['SERVER_PORT'])
if($fp)
{
$out = "{$_SERVER['PHP_SELF']}?flag=$i HTTP/1.1rn 가져오기
$out .= "호스트: {$_SERVER['HTTP_HOST']}rn"; $out .= "연결: 닫기"
fputs($fp,$out)
fclose($fp)
}
}
}
}
}
사용방법, 코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
$thread = new thread()
$thread->addthread('func1','info1')
$thread->addthread('func2','info2')
$thread->addthread('func3','info3')
$thread->runthread();
설명:
addthread()는 스레드 함수를 추가하는 것입니다. 첫 번째 매개변수는 함수 이름이고 후속 매개변수(선택사항)는 지정된 함수에 전달되는 매개변수입니다.

runthread()는 스레드를 실행하는 함수입니다.

PHP 예: 컬을 사용하여 멀티스레드 이미지 다운로드 구현

은 실제로 컬을 사용하여 PHP로 구현된 멀티스레드 클래스입니다. 이 클래스를 사용하면 코드는 다음과 같습니다.


코드 복사 코드는 다음과 같습니다.
클래스 컬_멀티{
비공개 $url_list=array()
비공개 $curl_setopt=배열(
          'CURLOPT_RETURNTRANSFER' => 1,//결과는 변수
에 반환됩니다. 'CURLOPT_HEADER' => 0,//HTTP 헤더를 반환해야 하는지 여부
'CURLOPT_NOBODY' => 0,//반환된 콘텐츠가 필수인지 여부
'CURLOPT_FOLLOWLOCATION' => 0,//자동 추적
'CURLOPT_TIMEOUT' => 6//타임아웃 시간(초)
);
함수 __construct($seconds=30){
                    set_time_limit($seconds);                          }  
/*
* URL 설정
* @list 배열
*/
공용 함수 setUrlList($list=array()){
            $this->url_list=$list;                                        }  
/*
* 매개변수 설정
* @cutPot 배열
*/
공개 함수 setOpt($cutPot){
$this->curl_setopt=$cutPot $this->curl_setopt
}  
/*
* 실행
* @return 배열
*/
공개 함수 실행(){
          $mh=curl_multi_init()
foreach($this->url_list as $i=>$url){
                $conn[$i]=curl_init($url)
foreach($this->curl_setopt as $key => $val){
                    cur_setopt($conn[$i],preg_replace('/(CURLOPT_w{1,})/ie','$0',$key),$val)
~                 curl_multi_add_handle($mh,$conn[$i])
~           $active=false;                            하세요{
                 $mrc=curl_multi_exec($mh,$active)
        }while($mrc == CURLM_CALL_MULTI_PERFORM)

​​​​while($active 및 $mrc ​​​​== CURLM_OK){
If(curl_multi_select($mh) != -1){
~                                                                     $mrc=curl_multi_exec($mh,$active)
                       }while($mrc == CURLM_CALL_MULTI_PERFORM)
~   ~          $res=array()
foreach($this->url_list as $i => $url){
                $res[$i]=curl_multi_getcontent($conn[$i])
              컬_닫기($conn[$i])
               cur_multi_remove_handle($mh,$conn[$i]);//리소스 해제 
~ ​​​​ 컬_다중_닫기($mh)
          $res 반환;                                }  
}

PHP는 다중 스레드 다운로드 클래스 예제를 사용하여 원격 이미지를 다운로드하며 코드는 다음과 같습니다.
코드 복사 코드는 다음과 같습니다.
$curl_mul=new curl_multi()
$curl_mul->setUrlList(array('http://www.jb51.net/img/logo.jpg','http://www.jb51.net/img/logo.jpg','http:// www.jb51.net/img/logo.jpg'))
$a=$curl_mul->실행()
$i=1; foreach($a를 $v로){
         $filename=$i.'.gif'
          $fp2=@fopen($filename,'a')
            fwrite($fp2,$v);                                            fclose($fp2);                                                     $i ;                   }


이 기사가 모든 사람의 PHP 프로그래밍 설계에 도움이 되기를 바랍니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.