So implementieren Sie die zugrunde liegende Parallelitätsverarbeitung in PHP

WBOY
Freigeben: 2023-11-08 19:56:01
Original
1043 Leute haben es durchsucht

So implementieren Sie die zugrunde liegende Parallelitätsverarbeitung in PHP

Für die Implementierung der Parallelitätsverarbeitung am Ende von PHP sind bestimmte Codebeispiele erforderlich.

Bei der Webentwicklung ist es häufig erforderlich, eine große Anzahl gleichzeitiger Anforderungen zu verarbeiten Lange Antwortzeiten und übermäßiger Serverdruck. PHP ist eine Sprache für die Webentwicklung. Die integrierte Multithreading-Unterstützung ist relativ schwach, sie kann jedoch die zugrunde liegende Parallelitätsverarbeitung durch andere Methoden erreichen.

1. Einführung in das Prinzip

In PHP wird jede Anfrage von einem neuen Prozess oder Thread verarbeitet, der vom Webserver geöffnet wird. Um die Parallelität zu verbessern, können unten Multiprozess- oder Multithread-Methoden verwendet werden, um mehrere Anforderungen gleichzeitig zu verarbeiten und so den Effekt einer Verbesserung der Parallelität zu erzielen.

Die Multiprozessmethode wird durch Erstellen eines untergeordneten Prozesses über die Fork-Funktion implementiert. Der untergeordnete Prozess erbt den Kontext (Variablen, Dateideskriptoren usw.) des übergeordneten Prozesses und kann den Speicher teilen. Multithreading wird durch die pthread-Erweiterung implementiert, die eine API zum Erstellen von Threads bereitstellt, die den Kontext des Prozesses gemeinsam nutzen können. 2. Bibliothek zur Implementierung der gleichzeitigen Verarbeitung mit. Swoole unterstützt asynchrone TCP/UDP/Unix-Socket-Protokolle, HTTP/WebSocket-Server sowie asynchrone MySQL-, Redis-, DNS-Abfragen und andere Funktionen.

Das Folgende ist ein Beispiel für einen einfachen HTTP-Server, der mit Swoole implementiert wurde:

<?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();
Nach dem Login kopieren
  1. Amp

Amp ist ein auf PHP basierendes asynchrones Programmierframework, das eine Reihe von Coroutinen und asynchronen, nicht blockierenden IO-APIs bereitstellt, um uns zu helfen Implementieren Sie die Parallelitätsverarbeitung auf niedriger Ebene. Amp unterstützt asynchrone TCP/UDP/Unix-Socket-Protokolle, HTTP/HTTPS-Clients, Server sowie asynchrone MySQL-, PostgreSQL-, Redis-, Memcached- und andere Funktionen.

Das Folgende ist ein Beispiel für einen einfachen HTTP-Server, der mit Amp implementiert wurde:

<?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();
Nach dem Login kopieren
    3. Beispiel für zugrunde liegenden Multiprozess-/Multithread-Code: Mit der PCNTL-Erweiterung kann die Multiprozessprogrammierung in PHP sehr bequem implementiert werden ist ein einfaches Multi-Prozess-Beispiel:
  1. <?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;
        }
    }
    Nach dem Login kopieren
  2. Die Verwendung der pthreads-Erweiterung kann problemlos Multithread-Programmierung in PHP implementieren. Hier ist ein einfaches Multi-Threading-Beispiel:
<?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();
}
Nach dem Login kopieren

Die oben genannten sind zwei häufig verwendete Low-Level-Multi-Prozesse/. Natürlich können Sie auch fortgeschrittenere Methoden verwenden, beispielsweise die Verwendung von Frameworks von Drittanbietern wie ReactPHP und Workerman. In tatsächlichen Anwendungen ist es notwendig, eine geeignete Lösung basierend auf Geschäftsszenarien und -anforderungen auszuwählen, um die zugrunde liegende gleichzeitige Verarbeitung von PHP zu erreichen.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die zugrunde liegende Parallelitätsverarbeitung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage