Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pembangunan coroutine tak segerak PHP: mempercepatkan cache data dan operasi baca dan tulis

Pembangunan coroutine tak segerak PHP: mempercepatkan cache data dan operasi baca dan tulis

WBOY
WBOYasal
2023-12-18 13:09:52911semak imbas

Pembangunan coroutine tak segerak PHP: mempercepatkan cache data dan operasi baca dan tulis

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:

  1. Model benang tunggal: Melalui mekanisme seperti gelung peristiwa, pelbagai tugas boleh berkongsi potongan masa untuk mengelakkan masa yang disebabkan oleh penukaran konteks benang . dan overhed sumber.
  2. IO tidak menyekat: Dengan merangkum operasi IO tak segerak (seperti permintaan rangkaian, membaca dan menulis fail, dll.), aplikasi boleh kembali serta-merta apabila melakukan operasi IO tanpa menunggu operasi selesai.
  3. Penjadualan coroutine: Kerjasama dan permohonan antara pelbagai tugas dicapai melalui coroutine. Coroutine ialah utas ringan yang boleh digantung dan disambung semula semasa pelaksanaan untuk meningkatkan keselarasan tugasan dan pemprosesan sistem.

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.

  1. Sambung ke pelayan Redis

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.

  1. Mendapatkan dan menetapkan data cache

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.

  1. Membaca dan menulis fail 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.

  1. Operasi IO rangkaian tak segerak

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn