>  기사  >  백엔드 개발  >  PHP가 멀티스레딩을 처리하는 방법

PHP가 멀티스레딩을 처리하는 방법

王林
王林원래의
2019-09-24 17:54:054134검색
권장 매뉴얼: php 완전 자습 매뉴얼

PHP가 멀티스레딩을 처리하는 방법

PHP는 멀티 스레딩

Notes

1, php5.3 이상을 처리하며 스레드로부터 안전한 버전입니다. Apache와 PHP에서 사용하는 컴파일러는 일관성이 있어야 합니다.

2. phpinfo()를 통해 Thread Safety가 활성화된 경우 Thread-Safe 버전을 의미합니다.

3. phpinfo()를 통해 Compiler 항목을 보면 사용된 컴파일러를 알 수 있습니다. 내 것은 MSVC9(Visual C++ 2008)입니다.

나의 사용환경

32비트 windows xp sp3, wampserver2.2d (php5.3.10-vc9 + apache2.2.21-vc9).

1. pthreads 확장 프로그램을 다운로드합니다.

제 환경에 따라 pthreads-2.0.8-5.3-ts-vc9-x86을 다운로드했습니다.

2.0.8은 pthread 버전을 나타냅니다.

5.3은 PHP 버전을 나타냅니다.

ts는 PHP에 스레드로부터 안전한 버전이 필요하다는 의미입니다.

vc9는 PHP를 Visual C++ 2008 컴파일러로 컴파일해야 함을 의미합니다.

x86은 32비트를 의미합니다.

2. pthreads 확장을 설치합니다
1. php_pthreads.dll을 binphpext 디렉터리에 복사합니다. (내 경로는 D: wampbinphpphp5.3.10ext)

2 pthreadVC2.dll을 binphp 디렉터리에 복사합니다. (내 경로는 D:wampbinphpphp5.3.10입니다.)

3 pthreadVC2.dll을 C:windowssystem32 디렉터리에 복사합니다.

4. PHP 구성 파일 php.ini를 엽니다. 마지막에 Extension=php_pthreads.dll

힌트를 추가하세요!

Windows 시스템은 PATH 환경 변수에 pthreadVC2.dll 경로를 추가해야 합니다. 내 컴퓨터--->마우스 오른쪽 버튼--->속성--->고급--->환경 변수--->시스템 변수--->Path라는 경로 찾기---> ;편집--->변수 값 끝에 pthreadVC2.dll의 전체 경로를 추가합니다.

3. pthreads 확장 테스트

class AsyncOperation extends \Thread {
    public function __construct($arg){
            $this->arg = $arg;
    }
     public function run(){ 
            if($this->arg){ 
            printf("Hello %s\n", $this->arg);
             }    
      }
}
$thread = new AsyncOperation("World");
if($thread->start())    
$thread->join();
?>

위 코드를 실행하면 Hello World가 나타나 pthreads 확장이 성공적으로 설치되었음을 알립니다!

2.curl_multi_init()

<?php
echo date("Y-m-d H:m:s",time());
echo " ";
echo floor(microtime()*1000);
echo "<br>";
$mtime = explode(" ", microtime());
$mtime = $mtime[1].($mtime[0] * 1000);
$mtime2 = explode(".", $mtime);
$mtime = $mtime2[0];
echo $mtime;
echo "<br>";
$urls = array(
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;,
&#39;http://www.webkaka.com&#39;);
print_r(async_get_url($urls)); // [0] => example1, [1] => example2
echo "<br>";
echo date("Y-m-d H:m:s",time());
echo " ";
echo floor(microtime()*1000);
echo "<br>";
$mtime_ = explode(" ", microtime());
$mtime_ = $mtime_[1].($mtime_[0] * 1000);
$mtime2_ = explode(".", $mtime_);
$mtime_ = $mtime2_[0];
echo $mtime_;
echo "<br>";
echo $mtime_ - $mtime;
function async_get_url($url_array, $wait_usec = 0)
{
if (!is_array($url_array))
return false;
$wait_usec = intval($wait_usec);
$data = array();
$handle = array();
$running = 0;
$mh = curl_multi_init(); // multi curl handler
$i = 0;
foreach($url_array as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don&#39;t print
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, &#39;Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)&#39;);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里
$handle[$i++] = $ch;
}
/* 执行 */
do {
curl_multi_exec($mh, $running);
if ($wait_usec > 0) /* 每个 connect 要间隔多久 */
usleep($wait_usec); // 250000 = 0.25 sec
} while ($running > 0);
/* 读取资料 */
foreach($handle as $i => $ch) {
$content = curl_multi_getcontent($ch);
$data[$i] = (curl_errno($ch) == 0) ? $content : false;
}
/* 移除 handle*/
foreach($handle as $ch) {
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
return $data;
}
?>

curl_multi_init()에 대하여

일반적으로, cur_multi_init() 사용을 생각하면 목적은 하나씩 요청하는 것이 아니라 동시에 여러 URL을 요청하는 것입니다. 하나, 그렇지 않으면 이제 컬_init()를 할 시간입니다. 하지만, 컬 멀티(curl_multi) 사용시 과도한 CPU 소모, 웹 페이지 정지 등의 현상이 발생할 수 있습니다. 컬 멀티로 인한 웹 페이지 정지 문제를 해결하는 방법을 보실 수 있습니다.

curl_multi를 사용하는 단계는 다음과 같이 요약됩니다.

1단계: 컬_multi_init 호출

2단계: 루프에서 컬_multi_add_handle 호출

이 단계에서는 컬_multi_add_handle의 두 번째 매개변수가 컬_init의 하위 핸들이라는 점에 유의해야 합니다.

3단계: 계속해서curl_multi_exec를 호출

4단계: 루프에서 컬_multi_getcontent를 호출하여 필요에 따라 결과를 얻습니다.

5단계:curl_multi_remove_handle을 호출하고 각 단어 핸들에 대해curl_close를 호출합니다

6단계:curl_multi_close를 호출

각 함수의 기능 설명:

curl_multi_init()curl_multi_init()

初始化一个curl批处理句柄资源。

curl_multi_add_handle()

向curl批处理会话中添加单独的curl句柄资源。curl_multi_add_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。

curl_multi_exec()

解析一个curl批处理句柄,curl_multi_exec()函数有两个参数,第一个参数表示一个批处理句柄资源,第二个参数是一个引用值的参数,表示剩余需要处理的单个的curl句柄资源数量。

curl_multi_remove_handle()

移除curl批处理句柄资源中的某个句柄资源,curl_multi_remove_handle()函数有两个参数,第一个参数表示一个curl批处理句柄资源,第二个参数表示一个单独的curl句柄资源。

curl_multi_close()

关闭一个批处理句柄资源。

curl_multi_getcontent()

在设置了CURLOPT_RETURNTRANSFER的情况下,返回获取的输出的文本流。

curl_multi_info_read()

curl 배치 핸들 리소스를 초기화합니다.

curl_multi_add_handle()🎜🎜curl 배치 세션에 별도의 컬 핸들 리소스를 추가합니다. curl_multi_add_handle() 함수에는 두 개의 매개변수가 있습니다. 첫 번째 매개변수는 컬 배치 핸들 리소스를 나타내고, 두 번째 매개변수는 별도의 컬 핸들 리소스를 나타냅니다. 🎜🎜curl_multi_exec()🎜🎜curl 배치 핸들을 구문 분석합니다.curl_multi_exec() 함수에는 두 개의 매개변수가 있습니다. 첫 번째 매개변수는 배치 핸들 리소스를 나타내고 두 번째 매개변수는 참조 값을 나타냅니다. 처리할 남은 개별 컬 핸들 리소스의 수입니다. 🎜🎜curl_multi_remove_handle()🎜🎜curl 배치 핸들 리소스에서 핸들 리소스를 제거합니다.curl_multi_remove_handle() 함수에는 두 개의 매개 변수가 있습니다. 첫 번째 매개 변수는 컬 배치 핸들 리소스입니다. 별도의 컬 핸들 리소스를 나타냅니다. 🎜🎜curl_multi_close()🎜🎜일괄 처리 리소스를 닫습니다. 🎜🎜curl_multi_getcontent()🎜🎜CURLOPT_RETURNTRANSFER가 설정된 경우 얻은 출력의 텍스트 스트림을 반환합니다. 🎜🎜curl_multi_info_read()🎜🎜현재 파싱된 컬의 관련 전송 정보를 가져옵니다. 🎜
추천 관련 기사:
1.PHP에서 멀티스레딩을 구현하는 방법
2.php to 멀티스레딩 달성 스레드의 세 가지 방법
관련 동영상 추천:
1.狗九经(4)_PHP 동영상 튜토리얼
#🎜🎜 #추천 튜토리얼:

PHP 비디오 튜토리얼

위 내용은 PHP가 멀티스레딩을 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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