Dalam pengaturcaraan PHP, kadangkala anda perlu melakukan beberapa operasi yang memakan masa, seperti membuat permintaan rangkaian, membaca dan menulis fail, dsb. Jika penyegerakan tradisional digunakan, program akan menunggu sehingga operasi selesai dan hasilnya dikembalikan. Ini akan menyebabkan program tidak dapat melakukan perkara lain semasa menunggu, sekali gus mengurangkan kecekapan program.
Jika anda menggunakan kaedah tak segerak, anda boleh membiarkan program terus melaksanakan tugas lain sementara menunggu operasi selesai. Ringkasnya, ini bermaksud untuk melaksanakan secara langsung kod lain tanpa menunggu hasil pulangan operasi, dan kemudian kembali untuk memproses hasil pulangan selepas operasi selesai. Pendekatan ini sangat meningkatkan kecekapan dan keselarasan program.
Dalam PHP, kaedah tak segerak biasanya dilaksanakan menggunakan berbilang proses atau berbilang benang. Walau bagaimanapun, kaedah ini adalah kompleks, mudah ralat, dan biasanya memerlukan penggunaan perpustakaan atau sambungan pihak ketiga. Selepas PHP 7.2, rangka kerja pengaturcaraan tak segerak baharu-Swoole telah diperkenalkan, yang menyediakan set lengkap penyelesaian pengaturcaraan tak segerak dan boleh digunakan dengan baik dengan kod asli PHP dan perpustakaan pihak ketiga.
Swoole menyediakan pelbagai kaedah pengaturcaraan tak segerak, termasuk coroutine, IO tidak menyekat tak segerak, pelbagai proses tak segerak, dsb. Kaedah yang paling biasa digunakan ialah coroutine, yang boleh melaksanakan pengaturcaraan tak segerak dalam satu utas dan mempunyai kelebihan kecekapan yang ringan dan tinggi.
Di bawah ini kami menggunakan contoh mudah untuk memperkenalkan cara menggunakan Swoole untuk melaksanakan pelaksanaan tak segerak PHP.
Pertama, kita perlu memasang sambungan Swoole. Anda boleh menggunakan arahan berikut untuk memasang:
pecl install swoole
Selepas pemasangan selesai, anda perlu menambah konfigurasi berikut pada fail php.ini:
extension=swoole
Seterusnya, mari lihat contoh mudah. Kita perlu melakukan operasi yang sangat memakan masa - tidur selama 5 saat dan kemudian kembali ke masa semasa. Operasi ini mengambil masa 5 saat dalam mod penyegerakan tradisional. Dalam mod tak segerak menggunakan Swoole, kami boleh menyerahkan operasi ini ke kumpulan tugas tak segerak Swoole dan kemudian kembali serta-merta. Selepas operasi selesai, Swoole akan secara automatik memanggil fungsi panggil balik yang kami tentukan dan mengembalikan hasil operasi.
<?php /* 创建Swoole的异步任务池 */ $pool = new Swoole\Process\Pool(4); /* 添加异步任务 */ $pool->on("WorkerStart", function($pool, $workerId) { /* 启动5个不同的异步任务 */ for ($i = 0; $i < 5; $i++) { /* 异步执行一个耗时5秒的任务 */ $pool->add(function() { sleep(5); return date("Y-m-d H:i:s"); }); } }); /* 处理异步任务完成的回调函数 */ $pool->on("WorkerStop", function($pool, $workerId) { /* 获取执行结果,并输出到控制台 */ $results = $pool->getResults(); foreach ($results as $result) { echo "{$result}\n"; } }); $pool->start();
Dalam kod di atas, kami mencipta kumpulan tugas tak segerak yang mengandungi 4 sub-proses. Kemudian dalam fungsi panggil balik acara WorkerStart, kami menyerahkan 5 tugas tak segerak yang berbeza dan menentukan fungsi panggil balik tanpa nama sebagai fungsi panggil balik selepas tugasan selesai. Fungsi panggil balik ini menerima senarai objek hasil dan mencetak nilai setiap objek hasil ke konsol.
Akhir sekali, panggil kaedah mula Swoole untuk memulakan kumpulan tugas tak segerak. Apabila semua tugas tak segerak selesai, Swoole akan secara automatik memanggil fungsi panggil balik yang kami tentukan dan mengembalikan hasil operasi. Keputusan pelaksanaan adalah seperti berikut:
2021-06-10 21:20:18 2021-06-10 21:20:18 2021-06-10 21:20:18 2021-06-10 21:20:18 2021-06-10 21:20:18
Ringkasnya, menggunakan kaedah pengaturcaraan tak segerak Swoole boleh meningkatkan kecekapan dan keselarasan program PHP dengan ketara. Menggunakan Swoole untuk menulis program tak segerak membolehkan kami menumpukan lebih pada pemprosesan logik perniagaan tanpa memberi terlalu banyak perhatian kepada butiran pelaksanaan asas.
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan PHP secara tidak segerak tanpa menunggu pemulangan dan melaksanakan kod secara langsung. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!