Dengan pembangunan berterusan teknologi Internet moden, bilangan lawatan tapak web semakin meningkat, yang juga mengemukakan keperluan yang lebih tinggi untuk keupayaan pemprosesan serentak pelayan. Bagaimana untuk meningkatkan keupayaan pemprosesan serentak pelayan adalah masalah yang perlu dihadapi oleh setiap pembangun. Dalam konteks ini, PHP8.0 memperkenalkan ciri baharu Fibers, membolehkan pembangun PHP menguasai cara baharu pemprosesan serentak.
Apakah itu Fibers?
Pertama, kita perlu faham apa itu Fiber. Gentian ialah benang ringan yang menyokong pemprosesan tak segerak kod PHP dengan cekap. Kod PHP tradisional adalah satu-benang dan tidak boleh benar-benar melaksanakan operasi tak segerak Ia selalunya perlu menunggu untuk menyelesaikan operasi I/O, mengakibatkan sekatan yang tidak perlu. Kemunculan Fibers menyelesaikan masalah ini, membenarkan kod PHP menyokong pemprosesan serentak seperti bahasa lain seperti Node.js.
Menggunakan Fibers untuk mencapai konkurensi
Mari kita bincangkan tentang cara menggunakan Fibers untuk mencapai konkurensi.
Dalam PHP8.0, Fibers dilaksanakan berdasarkan sambungan Swoole, jadi anda perlu memasang sambungan Swoole terlebih dahulu. Ia boleh dipasang melalui PECL:
pecl install swoole
Menggunakan Fiber untuk mencapai konkurensi memerlukan mencipta objek Fiber. Mencipta objek Fiber boleh dicapai dengan mencipta fungsi tanpa nama atau kaedah kelas. Contohnya:
$fiber = new SwooleFiber(function() { // 这里是并发要执行的代码 }); 或 class MyClass { public function onReceive($server, $fd, $reactor_id, $data) { // 这里是并发要执行的代码 } } $fiber = new SwooleFiber([$myClass, 'onReceive']);
Selepas mencipta objek Fiber, anda perlu memulakan Fiber. Anda boleh menggunakan kaedah start
atau kaedah suspend
untuk memulakan Fiber. Gunakan kaedah start
untuk segera memulakan Fiber dan laksanakan kod yang ditakrifkan dalam Fiber. Contohnya:
$fiber->start();
dan kaedah suspend
boleh menjeda pelaksanaan Fiber dan menunggu pelaksanaan seterusnya. Contohnya:
$fiber->suspend();
Dalam Fiber, gunakan fungsi swoole_fiber_switch
untuk menukar pelaksanaan Fiber. Contohnya:
function foo() { echo 'foo '; yield; echo 'bar '; yield; echo 'baz'; } $fiber1 = new SwooleFiber($foo); $fiber2 = new SwooleFiber($foo); $fiber1->start(); $fiber2->start(); while ($fiber1->getStatus() !== SwooleFiber::STATUS_DEAD || $fiber2->getStatus() !== SwooleFiber::STATUS_DEAD) { if ($fiber1->getStatus() !== SwooleFiber::STATUS_DEAD) { swoole_fiber_switch($fiber1); } if ($fiber2->getStatus() !== SwooleFiber::STATUS_DEAD) { swoole_fiber_switch($fiber2); } }
Dalam contoh di atas, kami mencipta dua objek Fiber dan biarkan ia dilaksanakan secara berselang-seli dan mengeluarkan foobarbaz
.
Selain menukar Fiber secara manual, sambungan Swoole juga menyediakan beberapa API coroutine untuk pemprosesan serentak yang mudah. Contohnya, gunakan kaedah Co::create
untuk mencipta objek coroutine dan gunakan Co::parallel
untuk membenarkan berbilang coroutine dilaksanakan secara selari. Contohnya:
$urls = [ 'http://example.com/foo', 'http://example.com/bar', 'http://example.com/baz', ]; $coros = []; foreach ($urls as $url) { $coros[] = Co::create(function() use ($url) { $html = file_get_contents($url); return strlen($html); }); } $results = Co::parallel($coros);
Dalam contoh di atas, kami mencipta tiga objek coroutine, masing-masing mengakses tiga URL dan akhirnya menggunakan kaedah Co::parallel
untuk melaksanakan ketiga-tiga coroutine ini secara selari, mendapatkan keputusan dan mengembalikannya.
Ringkasan
Fibers ialah ciri baharu yang diperkenalkan dalam PHP8.0, yang menggunakan sepenuhnya keupayaan pemprosesan serentak Swoole yang dilanjutkan. Menggunakan Fibers boleh melaksanakan pemprosesan tak segerak kod PHP dengan mudah dan meningkatkan keupayaan pemprosesan serentak pelayan. Sudah tentu, Fibers juga perlu digunakan dengan berhati-hati dan perhatian harus diberikan untuk mengelakkan persaingan sumber dan isu lain. Saya berharap pengenalan artikel ini dapat membantu pembangun PHP memahami Fibers dengan lebih baik dan melaksanakan pemprosesan serentak yang lebih baik.
Atas ialah kandungan terperinci Cara menggunakan Fibers untuk mencapai konkurensi dalam PHP8.0. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!