PHP 8.0 ZTS + parallel(pthreads) 설치해서 병렬처리하기

by ANTIBIOTICS posted Feb 03, 2022
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

 

PHP 7.2 이전까지는 pthreads 확장을 사용하여 다중 스레드 구현이 가능했지만, pthreads 확장은 개발자가 공식적으로 개발중단을 선언해버린 상황이라 PHP 8.0부터는 pthreads 대신 parallel 확장이 권장되고 있습니다.

 

https://www.php.net/manual/en/book.parallel.php

(parallel PHP 공식문서)

 

Ubuntu의 기본적인 패키지설치가 지원하는 PHP는 보통 NTS(Non-Thread Safe) 버전으로, parallel 확장을 사용하기 위해서는 다중스레드를 지원하는 ZTS(Zend-Thread Safe)버전을 설치해야 합니다.

 

이 글은 Ubuntu 16.04 LTS 환경에서 PHP 8.0 ZTS 와 parallel 확장 설치를 다루고 있습니다.

 

 

 1. PHP 8.0 ZTS 설치

 

apt -y install pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev

 

빌드에 필요한 필수 패키지를 설치합니다.

 

cd ~/

git clone https://github.com/php/php-src.git -b PHP-8.0.15 --depth=1

 

PHP 8.0.15 버전의 소스를 클론합니다.

상위 버전인 PHP 8.1.2의 경우는 parallel 빌드시 컴파일 오류가 발생하니 반드시 8.0.15을 사용하세요.

 

cd php-src/

 

php 소스가 있는 디렉터리로 이동.

 

./buildconf --force

 

configure 파일을 생성합니다.

 

./configure --enable-debug --enable-zts

 

ZTS 옵션을 주고 make 파일을 생성합니다.

 

https://www.php.net/manual/en/configure.about.php

http://coffeenix.net/doc/php-4.2.3/ko/install.configure.html

컴파일시의 여러가지 configure 옵션에 관해서는 위 링크를 참조.

 

2.PNG

 

이렇게 라이선스 안내문과 Thank you for using PHP 문구가 나타난다면 정상적으로 make 파일이 생성된 것입니다.

 

make

 

PHP 소스를 빌드합니다.

시스템의 성능에 따라 컴파일하는데 수분에서 수시간까지 걸릴수 있습니다.

 

3.PNG

 

이렇게 Build complete 문구가 뜨면 설치파일 생성이 완료되었습니다.

 

make install

 

시스템에 PHP 8.0.15를 설치합니다.

 

php --version

 

6.PNG

 

PHP 버전이 8.0.15가 맞는지 확인합니다.

 

php -i | grep -i "Thread Safety"

 

Thread Safety => enabled로 되어있는지 확인합니다.

 

extension=parallel.so

zend_extension=opcache.so

 

php.ini-development 파일을 vim에디터로 열어서 위 내용을 적당한 위치에 추가해줍니다.

 

 

mv php.ini-development php.ini

mv php.ini /usr/local/lib/

 

php.ini-development 파일을 php.ini로 수정하고 적절한 디렉터리로 옮겨주도록 합니다.

이때 php --ini | grep php.ini 명령어로 php.ini 파일이 위치해야할 디렉터리가 /usr/local/lib가 맞는지 한 번 더 확인해주도록 합시다.

 


 2. parallel 설치

 

cd ~/

git clone https://github.com/krakjoe/parallel.git

 

parallel 확장의 소스를 클론해옵니다.

 

cd parallel/

phpize

 

parallel 디렉터리로 이동해서 phpize 명령어로 configure 파일을 생성합니다.

 

./configure --enable-parallel --enable-parallel-dev

 

enable parallel 옵션을 주고 make 파일을 생성합니다.

 

make

 

소스를 빌드합니다.

 

4.PNG

 

이렇게 Build complete 문구가 뜬다면 설치파일이 정상적으로 생성되었습니다.

 

make install

 

5.PNG

 

parallel 확장을 설치합니다.

여기서 Installing shared extensions: 에 표시되는 디렉터리에 parallel.so 파일과 opcache.so 파일이 있는지 확인해주도록 합시다.

 

 

 3. 멀티스레드 테스트

 

<?php

use parallel\{Future, Runtime};

const THREADS_COUNT = 10;
const THREADS_I_MAX = 100;

// 스레드 내부에서 실행될 기능
$task = static function (int $i, int $to): void {
    echo "[enter$i]";
    for ($j = 0; $j < $to; $j++) {
        echo $i;
    }
    echo "[exit$i]";
};

// 스레드 생성
$runtimeList = [];
for ($i = 0; $i < THREADS_COUNT; $i++) {
    $runtimeList[] = new Runtime();
}


// 모든 스레드 실행
$futureList = [];
foreach ($runtimeList as $i => $runtime) {
    echo "[run$i]";
    $futureList[] = $runtime->run($task, [$i, THREADS_I_MAX]);
}

// 모든 스레드가 종료될 때까지 대기
do {
    usleep(1);
    $allDone = array_reduce(
        $futureList,
        function (bool $c, Future $future): bool {
            return $c && $future->done();
        },
        true
    );
} while (false === $allDone);
echo "done\n";

 

 

공식문서에 있는 예제를 가져왔습니다.

 

위 코드는 스크립트를 실행할때마다 출력이 다르게 나타납니다.

 

 

 


  1. PHP 8.0 ZTS + parallel(pthreads) 설치해서 병렬처리하기

    Date2022.02.03 Views710
    Read More
Board Pagination Prev 1 Next
/ 1

menu