Rumah > pembangunan bahagian belakang > tutorial php > Concurrency dan Paralelisme dalam PHP

Concurrency dan Paralelisme dalam PHP

WBOY
Lepaskan: 2024-07-17 08:08:58
asal
462 orang telah melayarinya

Concurrency and Parallelism in PHP

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.

Model Pelaksanaan Standard PHP

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:

  1. Apache menerima permintaan HTTP dan memajukannya ke PHP.
  2. PHP melaksanakan skrip dari awal hingga akhir dalam satu urutan.
  3. PHP mengembalikan output kepada Apache, yang kemudiannya menghantar respons kembali kepada klien.

Model ini memastikan kesederhanaan dan kemudahan pemahaman tetapi boleh menjadi tidak cekap untuk tugasan yang memerlukan pelaksanaan selari atau mengendalikan berbilang tugas secara serentak.

Evolusi Concurrency dan Paralelisme dalam PHP

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.

1. Kod Segerak

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();
Salin selepas log masuk

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.

2. Mencabang Proses

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();
Salin selepas log masuk

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.

3. Pengulangan

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();
Salin selepas log masuk

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.

4. Penjana

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";
}
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan