Pembangunan coroutine tak segerak PHP: Mempercepatkan caching data dan operasi baca dan tulis
Dalam pembangunan aplikasi sebenar, operasi caching data dan baca dan tulis adalah kesesakan prestasi biasa. Untuk meningkatkan kecekapan sistem dan pengalaman pengguna, teknologi coroutine tak segerak PHP boleh digunakan untuk mempercepatkan operasi ini. Artikel ini akan memperkenalkan konsep asas dan prinsip coroutine tak segerak PHP dan menyediakan contoh kod khusus.
1. Konsep dan prinsip coroutine tak segerak
Coroutine tak segerak ialah teknologi pengaturcaraan serentak yang cekap yang menggunakan utas tunggal untuk mencapai penjadualan tugas dan kerjasama yang ringan. Berbanding dengan pengaturcaraan serentak berbilang benang atau berbilang proses tradisional, coroutine tak segerak mempunyai ciri-ciri berikut:
Dalam coroutine tak segerak, gelung acara ialah bahagian penting. Mekanisme gelung peristiwa boleh dilaksanakan melalui sambungan swool PHP. Berikut ialah kod contoh gelung peristiwa mudah:
<?php $server = new SwooleServer('127.0.0.1', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); $server->on('connect', function ($server, $fd) { echo "Client:Connect. "; }); $server->on('receive', function ($server, $fd, $reactor_id, $data) { $server->send($fd, "Server: " . $data); }); $server->on('close', function ($server, $fd) { echo "Client: Close. "; }); $server->start();
Kod ini melaksanakan pelayan TCP mudah, menggunakan swoole untuk melaksanakan operasi gelung peristiwa dan IO tak segerak. Apabila klien menyambung ke pelayan, menghantar data ke pelayan, atau memutuskan sambungan, gelung peristiwa mencetuskan fungsi panggil balik yang sepadan.
2. Operasi caching data
Caching data ialah cara yang berkesan untuk meningkatkan prestasi aplikasi. Dalam aplikasi PHP, kaedah caching yang biasa digunakan termasuk caching fail, caching memori, caching pangkalan data, dll. Di sini kami mengambil cache memori Redis sebagai contoh untuk memperkenalkan cara menggunakan coroutine tak segerak untuk mempercepatkan operasi cache data.
Dalam PHP, anda boleh menggunakan sambungan Redis untuk menyambung ke pelayan Redis, atau anda boleh menggunakan perpustakaan pihak ketiga seperti Predis. Di sini kami menggunakan perpustakaan Predis sebagai contoh:
<?php $redis = new PredisClient('tcp://127.0.0.1:6379');
Apabila menyambung ke pelayan Redis, memandangkan operasi IO rangkaian tidak segerak, penjadualan coroutine boleh digunakan untuk menjimatkan sambungan pelanggan dan masa tindak balas.
<?php go(function () { $redis = new PredisClient('tcp://127.0.0.1:6379'); $result = $redis->ping(); echo $result . " "; });
Kod di atas menggunakan coroutine untuk menyambung ke pelayan Redis, melaksanakan arahan ping dan mengeluarkan hasilnya. Melalui penjadualan coroutine, berbilang sambungan pelanggan dan permintaan pertanyaan boleh diproses secara serentak dalam satu urutan, meningkatkan keselarasan dan prestasi sistem.
Untuk operasi biasa cache Redis, seperti mendapatkan dan menetapkan data cache, ia juga boleh dilaksanakan menggunakan coroutine tak segerak. Berikut ialah kod sampel:
<?php go(function () { $redis = new PredisClient('tcp://127.0.0.1:6379'); $key = 'test_key'; $value = 'test_value'; $result = $redis->set($key, $value); $result2 = $redis->get($key); echo $result . " "; echo $result2 . " "; });
Dalam kod di atas, satu set pasangan nilai kunci ditetapkan dan nilai kunci diperoleh melalui penjadualan coroutine. Berbanding dengan operasi IO menyekat tradisional, coroutine tak segerak boleh meningkatkan kecekapan dan masa tindak balas operasi IO dengan ketara.
3. Operasi baca dan tulis data
Dalam pembangunan aplikasi PHP, operasi baca dan tulis data juga merupakan salah satu kesesakan prestasi. Untuk meningkatkan kecekapan membaca dan menulis data, ia boleh dilaksanakan menggunakan coroutine tak segerak.
Dalam PHP, membaca dan menulis fail boleh dilaksanakan menggunakan penunjuk fail, fread/fwrite, dsb. Untuk meningkatkan kecekapan membaca dan menulis fail, kami boleh menggunakan operasi IO fail tak segerak. Berikut ialah contoh kod:
<?php go(function () { $file = __DIR__ . '/test.txt'; $content = "test content"; $fileHandle = fopen($file, 'w'); $result = fwrite($fileHandle, $content); fclose($fileHandle); echo $result . " "; $fileHandle2 = fopen($file, 'r'); $result2 = fread($fileHandle2, filesize($file)); fclose($fileHandle2); echo $result2 . " "; });
Dalam kod di atas, fail test.txt ditulis secara tak segerak dan kandungan fail dibaca secara tak segerak melalui penjadualan coroutine. Berbanding dengan operasi IO fail penyekat tradisional, coroutine tak segerak boleh meningkatkan kecekapan membaca dan menulis fail serta masa tindak balas dengan ketara.
Dalam aplikasi PHP, operasi IO rangkaian juga merupakan salah satu kesesakan prestasi biasa. Untuk meningkatkan kecekapan operasi IO rangkaian, operasi IO rangkaian tak segerak boleh digunakan. Berikut ialah contoh kod untuk permintaan HTTP:
<?php go(function () { $url = 'http://www.baidu.com/'; $cli = new SwooleCoroutineHttpClient('www.baidu.com', 80); $cli->set(['timeout' => 1]); $cli->setHeaders([ 'Host' => 'www.baidu.com', 'User-Agent' => 'Chrome/49.0.2587.3', 'Accept' => 'text/html,application/xhtml+xml,application/xml', 'Accept-Encoding' => 'gzip' ]); $cli->get('/'); echo $cli->body; });
Dalam kod di atas, permintaan HTTP dimulakan secara tak segerak melalui penjadualan coroutine dan kandungan respons adalah output. Berbanding dengan operasi IO rangkaian penyekat tradisional, coroutine tak segerak boleh meningkatkan kecekapan operasi IO rangkaian dan masa tindak balas dengan ketara.
Kesimpulan
Melalui teknologi coroutine tak segerak, prestasi dan kelajuan tindak balas aplikasi PHP boleh dipertingkatkan dengan ketara. Artikel ini memperkenalkan konsep dan prinsip asas coroutine tak segerak PHP dan menyediakan contoh kod khusus, dengan harapan dapat membantu pembangun PHP.
Atas ialah kandungan terperinci Pembangunan coroutine tak segerak PHP: mempercepatkan cache data dan operasi baca dan tulis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!