Konkurensi dan selari ialah konsep penting dalam pengaturcaraan moden, membolehkan aplikasi melaksanakan berbilang tugas secara serentak, sama ada melalui pelaksanaan berjalin (concurrency) atau pelaksanaan serentak (parallelisme). PHP, terutamanya dikenali dengan model pelaksanaan segerak, telah berkembang untuk menyokong paradigma ini melalui pelbagai teknik.
PHP secara tradisinya mengikuti model pelaksanaan segerak, terutamanya apabila digunakan dengan Apache dalam persediaan pelayan web biasa. Dalam model ini, setiap permintaan HTTP dikendalikan oleh satu proses PHP. Langkah-langkah yang terlibat dalam memproses permintaan termasuk:
Model ini memastikan kesederhanaan dan kemudahan pemahaman tetapi boleh menjadi tidak cekap untuk tugasan yang memerlukan pelaksanaan selari atau mengendalikan berbilang tugas secara serentak.
Apabila aplikasi web menjadi lebih kompleks, keperluan untuk pelaksanaan serentak dan selari dalam PHP semakin meningkat. Mari terokai teknik yang ditawarkan PHP untuk mencapai paradigma ini.
Kod segerak ialah bentuk pelaksanaan yang paling mudah di mana tugasan dilakukan satu demi satu.
echo "Synchronous Code Example:\n"; function synchronousFunction() { for ($i = 0; $i < 3; $i++) { echo "Synchronous Loop Iteration: $i\n"; sleep(1); } } synchronousFunction();
Dalam contoh ini, setiap lelaran gelung dilaksanakan secara berurutan, dengan kelewatan satu saat antara lelaran. Pendekatan ini mudah tetapi tidak cekap untuk tugasan terikat I/O atau intensif CPU yang boleh mendapat manfaat daripada pelaksanaan selari.
Forking mencipta proses baharu (anak) yang berjalan serentak dengan proses asal (induk). Ini berguna untuk menyelaraskan tugas.
echo "\nForking Process Example:\n"; function forkProcess() { $pid = pcntl_fork(); if ($pid == -1) { die('could not fork'); } else if ($pid) { echo "Parent Process: PID $pid\n"; pcntl_wait($status); // Protect against Zombie children } else { echo "Child Process: Hello from the child process!\n"; exit(0); } } forkProcess();
Dalam kod ini, pcntl_fork() mencipta proses anak. Proses ibu bapa dan anak dilaksanakan secara serentak, membolehkan pelaksanaan tugas selari. Proses induk menunggu proses anak selesai untuk mengelak daripada mencipta proses zombi.
Keupayaan penjalinan PHP tersedia melalui sambungan seperti pthread. Benang lebih ringan daripada proses dan berkongsi ruang memori yang sama, menjadikannya sesuai untuk tugasan yang memerlukan data dikongsi.
if (!class_exists('Thread')) { die("Threads are not supported in this PHP build\n"); } echo "\nThreading Example:\n"; class MyThread extends Thread { public function run() { for ($i = 0; $i < 3; $i++) { echo "Thread Loop Iteration: $i\n"; sleep(1); } } } $thread = new MyThread(); $thread->start(); $thread->join();
Contoh ini mentakrifkan kelas MyThread yang memanjangkan Thread. Kaedah larian dilaksanakan dalam utas baharu, berjalan serentak dengan utas utama. Pendekatan ini berguna untuk operasi terikat I/O di mana benang boleh mengendalikan menunggu sumber.
Penjana menyediakan cara untuk melaksanakan rutin bersama yang mudah, membenarkan fungsi menghasilkan hasil secara berulang tanpa menyekat keseluruhan program.
echo "\nGenerators Example:\n"; function simpleGenerator() { yield 'First'; yield 'Second'; yield 'Third'; } $gen = simpleGenerator(); foreach ($gen as $value) { echo "Generator Yielded: $value\n"; }
Penjana menggunakan kata kunci hasil untuk menghasilkan nilai satu demi satu, membenarkan fungsi dijeda dan disambung semula, memudahkan satu bentuk multitasking koperatif.
PHP telah melangkah jauh dari akar segeraknya untuk menyokong pelbagai bentuk konkurensi dan selari. Walaupun kod segerak kekal mudah dan berkesan untuk banyak kes penggunaan, teknik seperti proses forking, threading dan menggunakan penjana membuka kemungkinan baharu untuk mengendalikan tugas yang kompleks dan boleh selari dengan cekap.
Atas ialah kandungan terperinci Concurrency dan Paralelisme dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!