Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk melaksanakan pemprosesan konkurensi asas dalam PHP

Bagaimana untuk melaksanakan pemprosesan konkurensi asas dalam PHP

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBasal
2023-11-08 19:55:041141semak imbas

Bagaimana untuk melaksanakan pemprosesan konkurensi asas dalam PHP

Cara melaksanakan pemprosesan serentak di bahagian bawah PHP memerlukan contoh kod khusus

Dalam proses pembangunan web, selalunya perlu untuk mengendalikan sejumlah besar permintaan serentak Jika pemprosesan serentak tidak digunakan, ia akan menyebabkan masa tindak balas yang panjang dan tekanan pelayan yang berlebihan. PHP ialah bahasa untuk pembangunan web Sokongan berbilang benang terbina dalam agak lemah, tetapi ia boleh mencapai pemprosesan konkurensi asas melalui kaedah lain.

1. Pengenalan kepada prinsip

Dalam PHP, setiap permintaan akan diproses oleh proses atau utas baharu yang dibuka oleh pelayan web. Untuk meningkatkan kesesuaian, kaedah berbilang proses atau berbilang benang boleh digunakan di bahagian bawah untuk memproses berbilang permintaan pada masa yang sama, sekali gus mencapai kesan penambahbaikan serentak.

Kaedah berbilang proses dilaksanakan dengan mencipta proses anak melalui fungsi garpu Proses anak akan mewarisi konteks (pembolehubah, deskriptor fail, dll.) proses induk dan boleh berkongsi memori. Berbilang benang dilaksanakan melalui sambungan pthread, yang menyediakan API untuk mencipta utas yang boleh berkongsi konteks proses.

2. Perpustakaan untuk melaksanakan pemprosesan serentak

  1. Swoole

Swoole ialah sambungan yang ditulis dalam C, yang menyediakan rangka kerja pengaturcaraan rangkaian berprestasi tinggi, tak segerak, yang boleh membantu kami melaksanakan konkurensi asas dalam perjanjian dengan cepat dengan. Swoole menyokong protokol TCP/UDP/Unix Socket asynchronous, pelayan HTTP/WebSocket, serta MySQL asynchronous, Redis, pertanyaan DNS dan fungsi lain.

Berikut ialah contoh pelayan HTTP mudah yang dilaksanakan menggunakan Swoole:

<?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 ialah rangka kerja pengaturcaraan tak segerak berdasarkan PHP, yang menyediakan satu set coroutine dan asynchronous non-blocking API untuk membantu kami API IO melaksanakan pemprosesan konkurensi peringkat rendah. Amp menyokong protokol TCP/UDP/Unix Socket tak segerak, klien HTTP/HTTPS, pelayan, dan MySQL tak segerak, PostgreSQL, Redis, Memcached dan fungsi lain.

Berikut ialah contoh pelayan HTTP mudah yang dilaksanakan menggunakan Amp:

<?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 Contoh kod berbilang proses/berbilang benang

Menggunakan sambungan PCNTL boleh melaksanakan pengaturcaraan berbilang proses dalam PHP dengan sangat mudah ialah berbilang proses yang mudah Contoh:

<?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;
    }
}

Menggunakan sambungan pthreads boleh dengan mudah melaksanakan pengaturcaraan berbilang benang dalam PHP Berikut ialah contoh berbilang benang mudah:

<?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();
}

Di atas adalah dua proses berbilang peringkat rendah yang biasa digunakan. kaedah pengaturcaraan berbilang benang Sudah tentu, anda juga boleh menggunakan kaedah yang lebih Lanjutan, seperti menggunakan rangka kerja pihak ketiga seperti ReactPHP dan Workerman. Dalam aplikasi sebenar, adalah perlu untuk memilih penyelesaian yang sesuai berdasarkan senario perniagaan dan keperluan untuk mencapai pemprosesan serentak asas PHP.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan pemprosesan konkurensi asas dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn