Rumah >pembangunan bahagian belakang >tutorial php >Pengenalan ke dalam gelung acara di PHP
PHP Event Loop: Senjata untuk Pengaturcaraan Asynchronous
mata teras
pemaju php sentiasa menunggu sesuatu. Kadang -kadang kita menunggu permintaan untuk perkhidmatan jauh. Kadang -kadang kita menunggu pangkalan data untuk mengembalikan baris dari pertanyaan kompleks. Bukankah itu hebat jika kita dapat melakukan operasi lain dalam semua tempoh menunggu?
Jika anda telah menulis beberapa kod JS, anda mungkin sudah biasa dengan panggilan balik dan acara DOM. Walaupun kami juga mempunyai panggilan balik dalam PHP, mereka tidak berfungsi dengan cara yang sama. Ini adalah terima kasih kepada ciri yang dipanggil Event Loop.
Kami akan memahami bagaimana gelung acara berfungsi dan cara menggunakan gelung acara di PHP.
Kami akan melihat beberapa perpustakaan PHP yang menarik. Sesetengah orang percaya bahawa perpustakaan ini tidak cukup stabil untuk digunakan dalam persekitaran pengeluaran. Sesetengah orang berfikir contoh yang disediakan di sini adalah "lebih baik dilaksanakan dalam bahasa yang lebih matang". Terdapat banyak sebab yang baik untuk mencuba kaedah ini. Terdapat juga sebab yang baik untuk mengelakkan kaedah ini dalam persekitaran pengeluaran. Tujuan artikel ini adalah untuk menyerlahkan kemungkinan dalam PHP.
Untuk memahami gelung acara, mari kita lihat bagaimana mereka bekerja di penyemak imbas. Lihat contoh ini:
<code class="language-javascript">function fitToScreen(selector) { var element = document.querySelector(selector); var width = element.offsetWidth; var height = element.offsetHeight; var top = "-" + (height / 2) + "px"; var left = "-" + (width / 2) + "px"; var ratio = getRatio(width, height); setStyles(element, { "position": "absolute", "left": "50%", "top": "50%", "margin": top + " 0 0 " + left, "transform": "scale(" + ratio + ", " + ratio + ")" }); } function getRatio(width, height) { return Math.min( document.body.offsetWidth / width, document.body.offsetHeight / height ); } function setStyles(element, styles) { for (var key in styles) { if (element.style.hasOwnProperty(key)) { element.style[key] = styles[key]; } } } fitToScreen(".welcome-screen");</code>
Kod ini tidak memerlukan perpustakaan tambahan. Ia berfungsi dalam mana -mana penyemak imbas yang menyokong penukaran zum CSS. Versi Chrome terkini sudah cukup. Hanya pastikan pemilih CSS sepadan dengan unsur -unsur dalam dokumen.
Fungsi ini menerima pemilih dan pusat CSS dan skala unsur -unsur yang sesuai dengan skrin. Apa yang berlaku jika kita membuang kesilapan dalam gelung untuk? Kami akan melihat sesuatu seperti ini ...
Menggunakan WebAPIS penyemak imbas seperti SetTimeout dan AddEventListener, kita boleh mengimbangi kerja selari dengan benang yang berbeza. Apabila peristiwa ini berlaku, penyemak imbas menambah panggilan balik ke giliran panggil balik. Apabila timbunan kosong pada masa akan datang, penyemak imbas mengambil panggilan balik dari giliran panggil balik dan melaksanakannya.
Proses ini membersihkan timbunan dan kemudian memanggil giliran kembali adalah gelung acara.
kehidupan tanpa gelung acara
<code class="language-javascript">function fitToScreen(selector) { var element = document.querySelector(selector); var width = element.offsetWidth; var height = element.offsetHeight; var top = "-" + (height / 2) + "px"; var left = "-" + (width / 2) + "px"; var ratio = getRatio(width, height); setStyles(element, { "position": "absolute", "left": "50%", "top": "50%", "margin": top + " 0 0 " + left, "transform": "scale(" + ratio + ", " + ratio + ")" }); } function getRatio(width, height) { return Math.min( document.body.offsetWidth / width, document.body.offsetHeight / height ); } function setStyles(element, styles) { for (var key in styles) { if (element.style.hasOwnProperty(key)) { element.style[key] = styles[key]; } } } fitToScreen(".welcome-screen");</code>Apabila kita menjalankan kod ini, kita lihat di luar waktu tamat dalam konsol, dan kemudian di dalam waktu tamat. Fungsi SetTimeout adalah sebahagian daripada WebAPI yang disediakan oleh penyemak imbas. Selepas 1 milisaat telah berlalu, mereka menambah panggilan balik ke giliran panggil balik.
Console.log kedua dilakukan sebelum konsol.log dari dalam setTimeout bermula. Kami tidak mempunyai apa -apa seperti setTimeout dalam php standard, tetapi jika kita perlu mensimulasikannya:
<code class="language-javascript">setTimeout(function() { console.log("inside the timeout"); }, 1); console.log("outside the timeout");</code>Apabila kita menjalankannya, kita lihat di dalam waktu tamat, kemudian di luar waktu tamat. Ini kerana kita perlu menggunakan gelung tak terhingga dalam fungsi setTimeout untuk melaksanakan panggilan balik selepas kelewatan.
Ia boleh menggoda untuk bergerak semasa gelung di luar setTimeout dan memasukkan semua kod di dalamnya. Ini mungkin membuat kod kami berasa kurang disekat, tetapi pada satu ketika, kami akan sentiasa disekat oleh gelung itu. Pada satu ketika, kita akan melihat bahawa kita hanya boleh melakukan satu perkara dalam satu benang pada satu masa.
Walaupun tidak ada yang seperti setTimeout dalam PHP standard, terdapat cara yang tidak jelas untuk melaksanakan kod yang tidak menyekat selari dengan gelung acara. Kita boleh menggunakan fungsi seperti stream_select untuk membuat rangkaian iOS yang tidak menyekat. Kita boleh menggunakan sambungan C seperti EIO untuk membuat kod sistem fail yang tidak menyekat. Mari kita lihat perpustakaan yang dibina di atas kaedah yang tidak jelas ini ...
icicle
<code class="language-php">function setTimeout(callable $callback, $delay) { $now = microtime(true); while (true) { if (microtime(true) - $now > $delay) { $callback(); return; } } } setTimeout(function() { print "inside the timeout"; }, 1); print "outside the timeout";</code>
Ini menggunakan versi icicleicio/icicle 0.8.0
pelaksanaan gelung acara icicle adalah hebat. Ia juga mempunyai banyak ciri yang mengagumkan; seperti janji, soket, dan pelaksanaan pelayan.icicle juga menggunakan penjana sebagai coroutine. Penjana dan coroutine adalah topik yang berbeza, tetapi kod yang mereka benarkan cantik:
<code class="language-php">use Icicle\Loop; Loop\timer(0.1, function() { print "inside timer"; }); print "outside timer"; Loop\run();</code>
Ini menggunakan versi ICILLEIO/DNS 0.5.0 Penjana untuk membuat kod asynchronous menulis yang serupa dengan kod segerak yang lebih mudah. Apabila digabungkan dengan janji dan gelung acara, mereka menghasilkan kod yang tidak menyekat yang sangat baik seperti ini!
ReactPhp mempunyai pelaksanaan gelung acara yang sama, tetapi tanpa semua kandungan penjana yang menarik:
<code class="language-javascript">function fitToScreen(selector) { var element = document.querySelector(selector); var width = element.offsetWidth; var height = element.offsetHeight; var top = "-" + (height / 2) + "px"; var left = "-" + (width / 2) + "px"; var ratio = getRatio(width, height); setStyles(element, { "position": "absolute", "left": "50%", "top": "50%", "margin": top + " 0 0 " + left, "transform": "scale(" + ratio + ", " + ratio + ")" }); } function getRatio(width, height) { return Math.min( document.body.offsetWidth / width, document.body.offsetHeight / height ); } function setStyles(element, styles) { for (var key in styles) { if (element.style.hasOwnProperty(key)) { element.style[key] = styles[key]; } } } fitToScreen(".welcome-screen");</code>
Ini menggunakan versi React/Event-loop 0.4.1
ReactPhp lebih matang daripada icicle dan mempunyai pelbagai komponen yang lebih luas. Icicle masih jauh untuk bersaing dengan semua ciri -ciri yang ditawarkan ReactPhp. Walau bagaimanapun, pemaju membuat kemajuan yang baik!
Sukar untuk menghilangkan minda tunggal yang kami diajar. Jika kita mempunyai akses kepada API yang tidak menyekat dan gelung acara, kita tidak tahu berapa banyak kod yang boleh kita tulis.
Komuniti PHP perlu memahami seni bina ini. Kita perlu belajar dan bereksperimen dengan pelaksanaan asynchronous dan selari. Kita perlu mencuri konsep dan amalan terbaik dari bahasa lain yang mempunyai gelung acara selama bertahun -tahun sehingga "bagaimana menggunakan sumber sistem yang paling berkesan?"
Tinggal untuk pelaksanaan yang lebih praktikal mengenai icicle yang akan datang!
Gelung acara dalam PHP adalah struktur pengaturcaraan yang digunakan untuk menunggu peristiwa atau mesej dalam penjadual. Ia berfungsi dengan menjejaki setiap peristiwa aktif sebagai tindak balas kepada rangsangan luar dan menjadualkannya apabila mereka selesai. Ini amat berguna dalam PHP untuk mengendalikan operasi tak segerak, di mana anda ingin memulakan operasi dan kemudian terus memproses tanpa menunggu operasi selesai.
Pengaturcaraan PHP tradisional adalah segerak, yang bermaksud ia melakukan satu operasi pada satu masa, mengikut urutan yang ditulis, dan mesti menunggu setiap operasi selesai sebelum meneruskan operasi seterusnya. Sebaliknya, gelung acara membolehkan pengaturcaraan tak segerak. Ini bermakna tindakan itu boleh dimulakan dan kemudian ditahan sehingga hasilnya siap, di mana tindakan lain dapat dilakukan.
Melaksanakan gelung acara dalam aplikasi PHP anda melibatkan penggunaan perpustakaan yang menyediakan fungsi ini, seperti ReactPhp atau amp. Perpustakaan ini menyediakan antara muka dan kelas yang diperlukan untuk membuat dan mengurus gelung acara. Anda kemudian boleh menggunakan gelung acara ini untuk mengendalikan tugas -tugas yang tidak segerak dalam permohonan anda.
Menggunakan gelung acara di PHP dapat meningkatkan prestasi aplikasi dan respons. Ia membolehkan anda memproses pelbagai tugas secara serentak, bukannya secara berurutan, yang boleh membawa kepada penggunaan sumber yang lebih baik dan masa tindak balas yang lebih pendek. Ini amat berfaedah dalam aplikasi yang memerlukan pengendalian sejumlah besar sambungan serentak, seperti pelayan sembang atau suapan data masa nyata.
Walaupun gelung acara dapat memberikan manfaat prestasi yang signifikan, mereka juga dapat meningkatkan kerumitan permohonan. Mereka memerlukan gaya pengaturcaraan yang berbeza dan boleh membuat kod lebih sukar difahami dan debug. Selain itu, tidak semua tugas sesuai untuk pemprosesan tak segerak, dan beberapa tugas mungkin lebih sukar untuk dilaksanakan dalam gelung acara.
Ya, gelung acara boleh digunakan dengan kerangka PHP seperti Laravel atau Symfony, walaupun ini mungkin memerlukan beberapa konfigurasi tambahan. Kedua -dua kerangka ini direka untuk bekerja dengan kod PHP segerak, tetapi mereka boleh disesuaikan untuk bekerja dengan gelung acara untuk mengendalikan tugas -tugas yang tidak segerak.
Pengendalian ralat dalam gelung acara mungkin lebih rumit daripada pengendalian ralat dalam kod PHP yang disegerakkan. Oleh kerana tugas itu dilaksanakan secara tidak segerak, kesilapan itu tidak dapat ditangkap dengan segera. Sebaliknya, anda biasanya perlu menyediakan fungsi panggil balik yang akan dipanggil apabila ralat berlaku.
Ya, anda boleh menggunakan gelung acara dalam skrip PHP CLI (Command Line Interface). Malah, ini adalah kes penggunaan biasa untuk gelung acara, kerana skrip CLI sering memerlukan pelbagai tugas untuk dilaksanakan secara serentak.
Koleksi sampah PHP berfungsi secara bebas dari gelung acara. Walau bagaimanapun, kerana gelung acara mengekalkan rujukan kepada semua tugas aktif, tugas -tugas ini hanya akan dibuang sampah selepas selesai. Ini bermakna anda perlu berhati -hati untuk mengelakkan kebocoran memori dalam kod gelung acara.
Ya, anda boleh menggunakan gelung acara dengan pelayan terbina dalam PHP. Walau bagaimanapun, ingat bahawa pelayan terbina dalam tidak direka untuk tujuan pengeluaran dan mungkin tidak memberikan tahap prestasi atau kebolehpercayaan yang sama sebagai pelayan web yang berdedikasi.
Atas ialah kandungan terperinci Pengenalan ke dalam gelung acara di PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!