>백엔드 개발 >PHP 튜토리얼 >PHP 초보자 가이드: 멀티스레드 프로그래밍

PHP 초보자 가이드: 멀티스레드 프로그래밍

WBOY
WBOY원래의
2023-05-20 12:51:061027검색

PHP는 웹 애플리케이션과 동적 웹사이트를 만드는 데 사용되는 널리 사용되는 서버 측 프로그래밍 언어입니다. PHP는 기본적으로 다중 스레드 프로그래밍을 지원하지 않지만 비차단 I/O 작업 및 프로세스 간 통신을 구현하는 데 사용할 수 있는 도구와 확장을 제공합니다. 이 기사에서는 PHP 다중 스레드 프로그래밍의 기본 지식과 도구를 소개합니다.

  1. 멀티 스레드 프로그래밍의 기초

멀티 스레드 프로그래밍은 프로그램이 동시에 여러 작업을 수행할 수 있는 동시 프로그래밍 방법입니다. 스레드는 운영체제가 자원을 할당하는 가장 작은 단위로 독립적인 코드 실행 경로와 스택(저장 함수 호출 및 지역 변수)을 가지고 있습니다. 메모리 및 파일 설명자와 같은 리소스는 스레드 간에 공유될 수 있으므로 경쟁 조건을 피하기 위해 잠금 및 조건 변수와 같은 동기화 도구를 사용해야 합니다.

PHP에서 스레드를 생성하려면 PCNTL 확장에서 제공하는 기능을 사용해야 합니다. PCNTL은 PHP 프로세스 제어를 위한 인터페이스를 제공하는 PHP의 확장입니다. PCNTL 확장을 사용하면 하위 프로세스를 생성 및 관리하고, 신호를 보내고 받고, 프로세스 종료 이벤트 등을 처리할 수 있습니다.

  1. PCNTL 확장

PHP PCNTL 확장은 다중 스레드 프로그래밍에 사용할 수 있는 여러 기능을 제공합니다. 다음은 몇 가지 일반적인 기능입니다.

pcntl_fork(): 하위 프로세스를 만들고 모두 복사합니다. 현재 프로세스의 리소스(코드 및 데이터 포함) 하위 프로세스와 상위 프로세스의 유일한 차이점은 프로세스 ID가 다르다는 것입니다. 상위 프로세스는 이 ID를 사용하여 하위 프로세스를 모니터링하고 제어할 수 있습니다. pcntl_fork():创建一个子进程,并复制当前进程的所有资源(包括代码和数据)。子进程与父进程唯一的区别是有不同的进程ID。父进程可以使用这个ID来监视和控制子进程。

pcntl_wait($status):等待任何子进程退出,并取得它的退出状态。这个函数会阻塞当前进程的执行,直到任何一个子进程退出。

pcntl_signal($sig, $handler):注册一个信号处理器,当接收到指定信号时,调用指定的处理函数。可以使用这个函数来捕捉和处理子进程终止、中断和其他事件。

pcntl_alarm($seconds)

pcntl_wait($status): 하위 프로세스가 종료될 때까지 기다리고 종료 상태를 얻습니다. 이 함수는 하위 프로세스가 종료될 때까지 현재 프로세스의 실행을 차단합니다.
  1. pcntl_signal($sig, $handler): 신호 처리기를 등록하고 지정된 신호가 수신되면 지정된 처리 함수를 호출합니다. 이 함수를 사용하여 하위 프로세스 종료, 인터럽트 및 기타 이벤트를 캡처하고 처리할 수 있습니다.
pcntl_alarm($seconds): 타이머 신호를 설치하고 지정된 초 수 후에 SIGALARM 신호를 보냅니다. 이 기능을 사용하면 프로세스 상태 및 파일 업데이트 이벤트를 확인하기 위한 폴링과 같은 일부 작업을 정기적으로 수행할 수 있습니다.

프로세스 간 통신

멀티 스레드 프로그래밍에서는 IPC(프로세스 간 통신)가 필수적입니다. PHP는 다음과 같은 다양한 IPC 방법을 제공합니다.

(1) 파이프(pipe): 한 프로세스는 데이터를 쓰고 다른 프로세스는 데이터를 읽는 두 개의 관련 프로세스 간에 데이터를 교환할 수 있습니다.

(2) 메시지 큐: 프로세스 간에 데이터를 전송하기 위한 메커니즘입니다. 프로세스는 비동기 통신을 구현하는 메시지 대기열을 통해 메시지를 보내고 받을 수 있습니다.
  1. (3) 공유 메모리: 여러 프로세스가 동일한 공유 메모리 영역에 액세스하여 상태와 데이터를 공유할 수 있습니다.
(4) 세마포어: 경쟁 조건을 방지하기 위해 여러 프로세스 간의 동기화 및 상호 배제에 사용됩니다.

PHP 다중 스레드 프로그래밍 구현

PHP에서 다중 스레드 프로그래밍을 구현하려면 PCNTL 확장 및 관련 IPC 도구를 사용해야 합니다. 다음은 간단한 PHP 다중 스레드 프로그래밍 예제입니다.
    <?php
    
    $pid = pcntl_fork();
    
    if ($pid == -1) {
        die('could not fork');
    } else if ($pid) {
        // 父进程
        pcntl_wait($status); // 等待子进程退出
    } else {
        // 子进程
        echo "child process
    ";
        sleep(5);
        exit(0); // 退出子进程
    }
    
    echo "parent process
    ";
  1. 이 예제는 하위 프로세스를 생성하고 하위 프로세스에 메시지를 인쇄합니다. 상위 프로세스는 종료하기 전에 하위 프로세스가 종료될 때까지 기다립니다. 실제 응용 프로그램에서는 IPC 도구를 사용하여 프로세스 간 통신 및 동기화를 구현할 수 있습니다. 예를 들어 메시지 대기열을 사용하여 상위 프로세스와 하위 프로세스 간 메시지 전달을 구현합니다.
  2. <?php
    
    $parent_pid = getmypid(); // 获取父进程ID
    $msg_queue = msg_get_queue(123); // 创建消息队列
    
    $pid = pcntl_fork();
    
    if ($pid == -1) {
        die('could not fork');
    } else if ($pid) {
        // 父进程
        sleep(1); // 等待子进程创建消息队列
        msg_send($msg_queue, $parent_pid, "Hello, child process!"); // 发送消息
        echo "message sent
    ";
        pcntl_wait($status); // 等待子进程退出
    } else {
        // 子进程
        $child_pid = getmypid(); // 获取子进程ID
        echo "child process
    ";
        $msg = null;
        msg_receive($msg_queue, $child_pid, $msgtype, 1024, $msg); // 接收消息
        echo "received message: $msg
    ";
        exit(0); // 退出子进程
    }
    
    echo "parent process
    ";
이 예에서는 메시지 대기열을 생성하고 상위 프로세스와 하위 프로세스 간에 문자열 메시지를 전달합니다. 상위 프로세스는 종료하기 전에 하위 프로세스가 종료될 때까지 기다립니다. 이 예에서는 다른 프로세스가 메시지를 수신하지 못하도록 프로세스 ID를 메시지 유형으로 사용해야 합니다.

🎜요약🎜🎜🎜PHP 자체는 멀티스레딩을 지원하지 않지만 PCNTL 확장 및 관련 IPC 도구를 사용하면 멀티스레드 프로그래밍, 동시성 제어 및 IPC 통신과 같은 기능을 구현할 수 있습니다. 다중 스레드 프로그래밍은 프로그램의 성능과 응답성을 향상시킬 수 있지만 경쟁 조건 및 교착 상태와 같은 문제를 방지하려면 주의를 기울여야 합니다. 실제 적용에서는 특정 시나리오에 따라 적절한 도구와 기술을 선택해야 합니다. 🎜

위 내용은 PHP 초보자 가이드: 멀티스레드 프로그래밍의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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