Dengan perkembangan Internet, semakin banyak laman web perlu membawa sejumlah besar permintaan akses pengguna. Apabila berhadapan dengan konkurensi yang tinggi, pelayan satu proses akan cepat mencapai kesesakan, menyebabkan pengguna tidak dapat mengakses tapak web seperti biasa. Oleh itu, pelbagai proses telah menjadi salah satu penyelesaian yang berkesan untuk menyelesaikan masalah konkurensi yang tinggi. Artikel ini akan memperkenalkan teknologi berbilang proses dalam PHP untuk meningkatkan keupayaan program untuk mengendalikan permintaan serentak sambil memastikan kualiti program.
1. Pengenalan kepada pelbagai proses
Dalam sains komputer, proses merujuk kepada contoh program yang melaksanakan. Setiap proses mempunyai ruang memori dan sumber sistem sendiri. Multiprocessing merujuk kepada mencipta pelbagai proses dalam satu program. Setiap proses dilaksanakan secara bebas, mempunyai nombor proses dan blok kawalan prosesnya sendiri, dan tidak mengganggu satu sama lain. Teknologi pelbagai proses digunakan secara meluas dalam perisian pelayan, sistem pengendalian dan bidang lain.
2. Pelbagai proses dalam PHP
Untuk melaksanakan pelbagai proses dalam PHP, anda boleh menggunakan sambungan pcntl atau sambungan posix. Kedua-dua sambungan menyediakan fungsi seperti penciptaan proses, komunikasi antara proses, pengendalian isyarat, dsb.
sambungan pcntl ialah perpustakaan fungsi kawalan proses PHP, yang menyediakan banyak fungsi untuk mencipta, mengendalikan dan mengurus proses. Menggunakan perpustakaan fungsi pcntl untuk melaksanakan berbilang proses boleh mengawal perhubungan ibu bapa-anak, penghantaran isyarat, perkongsian sumber, dsb. proses dengan mudah.
sambungan posix juga menyediakan kawalan proses, pemprosesan isyarat dan fungsi lain, yang merupakan tambahan kepada sambungan pcntl. Ia juga menyediakan lebih banyak fungsi sistem, seperti operasi fail, pertanyaan maklumat sistem, dsb.
Buat proses anak dalam PHP dengan menggunakan fungsi pcntl_fork(). Nilai pulangan fungsi fork() adalah berbeza, yang boleh membezakan proses induk dan proses anak, dengan itu menyedari perbezaan antara proses ibu bapa dan anak.
$pid = pcntl_fork(); // 创建子进程 if ($pid == -1) { die('fork failed'); } elseif ($pid == 0) { // 子进程 // 子进程代码 } else { // 父进程 // 父进程代码 }
Selepas fungsi fork() dipanggil, sistem pengendalian akan mencipta proses anak baharu Pada masa ini, proses utama boleh terus dilaksanakan dan proses anak akan mula dilaksanakan selepas fungsi fork(). . Pid proses anak ialah 0, dan pid proses induk ialah nilai pid proses anak. Selepas mencipta subproses, kami boleh melakukan beberapa operasi yang memakan masa dalam subproses, atau melaksanakan beberapa tugas secara selari, dengan itu meningkatkan prestasi konkurensi keseluruhan sistem pemprosesan.
Selepas proses anak selesai pelaksanaan, kita perlu mendapatkan status keluarnya. Dalam fungsi pcntl_waitpid(), parameter pertama ialah nombor proses yang menunggu proses anak tamat, dan parameter kedua ialah lokasi di mana status keluar proses anak disimpan. Apabila nilai pulangan adalah positif, ini bermakna proses anak telah keluar, jika tidak, ia bermakna ia terganggu oleh isyarat semasa menunggu.
$pid = pcntl_fork(); if ($pid == -1) { die('fork failed'); } elseif ($pid == 0) { // 子进程 exit(0); // 子进程退出状态为0 } else { // 父进程 pcntl_waitpid($pid, $status); // 等待子进程退出 echo $status; // 输出子进程退出状态 }
3. Kes Praktikal
Yang berikut menggunakan kes praktikal yang mudah untuk menggambarkan cara menggunakan teknologi berbilang proses dalam PHP.
Laksanakan skrip untuk mendapatkan kandungan berbilang URL, dapatkan kandungan URL secara serentak dengan mencipta berbilang sub-proses dan simpan kandungannya ke pangkalan data selepas pemerolehan berjaya.
<?php // 需要获取的URL列表 $urlList = [ 'https://www.baidu.com/', 'https://www.qq.com/', 'https://www.sina.com.cn/', 'https://www.163.com/', 'https://www.taobao.com/' ]; // 创建多个子进程并行获取URL内容 foreach ($urlList as $url) { $pid = pcntl_fork(); if ($pid == -1) { die('fork failed'); } elseif ($pid == 0) { // 子进程 $content = file_get_contents($url); // 获取URL内容 // 保存内容到数据库 $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', ''); $stmt = $pdo->prepare("INSERT INTO url_content(url, content) VALUES(?, ?)"); $stmt->execute([$url, $content]); exit(0); } } // 等待所有子进程执行完毕 while (pcntl_waitpid(0, $status) != -1) { // do nothing } echo 'All child processes have terminated' . PHP_EOL;
Dalam kod di atas, kami merentasi $urllist melalui foreach dan mencipta berbilang sub-proses untuk mendapatkan kandungan URL secara selari. Selepas mendapatkan kandungan URL melalui fungsi file_get_contents(), kami menyimpan kandungan tersebut ke pangkalan data. Dalam proses induk, tunggu proses anak menyelesaikan pelaksanaan melalui fungsi while dan pcntl_waitpid().
4. Nota
Apabila menggunakan teknologi pelbagai proses, anda perlu memberi perhatian kepada perkara berikut:
5 Ringkasan
Aplikasi teknologi berbilang proses dalam PHP boleh meningkatkan keupayaan program untuk mengendalikan permintaan serentak dengan berkesan. Melalui teknologi berbilang proses, pelbagai tugas boleh diproses secara selari, meningkatkan kelajuan tindak balas dan keselarasan sistem. Di atas premis memastikan kualiti program, teknologi pelbagai proses menyediakan kami penyelesaian yang cekap dan mudah.
Atas ialah kandungan terperinci Pelbagai proses dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!