PHP 하단에서 동시 처리를 구현하려면 구체적인 코드 예제가 필요합니다.
웹 개발 과정에서 동시 처리를 사용하지 않으면 대량의 동시 요청을 처리해야 하는 경우가 종종 있습니다. 긴 응답 시간과 과도한 서버 압박. PHP는 웹 개발을 위한 언어입니다. 내장된 멀티스레딩 지원은 상대적으로 약하지만 다른 방법을 통해 기본 동시 처리를 달성할 수 있습니다.
1. 원리 소개
PHP에서는 각 요청이 웹 서버에 의해 열리는 새로운 프로세스나 스레드에 의해 처리됩니다. 동시성을 향상시키기 위해서는 하단에 다중 프로세스나 다중 스레드 방식을 사용하여 여러 요청을 동시에 처리함으로써 동시성 향상 효과를 얻을 수 있다.
다중 프로세스 방식은 포크 기능을 통해 하위 프로세스를 생성하여 구현됩니다. 하위 프로세스는 상위 프로세스의 컨텍스트(변수, 파일 설명자 등)를 상속하고 메모리를 공유할 수 있습니다. 멀티스레딩은 프로세스의 컨텍스트를 공유할 수 있는 스레드를 생성하기 위한 API를 제공하는 pthread 확장을 통해 구현됩니다.
2. 동시 처리를 구현하는 라이브러리
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();
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!