"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > PHP의 동시성과 병렬성

PHP의 동시성과 병렬성

2024-07-31에 게시됨
검색:270

Concurrency and Parallelism in PHP

동시성과 병렬성은 현대 프로그래밍의 필수 개념으로, 애플리케이션이 인터리브 실행(동시성) 또는 동시 실행(병렬성)을 통해 여러 작업을 동시에 수행할 수 있도록 해줍니다. 주로 동기 실행 모델로 알려진 PHP는 다양한 기술을 통해 이러한 패러다임을 지원하도록 발전해 왔습니다.

PHP의 표준 실행 모델

PHP는 전통적으로 동기 실행 모델을 따르며, 특히 일반적인 웹 서버 설정에서 Apache와 함께 사용될 때 더욱 그렇습니다. 이 모델에서는 각 HTTP 요청이 단일 PHP 프로세스에 의해 처리됩니다. 요청 처리와 관련된 단계는 다음과 같습니다.

  1. Apache는 HTTP 요청을 수신하고 이를 PHP로 전달합니다.
  2. PHP는 단일 스레드에서 처음부터 끝까지 스크립트를 실행합니다.
  3. PHP는 출력을 Apache에 반환하고 Apache는 응답을 다시 클라이언트로 보냅니다.

이 모델은 단순성과 이해 용이성을 보장하지만 병렬 실행이 필요한 작업이나 여러 작업을 동시에 처리하는 작업에는 비효율적일 수 있습니다.

PHP 동시성과 병렬성의 진화

웹 애플리케이션이 더욱 복잡해지면서 PHP에서 동시 및 병렬 실행에 대한 필요성이 커졌습니다. 이러한 패러다임을 달성하기 위해 PHP가 제공하는 기술을 살펴보겠습니다.

1. 동기 코드

동기 코드는 작업이 차례로 수행되는 가장 간단한 실행 형태입니다.

echo "Synchronous Code Example:\n";
function synchronousFunction() {
    for ($i = 0; $i 



이 예에서 루프의 각 반복은 반복 사이에 1초의 지연을 두고 순차적으로 실행됩니다. 이 접근 방식은 간단하지만 병렬 실행의 이점을 누릴 수 있는 I/O 바인딩 또는 CPU 집약적 작업에는 비효율적입니다.

2. 프로세스 포크

포킹은 원래 프로세스(상위)와 동시에 실행되는 새 프로세스(하위)를 생성합니다. 이는 작업을 병렬화하는 데 유용합니다.

echo "\nForking Process Example:\n";
function forkProcess() {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die('could not fork');
    } else if ($pid) {
        echo "Parent Process: PID $pid\n";
        pcntl_wait($status); // Protect against Zombie children
    } else {
        echo "Child Process: Hello from the child process!\n";
        exit(0);
    }
}
forkProcess();

이 코드에서 pcntl_fork()는 하위 프로세스를 생성합니다. 상위 프로세스와 하위 프로세스가 동시에 실행되므로 병렬 작업 실행이 가능합니다. 부모 프로세스는 좀비 프로세스 생성을 피하기 위해 자식 프로세스가 완료될 때까지 기다립니다.

3. 스레딩

PHP의 스레딩 기능은 pthread와 같은 확장을 통해 사용할 수 있습니다. 스레드는 프로세스보다 가볍고 동일한 메모리 공간을 공유하므로 공유 데이터가 필요한 작업에 적합합니다.

if (!class_exists('Thread')) {
    die("Threads are not supported in this PHP build\n");
}

echo "\nThreading Example:\n";
class MyThread extends Thread {
    public function run() {
        for ($i = 0; $i start();
$thread->join();

이 예제는 Thread를 확장하는 MyThread 클래스를 정의합니다. run 메소드는 메인 스레드와 동시에 실행되는 새로운 스레드에서 실행됩니다. 이 접근 방식은 스레드가 리소스 대기를 처리할 수 있는 I/O 바인딩 작업에 유용합니다.

4. 발전기

생성기는 간단한 코루틴을 구현하는 방법을 제공하여 함수가 전체 프로그램을 차단하지 않고 반복적으로 결과를 생성할 수 있도록 합니다.

echo "\nGenerators Example:\n";
function simpleGenerator() {
    yield 'First';
    yield 'Second';
    yield 'Third';
}

$gen = simpleGenerator();
foreach ($gen as $value) {
    echo "Generator Yielded: $value\n";
}

생성기는 수율 키워드를 사용하여 한 번에 하나씩 값을 생성함으로써 기능을 일시 중지하고 재개할 수 있도록 하여 협력적인 멀티태스킹 형태를 촉진합니다.

PHP는 동기식 기반에서 시작해 다양한 형태의 동시성과 병렬성을 지원하는 데 큰 발전을 이루었습니다. 동기 코드는 많은 사용 사례에서 간단하고 효과적이지만 프로세스 포크, 스레딩 및 생성기 사용과 같은 기술은 복잡하고 병렬화 가능한 작업을 효율적으로 처리할 수 있는 새로운 가능성을 열어줍니다.

릴리스 선언문 이 기사는 https://dev.to/francescoagati/concurrency-and-parallelism-in-php-6fc?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]에 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3