728x90
반응형
질문 : PHP 애플리케이션에서 멀티 스레딩을 사용하는 방법
실제로 또는 단순히 시뮬레이션하든 PHP에서 다중 스레드 모델을 구현하는 현실적인 방법이 있습니까? 얼마 전 운영 체제가 PHP 실행 파일의 다른 인스턴스를로드하고 다른 동시 프로세스를 처리하도록 강제 할 수 있다고 제안되었습니다.
이것의 문제는 PHP 코드가 실행을 마쳤을 때 PHP 인스턴스를 PHP 내에서 죽일 방법이 없기 때문에 메모리에 남아 있다는 것입니다. 따라서 여러 스레드를 시뮬레이션하는 경우 어떤 일이 발생할지 상상할 수 있습니다. 그래서 저는 여전히 PHP 내에서 멀티 스레딩을 효과적으로 수행하거나 시뮬레이션 할 수있는 방법을 찾고 있습니다. 어떤 아이디어?
답변
예, pthread를 사용 하여 PHP에서 멀티 스레딩을 수행 할 수 있습니다.
PHP 문서에서 :
pthreads는 PHP에서 멀티 스레딩에 필요한 모든 도구를 제공하는 객체 지향 API입니다. PHP 애플리케이션은 스레드, 작업자 및 스레드 개체를 생성, 읽기, 쓰기, 실행 및 동기화 할 수 있습니다.
경고 : pthreads 확장은 웹 서버 환경에서 사용할 수 없습니다. 따라서 PHP의 스레딩은 CLI 기반 애플리케이션에만 유지되어야합니다.
간단한 테스트
#!/usr/bin/php
<?php
class AsyncOperation extends Thread {
public function __construct($arg) {
$this->arg = $arg;
}
public function run() {
if ($this->arg) {
$sleep = mt_rand(1, 10);
printf('%s: %s -start -sleeps %d' . "\n", date("g:i:sa"), $this->arg, $sleep);
sleep($sleep);
printf('%s: %s -finish' . "\n", date("g:i:sa"), $this->arg);
}
}
}
// Create a array
$stack = array();
//Initiate Multiple Thread
foreach ( range("A", "D") as $i ) {
$stack[] = new AsyncOperation($i);
}
// Start The Threads
foreach ( $stack as $t ) {
$t->start();
}
?>
첫 실행
12:00:06pm: A -start -sleeps 5
12:00:06pm: B -start -sleeps 3
12:00:06pm: C -start -sleeps 10
12:00:06pm: D -start -sleeps 2
12:00:08pm: D -finish
12:00:09pm: B -finish
12:00:11pm: A -finish
12:00:16pm: C -finish
두 번째 실행
12:01:36pm: A -start -sleeps 6
12:01:36pm: B -start -sleeps 1
12:01:36pm: C -start -sleeps 2
12:01:36pm: D -start -sleeps 1
12:01:37pm: B -finish
12:01:37pm: D -finish
12:01:38pm: C -finish
12:01:42pm: A -finish
실제 사례
error_reporting(E_ALL);
class AsyncWebRequest extends Thread {
public $url;
public $data;
public function __construct($url) {
$this->url = $url;
}
public function run() {
if (($url = $this->url)) {
/*
* If a large amount of data is being requested, you might want to
* fsockopen and read using usleep in between reads
*/
$this->data = file_get_contents($url);
} else
printf("Thread #%lu was not provided a URL\n", $this->getThreadId());
}
}
$t = microtime(true);
$g = new AsyncWebRequest(sprintf("http://www.google.com/?q=%s", rand() * 10));
/* starting synchronization */
if ($g->start()) {
printf("Request took %f seconds to start ", microtime(true) - $t);
while ( $g->isRunning() ) {
echo ".";
usleep(100);
}
if ($g->join()) {
printf(" and %f seconds to finish receiving %d bytes\n", microtime(true) - $t, strlen($g->data));
} else
printf(" and %f seconds to finish, request failed\n", microtime(true) - $t);
}
출처 : https://stackoverflow.com/questions/70855/how-can-one-use-multi-threading-in-php-applications
728x90
반응형
'프로그래밍 언어 > PHP' 카테고리의 다른 글
PHP에서 암호를 해싱하기 위해 bcrypt를 사용하는 방법 (0) | 2021.07.05 |
---|---|
PHP로 전체 URL 얻기 (0) | 2021.06.30 |
PHP 치명적 (`E_ERROR`) 오류를 잡는 방법 (0) | 2021.06.30 |
PHP에서 파일 확장자를 확인하는 방법 (0) | 2021.06.30 |
일정 시간이 지나면 PHP 세션을 만료시키는 방법 (0) | 2021.06.30 |