Rumah >rangka kerja php >Swoole >Cara menggunakan coroutine untuk melaksanakan fungsi swoole_sntp konkurensi tinggi dalam Swoole

Cara menggunakan coroutine untuk melaksanakan fungsi swoole_sntp konkurensi tinggi dalam Swoole

WBOY
WBOYasal
2023-06-25 08:07:421019semak imbas

Swoole ialah rangka kerja coroutine PHP berprestasi tinggi dengan ciri seperti coroutine, IO tak segerak, prestasi tinggi dan konkurensi tinggi Ia sangat sesuai untuk membangunkan perkhidmatan rangkaian. Antaranya, fungsi swoole_sntp digunakan untuk menyegerakkan masa pelayan dan boleh memainkan peranan yang sangat penting dalam pembangunan. Dalam artikel ini, kami akan memperkenalkan cara menggunakan coroutine untuk melaksanakan fungsi swoole_sntp konkurensi tinggi dalam Swoole.

Pengenalan kepada Swoole_sntp

Fungsi Swoole_sntp ialah fungsi dalam rangka kerja Swoole yang menyegerakkan masa pelayan Ia boleh menghantar permintaan protokol NTP ke pelayan masa rangkaian tertentu dan kemudian mendapatkan maklumat masa pelayan. Fungsinya ditakrifkan seperti berikut:

bool swoole_sntp(string $server, float $timeout = 1.0, float $offset = null);

Antaranya, parameter $server ialah alamat pelayan masa yang ditentukan, parameter $timeout ialah tamat masa dan parameter $offset ialah perbezaan masa antara masa tempatan dan rangkaian, yang tidak perlu dinyatakan.

Menggunakan coroutines

Apabila menggunakan fungsi Swoole_sntp, selalunya perlu meminta maklumat masa daripada pelayan berbilang masa, dan permintaan itu perlu diselesaikan dalam tempoh masa tertentu. Dalam kes ini, menggunakan coroutine boleh mencapai konkurensi yang tinggi dan meningkatkan kelajuan permintaan.

Coroutine ialah utas ringan yang boleh melaksanakan berbilang tugas secara serentak dalam proses yang sama, mengelakkan kehilangan prestasi yang disebabkan oleh penukaran konteks berbilang benang. Dalam Swoole, coroutine boleh digunakan untuk melaksanakan permintaan serentak kepada pelayan berbilang masa.

Berikut ialah contoh kod untuk menggunakan coroutines untuk melaksanakan fungsi swoole_sntp konkurensi tinggi:

<?php

use SwooleCoroutine;

function sntp($server, $timeout = 1.0, $offset = null)
{
    $cli = new CoroutineHttpClient($server, 80);
    $cli->setDefer();

    $cli->execute('/');

    if ($cli->statusCode !== 200) {
        return false;
    }

    $response = $cli->body;

    $ts = unpack('N12', substr($response, 0, 48));
    $ts = round(($ts[9] * 1.0) + ($ts[10] * 1.0 / 4294967296.0) - 2208988800.0);

    $cli->close();

    return $ts;
}

$serverList = ['cn.pool.ntp.org', 'tw.pool.ntp.org', 'jp.pool.ntp.org'];

$sntp = function ($server) {
    $cli = new CoroutineHttpClient($server, 80);
    $cli->setDefer();

    $cli->execute('/');

    if ($cli->statusCode !== 200) {
        return false;
    }

    $response = $cli->body;

    $ts = unpack('N12', substr($response, 0, 48));
    $ts = round(($ts[9] * 1.0) + ($ts[10] * 1.0 / 4294967296.0) - 2208988800.0);

    $cli->close();

    return $ts;
};

$results = [];
foreach ($serverList as $server) {
    Coroutine::create(function () use ($server, &$results, $sntp) {
        $results[$server] = $sntp($server);
    });
}

while (count($results) < count($serverList)) {
    Coroutine::sleep(0.1);
}

print_r($results);

Dalam kod di atas, fungsi bernama sntp ditakrifkan untuk meminta pelayan masa dan maklumat masa kembali. Seterusnya, fungsi tanpa nama bernama $sntp ditakrifkan, yang juga digunakan untuk meminta pelayan masa dan maklumat masa kembali. Dalam gelung, gunakan Coroutine::create untuk mencipta coroutine baharu, gunakan fungsi $sntp untuk meminta pelayan masa dan simpan keputusan dalam tatasusunan $results. Akhir sekali, gunakan gelung sementara untuk menunggu semua coroutine melengkapkan dan mengeluarkan maklumat sepanjang masa.

Ringkasan

Melalui pengenalan di atas, anda harus mempunyai pemahaman awal tentang cara menggunakan coroutine untuk melaksanakan fungsi swoole_sntp yang sangat serentak dalam Swoole. Coroutine ialah ciri yang sangat penting dalam rangka kerja Swoole Ia boleh meningkatkan prestasi dan keselarasan perkhidmatan rangkaian dengan sangat baik dan layak untuk dikaji dan diamalkan secara mendalam oleh pembangun.

Atas ialah kandungan terperinci Cara menggunakan coroutine untuk melaksanakan fungsi swoole_sntp konkurensi tinggi dalam Swoole. 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