Apabila PHP 8.1 memperkenalkan Fibers, ramai pembangun tertanya-tanya sama ada ia adalah penyelesaian kepada pengehadan PHP yang telah lama wujud sebagai bahasa berutas tunggal dan segerak. Bolehkah Fibers menjadikan PHP tidak segerak, seperti JavaScript dengan gelung acaranya atau Node.js? Jawapannya adalah halus: Fibers tidak memberikan pelaksanaan tak segerak yang sebenar, tetapi ia adalah alat yang berkuasa untuk mengurus tugas dengan lebih cekap. Mari teroka konsep ini secara terperinci.
Fibers ialah mekanisme untuk melaksanakan multitasking koperasi dalam PHP. Mereka membenarkan anda menjeda dan menyambung semula bahagian kod tertentu tanpa menyekat keseluruhan proses PHP. Fikirkan Fiber sebagai fungsi khusus yang boleh "menghasilkan" kawalan kembali ke program utama dan kemudian meneruskan pelaksanaan dari tempat ia berhenti apabila diminta.
Apabila Fiber dijeda menggunakan Fiber::suspend(), kawalan kembali kepada skrip PHP utama. Ini bermakna:
Contohnya:
$fiber = new Fiber(function () { echo "Fiber started\n"; Fiber::suspend(); echo "Fiber resumed\n"; }); echo "Before Fiber\n"; $fiber->start(); echo "After Fiber Start\n"; $fiber->resume(); echo "After Fiber Resume\n"; Output:
Before Fiber Fiber started After Fiber Start Fiber resumed After Fiber Resume
Berikut ialah perkara yang berlaku:
Ya, tetapi hanya sementara. Apabila anda memanggil Fiber::resume(), Fiber berjalan serentak dalam proses PHP utama. Pada masa ini:
$fiber = new Fiber(function () { echo "Processing Fiber...\n"; sleep(2); // Simulates a blocking task echo "Fiber Done\n"; }); echo "Before Fiber\n"; $fiber->start(); echo "Between Fiber Start and Resume\n"; $fiber->resume(); echo "After Fiber\n"; Output:
Before Fiber Processing Fiber... Fiber Done Between Fiber Start and Resume After Fiber
Di sini, Fiber menyekat proses utama semasa panggilan tidur(2). Jadi, walaupun Fibers menyediakan cara untuk menstruktur kod untuk kecekapan, ia tidak secara ajaib mendayakan pelaksanaan selari atau benar-benar tak segerak.
Istilah "tidak menyekat" merujuk kepada cara Fibers mendayakan pengurusan tugas yang lebih baik, bukan pelaksanaan selari. A Fiber tidak menyekat proses utama semasa ia dijeda; sebaliknya, kawalan diserahkan semula kepada skrip utama atau gelung acara.
Ini amat berguna untuk perpustakaan atau rangka kerja yang menggunakan seni bina dipacu peristiwa, seperti ReactPHP atau Amp, di mana:
Bayangkan anda seorang chef yang menyediakan pelbagai hidangan:
Anda mula memasak hidangan tetapi berhenti sebentar untuk menunggu sesuatu mendidih.
Sambil menunggu, anda mula menyediakan hidangan lain.
Apabila hidangan pertama sudah siap, anda kembali kepadanya dan teruskan memasak.
Begitu juga, Fibers membenarkan PHP untuk "menjeda" tugasan dan kembali kepadanya kemudian tanpa menangguhkan keseluruhan proses.
Tidak seperti pengaturcaraan tak segerak dalam JavaScript atau Node.js, di mana tugas boleh dijalankan selari menggunakan benang atau gelung peristiwa, Fibers:
Dalam erti kata lain:
Gentian tidak memperkenalkan selari (tugas masih berjalan satu demi satu).
Ia adalah alat untuk mengurus dan menstruktur kod tidak menyekat dengan lebih cekap.
Walaupun PHP Fibers tidak menjadikan PHP benar-benar tak segerak, ia merupakan tambahan yang hebat kepada bahasa.
Atas ialah kandungan terperinci Apakah PHP Fiber? Adakah PHP Fiber Benar-benar Memberi Anda Pelaksanaan Asynchronous?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!