>  기사  >  백엔드 개발  >  PHP의 동시성과 병렬성 탐색: 실습 튜토리얼 및 팁

PHP의 동시성과 병렬성 탐색: 실습 튜토리얼 및 팁

DDD
DDD원래의
2024-09-14 06:25:391117검색

Exploring Concurrency and Parallelism in PHP: Hands-On Tutorials and Tips

효율적인 PHP 애플리케이션을 작성하려면 특히 동시에 처리해야 하는 여러 작업이나 작업을 처리할 때 동시성과 병렬성을 이해하는 것이 중요합니다. 다음은 실제 예제와 설명을 통해 PHP의 동시성과 병렬성을 이해하고 구현하는 단계별 가이드입니다.

1. 동시성 대 병렬성

  • 동시성: 실행을 인터리브하여 여러 작업을 한 번에 처리할 수 있는 시스템 기능을 의미합니다. 반드시 작업이 동시에 실행되는 것은 아니며, 동시에 진행되는 것처럼 보이도록 관리됩니다.

  • 병렬성: 여러 프로세서 또는 코어를 활용하여 동시에 여러 작업을 실행하는 것입니다. 이는 작업이 말 그대로 병렬로 실행되는 동시성의 하위 집합입니다.

2. PHP의 동시성

PHP는 전통적으로 단일 스레드 방식이므로 한 번에 하나의 작업을 처리합니다. 그러나 비동기 처리 및 외부 도구 사용과 같은 기술을 통해 동시성을 달성할 수 있습니다.

2.1. 동시성을 위해 pcntl_fork 사용

PHP의 pcntl(프로세스 제어) 확장을 사용하면 프로세스 제어가 가능하며 프로세스를 포크하여 동시성을 달성하는 데 사용할 수 있습니다.

전제 조건:

  • PHP 설치 시 pcntl 확장이 활성화되어 있는지 확인하세요.

:

<?php
// Check if pcntl is available
if (!function_exists('pcntl_fork')) {
    die('The pcntl extension is not available.');
}

$pid = pcntl_fork();

if ($pid == -1) {
    // Fork failed
    die('Could not fork');
} elseif ($pid) {
    // Parent process
    echo "Parent Process\n";
    pcntl_wait($status); // Wait for child process to finish
} else {
    // Child process
    echo "Child Process\n";
    sleep(2); // Simulate a task
    echo "Child Process Finished\n";
}
?>

설명:

  • pcntl_fork()는 새로운 프로세스를 생성합니다.
  • 상위 프로세스와 하위 프로세스가 동시에 실행됩니다.
  • 상위 프로세스는 pcntl_wait()를 사용하여 하위 프로세스가 완료될 때까지 기다립니다.

2.2. ReactPHP를 사용한 비동기 처리

ReactPHP는 PHP의 이벤트 중심 프로그래밍용 라이브러리로, 비동기 작업이 가능합니다.

설치:

composer require react/event-loop

:

<?php
require 'vendor/autoload.php';

use React\EventLoop\Factory;
use React\Promise\PromiseInterface;

$loop = Factory::create();

// Function to simulate an asynchronous task
function asyncTask($name) {
    return new PromiseInterface(function ($resolve, $reject) use ($name) {
        echo "Starting $name...\n";
        sleep(2); // Simulate a delay
        echo "$name completed.\n";
        $resolve();
    });
}

$promise1 = asyncTask('Task 1');
$promise2 = asyncTask('Task 2');

// Wait for all promises to complete
$loop->run();
?>

설명:

  • ReactPHP는 비동기 작업 실행을 가능하게 합니다.
  • 작업은 동시에 실행되며 이벤트 루프가 실행을 관리합니다.

3. PHP의 병렬성

병렬화에는 여러 작업을 동시에 실행하는 것이 포함됩니다. PHP에서는 병렬 처리용으로 설계된 도구와 라이브러리를 사용하여 이를 달성할 수 있습니다.

3.1. 병렬 확장 사용

병렬 확장을 사용하면 멀티스레딩을 활성화하여 PHP에서 병렬 처리를 수행할 수 있습니다.

설치:

  • PECL을 사용하여 병렬 확장을 설치하거나 소스에서 컴파일하세요.

:

<?php
// Check if parallel is available
if (!extension_loaded('parallel')) {
    die('The parallel extension is not available.');
}

use parallel\{Runtime, Future};

// Function to run in parallel
function task($name) {
    echo "Task $name started\n";
    sleep(2); // Simulate a task
    echo "Task $name completed\n";
}

// Create runtime environments
$runtime1 = new Runtime();
$runtime2 = new Runtime();

// Start tasks in parallel
$future1 = $runtime1->run(function() {
    task('1');
});
$future2 = $runtime2->run(function() {
    task('2');
});

// Wait for tasks to complete
$future1->value();
$future2->value();
?>

설명:

  • 병렬을 사용하면 여러 런타임 환경을 만들 수 있습니다.
  • 작업은 여러 스레드에서 병렬로 실행됩니다.

3.2. pthread 확장 사용

pthreads 확장을 사용하면 PHP 스크립트에서 스레드를 생성하고 읽고 쓸 수 있습니다.

설치:

  • PECL을 사용하여 pthreads 확장을 설치합니다.

:

<?php
// Check if pthreads is available
if (!extension_loaded('pthreads')) {
    die('The pthreads extension is not available.');
}

class Worker extends Thread {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function run() {
        echo "Thread {$this->name} started\n";
        sleep(2); // Simulate a task
        echo "Thread {$this->name} completed\n";
    }
}

$worker1 = new Worker('1');
$worker2 = new Worker('2');

// Start threads
$worker1->start();
$worker2->start();

// Join threads to main script
$worker1->join();
$worker2->join();
?>

설명:

  • pthreads는 스레딩 지원을 제공합니다.
  • 스레드는 여러 CPU 코어를 활용하여 작업을 병렬로 실행합니다.

4. 결론

PHP의 동시성과 병렬성을 이해하고 구현하면 애플리케이션의 성능과 응답성을 크게 향상시킬 수 있습니다. 프로세스 분기, 비동기 처리, 멀티스레딩과 같은 기술을 사용하면 여러 작업을 보다 효율적으로 처리할 수 있습니다. 최적의 성능을 얻으려면 요구 사항과 환경에 가장 적합한 접근 방식을 선택하세요.

특정 사용 사례와 PHP 환경에 따라 이러한 예를 자유롭게 적용하세요.

위 내용은 PHP의 동시성과 병렬성 탐색: 실습 튜토리얼 및 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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