PHP Academy · Pelajaran

Model Keserentakan PHP

Fahami I/O menyekat dan perkara yang dibantu oleh operasi tak segerak.

Pelajaran 1 daripada 413 langkah

Model Keserentakan PHP ialah pelajaran PHP Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran PHP Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.

PHP Bersifat Segerak Secara Lalai

PHP klasik menjalankan satu permintaan bagi setiap proses, dari atas ke bawah, dengan I/O menyekat. Panggilan file_get_contents() kepada API yang perlahan membekukan keseluruhan skrip sehingga bait tiba. Model tanpa perkongsian (proses baharu bagi setiap permintaan, dengan keadaan dimusnahkan pada penghujungnya) amat mudah — tetapi ini bermakna satu pekerja hanya boleh melakukan satu perkara pada satu-satu masa. Pelajaran ini memetakan keadaan yang menimbulkan masalah dan keadaan yang dapat dibantu oleh operasi tak segerak.

I/O Menyekat, Diukur

Perhatikan masa jam sebenar yang didominasi oleh penantian, bukannya pengiraan. Tiga permintaan berjujukan yang masing-masing mengambil masa 1 saat memerlukan kira-kira 3 saat walaupun CPU melahu sepanjang masa.

<?php
$start = microtime(true);
foreach (['a', 'b', 'c'] as $job) {
    usleep(1_000_000); // simulate a 1s blocking network call
    echo "done $job\n";
}
printf("elapsed: %.2fs\n", microtime(true) - $start); // ~3.00s

Terikat CPU berbanding Terikat I/O

Keserentakan hanya membantu kerja yang terikat I/O — masa yang dihabiskan untuk menunggu rangkaian, cakera atau pangkalan data. Bagi kerja yang terikat CPU (pencincangan, penskalaan semula imej, penghuraian), satu benang sudah pun digunakan sepenuhnya; operasi tak segerak hanya menambah overhed penjadualan. Buat diagnosis terlebih dahulu:

  • Banyak panggilan HTTP atau pertanyaan pangkalan data yang perlahan → operasi tak segerak memberikan manfaat besar.
  • Gelung angka yang padat → gunakan pemprosesan selari (proses/benang), bukannya gelung peristiwa.

Cara PHP Berkembang Setakat Ini

Dari segi sejarah, PHP berkembang melalui keserentakan pada tahap proses: PHP-FPM mengekalkan kumpulan proses pekerja; setiap proses mengendalikan satu permintaan pada satu-satu masa, manakala OS menggandakan proses tersebut. Ini ialah keserentakan sebenar merentas permintaan, tetapi tidak memberikan apa-apa dalam satu permintaan — anda masih tidak boleh mengagihkan 50 panggilan API secara selari dalam satu pengendali menggunakan kod biasa yang menyekat.

Idea Gelung Peristiwa

PHP tak segerak memperkenalkan gelung peristiwa: satu utas yang mendaftarkan operasi input/output sebagai tidak menyekat, kemudian tidur dalam stream_select()/epoll sehingga mana-mana daripadanya bersedia, lalu menjalankan fungsi panggil balik apabila data tiba. Satu utas mengurus ribuan soket kerana ia tidak pernah terbiar menunggu satu soket sahaja.

<?php
// Conceptual loop: poll many non-blocking streams at once
$streams = openManyNonBlockingSockets();
while ($streams) {
    $read = $streams; $write = $except = [];
    stream_select($read, $write, $except, null); // sleeps until ANY is ready
    foreach ($read as $s) {
        handleReadyStream($s); // runs only the sockets that have data now
    }
}

Koperatif, Bukan Preemptif

PHP tak segerak bersifat koperatif: tugas berjalan sehingga ia menyerahkan kawalan secara sukarela pada titik input/output. Tiada pengambilalihan paksa, jadi panggilan panjang yang menyekat atau gelung CPU yang ketat menghentikan seluruh gelung — semua tugas lain tidak mendapat giliran. Peraturan utama: jangan sekali-kali memanggil fungsi yang menyekat (sleep, PDO yang menyekat, file_get_contents) dalam tugas gelung peristiwa. Gunakan padanan tak segerak gelung.

Tiga Pendekatan dalam PHP

PHP moden menawarkan kit alat berlapis:

  • Fiber (PHP 8.1, teras) — primitif aras rendah untuk menjeda dan meneruskan tindanan panggilan. Blok binaan, bukan kerangka kerja lengkap.
  • ReactPHP / Amp — gelung peristiwa ruang pengguna yang dibina berasaskan strim (dan kini Fiber) untuk input/output tidak menyekat tanpa sambungan.
  • Swoole / OpenSwoole — sambungan C yang menyediakan korutin, pelayan berprestasi tinggi dan panggilan menyekat yang dipintas.

Kesan perkara yang tersedia pada masa jalan sebelum memilih strategi.

<?php
echo 'Fibers: ' . (class_exists('Fiber') ? 'yes' : 'no'), PHP_EOL;
echo 'Swoole ext: ' . (extension_loaded('swoole') ? 'yes' : 'no'), PHP_EOL;
echo 'parallel ext: ' . (extension_loaded('parallel') ? 'yes' : 'no'), PHP_EOL;
echo 'PHP ' . PHP_VERSION, PHP_EOL;

Janji Memodelkan Nilai Masa Hadapan

Sebelum Fiber, PHP tak segerak mendedahkan hasil tertangguh sebagai janji: ruang letak bagi nilai yang akan diselesaikan kemudian. Anda melampirkan fungsi panggil balik melalui then(). Ia berfungsi, tetapi menghasilkan rantaian bersarang; Fiber membolehkan pustaka menyembunyikan perkara ini di sebalik await yang kelihatan segerak.

<?php
use React\Promise\Promise;

$promise = new Promise(function ($resolve) {
    // resolved later when I/O completes
    $resolve(42);
});
$promise->then(function ($value) {
    echo "got $value\n";
});

Keserentakan berbanding Pemprosesan Selari

Bersikap tepat:

  • Keserentakan — banyak tugas sedang berjalan, diselang-seli pada satu utas (gelung peristiwa). Sangat sesuai untuk input/output.
  • Pemprosesan selari — banyak tugas dilaksanakan serentak pada berbilang teras (proses, sambungan parallel, pekerja tugas Swoole). Diperlukan untuk kerja CPU.

Gelung peristiwa memberikan keserentakan, bukan pemprosesan selari. Petikan kod di bawah menunjukkan pemprosesan selari pada peringkat proses dengan proc_open — tiga pekerja berjalan serentak dalam proses OS yang berasingan.

<?php
$procs = [];
foreach (range(1, 3) as $i) {
    // Each worker is a separate OS process -> real parallelism
    $procs[] = proc_open(
        "php -r 'usleep(500000); echo \"worker $i done\\n\";'",
        [1 => ['pipe', 'w']], $pipes
    );
}
foreach ($procs as $p) { proc_close($p); }
echo "all workers launched in parallel\n";

Bila NOT Perlu Memilih Tak Segerak

Tak segerak mempunyai kos: pekerja yang berjalan lama bermakna PHP tidak lagi memadam keadaan antara permintaan, jadi kebocoran memori, cache statik dan sambungan yang lapuk menjadi tanggungjawab anda. Jika pengendali permintaan membuat satu pertanyaan pangkalan data lalu kembali, PHP-FPM lebih mudah dan sama pantas. Pilih tak segerak apabila anda memerlukan pengagihan input/output, WebSockets/tinjauan panjang, penstriman atau pelayan berterusan.

Pemprosesan Selari Sebenar: ext-parallel dan Proses

Untuk pengagihan kerja yang terikat pada CPU, PHP boleh menjalankan pemprosesan selari sebenar pada peringkat OS. Sambungan parallel menghasilkan utas pekerja dengan memori yang diasingkan; sebagai alternatif, proc_open/pcntl_fork menghasilkan proses. Tidak seperti gelung peristiwa, semua ini menggunakan berbilang teras serentak — alat yang tepat apabila kesesakan ialah pengiraan, bukan menunggu.

<?php
// Requires ext-parallel — runs tasks on separate threads/cores
use parallel\Runtime;

$runtime = new Runtime();
$future = $runtime->run(function (): int {
    $sum = 0;
    for ($i = 0; $i < 1_000_000; $i++) $sum += $i; // CPU work on another core
    return $sum;
});
echo $future->value(), PHP_EOL;

Semakan Pantas

Apakah yang berlaku jika anda memanggil sleep(2) yang menyekat dalam tugas gelung peristiwa?

Kesimpulan

Anda kini mempunyai model pemikiran tentang keserentakan PHP:

  • PHP lalai adalah segerak, menyekat dan tanpa perkongsian keadaan; FPM meningkatkan skala merentasi permintaan, bukan dalam satu permintaan.
  • Tak segerak membantu kerja yang terikat pada input/output melalui gelung peristiwa satu utas menggunakan strim yang tidak menyekat.
  • Model ini koperatif — jangan sekali-kali menyekat gelung; kerja CPU yang panjang memerlukan pemprosesan selari, bukan keserentakan.
  • Kit alat PHP: Fiber (primitif), ReactPHP/Amp (gelung ruang pengguna + janji), Swoole (sambungan korutin).
Percuma untuk bermula

Pelajari PHP dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
49
Pelajaran
195

Soalan Lazim

Adakah pelajaran “Model Keserentakan PHP” percuma?

Ya — teks penuh “Model Keserentakan PHP” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus PHP Academy, tingkat taraf kepada CoddyKit PRO. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Model Keserentakan PHP”?

Fahami I/O menyekat dan perkara yang dibantu oleh operasi tak segerak. Anda berlatih PHP Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan PHP Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran PHP Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Model Keserentakan PHP” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran PHP Academy ini?

Ya. Setiap pelajaran PHP Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Model Keserentakan PHP
  2. Fiber PHP 8.1
  3. Gelung Peristiwa dengan ReactPHP
  4. Pelayan Berprestasi Tinggi dengan Swoole
← Kembali ke PHP Academy