>백엔드 개발 >PHP 튜토리얼 >PHP에서 기본 동시성 처리를 구현하는 방법

PHP에서 기본 동시성 처리를 구현하는 방법

WBOY
WBOY원래의
2023-11-08 19:55:041080검색

PHP에서 기본 동시성 처리를 구현하는 방법

PHP 하단에서 동시 처리를 구현하려면 구체적인 코드 예제가 필요합니다.

웹 개발 과정에서 동시 처리를 사용하지 않으면 대량의 동시 요청을 처리해야 하는 경우가 종종 있습니다. 긴 응답 시간과 과도한 서버 압박. PHP는 웹 개발을 위한 언어입니다. 내장된 멀티스레딩 지원은 상대적으로 약하지만 다른 방법을 통해 기본 동시 처리를 달성할 수 있습니다.

1. 원리 소개

PHP에서는 각 요청이 웹 서버에 의해 열리는 새로운 프로세스나 스레드에 의해 처리됩니다. 동시성을 향상시키기 위해서는 하단에 다중 프로세스나 다중 스레드 방식을 사용하여 여러 요청을 동시에 처리함으로써 동시성 향상 효과를 얻을 수 있다.

다중 프로세스 방식은 포크 기능을 통해 하위 프로세스를 생성하여 구현됩니다. 하위 프로세스는 상위 프로세스의 컨텍스트(변수, 파일 설명자 등)를 상속하고 메모리를 공유할 수 있습니다. 멀티스레딩은 프로세스의 컨텍스트를 공유할 수 있는 스레드를 생성하기 위한 API를 제공하는 pthread 확장을 통해 구현됩니다.

2. 동시 처리를 구현하는 라이브러리

  1. Swoole

Swoole은 C로 작성된 확장으로, PHP 거래에서 기본 동시성을 빠르게 구현하는 데 도움이 되는 고성능 비동기식 이벤트 기반 네트워크 프로그래밍 프레임워크를 제공합니다. 와 함께. Swoole은 비동기 TCP/UDP/Unix 소켓 프로토콜, HTTP/WebSocket 서버는 물론 비동기 MySQL, Redis, DNS 쿼리 및 기타 기능을 지원합니다.

다음은 Swoole을 사용하여 구현된 간단한 HTTP 서버의 예입니다.

<?php
$http = new swoole_http_server("0.0.0.0", 9501);

$http->on("start", function ($server) {
    echo "Swoole http server is started at http://127.0.0.1:9501
";
});

$http->on("request", function ($request, $response) {
    $response->header("Content-Type", "text/plain");
    $response->end("Hello Swoole!");
});

$http->start();
  1. Amp

Amp는 PHP 기반의 비동기 프로그래밍 프레임워크로, 코루틴 세트와 비동기 비차단 IO API를 제공하여 우리를 도와줍니다. 낮은 수준의 동시 처리를 구현합니다. Amp는 비동기 TCP/UDP/Unix 소켓 프로토콜, HTTP/HTTPS 클라이언트, 서버 및 비동기 MySQL, PostgreSQL, Redis, Memcached 및 기타 기능을 지원합니다.

다음은 Amp를 사용하여 구현한 간단한 HTTP 서버의 예입니다.

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

use AmpHttpServerHttpServer;
use AmpHttpServerRequestHandlerCallableRequestHandler;
use AmpHttpServerResponse;
use AmpHttpStatus;

$server = new HttpServer([new CallableRequestHandler(function () {
    return new Response(Status::OK, ['content-type' => 'text/plain'], 'Hello, world!');
})]);

$socket = AmpSocketlisten('0.0.0.0:9501');

$server->listen($socket);

AmpLoop::run();

3. 기본 다중 프로세스/다중 스레드 코드 예제

PCNTL 확장을 사용하면 PHP에서 다중 프로세스 프로그래밍을 매우 편리하게 구현할 수 있습니다. 간단한 다중 프로세스 예:

<?php
$workerNum = 3; // 子进程数量

// 父进程等待子进程结束并回收资源
for ($i = 0; $i < $workerNum; $i++) {
    $pid = pcntl_fork();
    if ($pid < 0) {
        // 创建子进程失败
        exit('fork failed');
    } elseif ($pid == 0) {
        // 子进程代码
        echo 'worker ', $i, " pid is ", posix_getpid(), "
";
        // 这里是子进程具体的处理逻辑
        sleep(10);
        exit(0);
    }
}

while (($ret = pcntl_waitpid(-1, $status, WNOHANG)) != -1) {
    // 回收子进程资源
    if ($ret > 0) {
        echo "worker ", $ret, " exit with status ", $status, "
";
    } else {
        break;
    }
}

pthreads 확장을 사용하면 PHP에서 다중 스레드 프로그래밍을 쉽게 구현할 수 있습니다. 다음은 간단한 다중 스레딩 예입니다.

<?php
class MyWorker extends Thread {
    public function run() {
        echo 'Worker ', $this->getThreadId(), " starts
";
        // 这里是子线程具体的处理逻辑
        sleep(10);
        echo 'Worker ', $this->getThreadId(), " ends
";
    }
}

$workerNum = 3; // 子线程数量

$workers = [];
for ($i = 0; $i < $workerNum; $i++) {
    $workers[] = new MyWorker();
}

foreach ($workers as $worker) {
    $worker->start();
}

foreach ($workers as $worker) {
    $worker->join();
}

위는 일반적으로 사용되는 두 가지 저수준 다중 프로세스/ 물론, ReactPHP 및 Workerman과 같은 타사 프레임워크를 사용하는 등 더 고급 방법을 사용할 수도 있습니다. 실제 애플리케이션에서는 비즈니스 시나리오에 따라 적절한 솔루션을 선택해야 하며 PHP의 기본 동시 처리를 달성해야 합니다.

위 내용은 PHP에서 기본 동시성 처리를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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