Rumah >pembangunan bahagian belakang >tutorial php >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
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();
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!