Rumah  >  Artikel  >  rangka kerja php  >  Bagaimana untuk melaksanakan muat turun fail yang sangat serentak dalam Swoole

Bagaimana untuk melaksanakan muat turun fail yang sangat serentak dalam Swoole

王林
王林asal
2023-06-25 11:18:101483semak imbas

Dengan perkembangan pesat Internet dan kemunculan era data besar, aplikasi konkurensi tinggi menjadi semakin biasa, dan memuat turun fail tidak terkecuali. Melaksanakan muat turun fail yang sangat serentak dalam Swoole mempunyai lebih banyak kelebihan berbanding kaedah tradisional.

Swoole ialah enjin komunikasi rangkaian berprestasi tinggi coroutine dalam bahasa PHP Ia boleh menyediakan ciri lanjutan seperti coroutine, IO tak segerak dan berbilang proses dalam PHP. Ia menyokong berbilang protokol seperti HTTP/WebSocket/TCP/UDP. dan sesuai untuk pembangunan web , pelayan permainan, Internet Perkara, komunikasi masa nyata dan bidang lain. Seterusnya, kami akan menggunakan Swoole untuk mencapai muat turun fail konkurensi tinggi.

Langkah 1: Pasang sambungan Swoole

Mula-mula, kita perlu memasang sambungan Swoole. Anda boleh memasangnya mengikut dokumentasi rasmi, atau anda boleh memasangnya melalui Composer, alat pengurusan pakej PHP. Di sini kami memasangnya melalui Komposer.

Masukkan arahan berikut dalam terminal untuk memasang:

composer require swoole/swoole

Langkah 2: Tulis kod untuk memuat turun fail

Seterusnya, kami mula menulis kod untuk memuat turun fail. Kami boleh memuat turun melalui klien HTTP tak segerak yang disediakan oleh Swoole.

$http = new SwooleCoroutineHttpClient('www.example.com', 80);
$http->setHeaders([
    'Host'            => 'www.example.com',
    'User-Agent'      => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
    'Accept'          => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Encoding' => 'gzip, deflate, sdch',
    'Accept-Language' => 'zh-CN,zh;q=0.8,en;q=0.6',
]);

$http->download('/path/to/localfile', '/remote/path/to/file');

Dalam kod di atas, kami membuat instantiate klien HTTP tak segerak dan menetapkan beberapa parameter permintaan, seperti maklumat pengepala permintaan, dsb. Kemudian panggil kaedah muat turun untuk memuat turun fail. Antaranya, parameter pertama ialah laluan fail tempatan, dan parameter kedua ialah laluan jauh bagi fail yang hendak dimuat turun.

Langkah 3: Merangkumkan kod ke dalam kaedah yang boleh digunakan semula

Kod di atas hanya boleh melengkapkan satu muat turun fail Jika bilangan muat turun yang banyak diperlukan, kod tersebut perlu dirangkumkan ke dalam kaedah yang boleh digunakan semula. Dalam kaedah ini, kami boleh menggunakan coroutines untuk melaksanakan pemprosesan muat turun serentak berbilang tugas, seperti berikut:

function batchDownload($uris, $outputDir, $concurrency = 64)
{
    $n = count($uris);
    $running = true;
    $workers = [];
    for ($i = 0; $i < $concurrency; $i++) {
        $co = run(function () use ($outputDir, &$running, &$workers) {
            $client = new SwooleCoroutineHttpClient('www.example.com', 80);
            while ($running || !empty($workers)) {
                if (!empty($workers)) {
                    $url = array_shift($workers);
                    $client->download("{$outputDir}/".basename($url), $url);
                } else {
                    Coroutine::sleep(0.1);
                }
            }
        });
        $workers[] = null;
    }
    foreach ($uris as $url) {
        $workers[] = $url;
    }
    $running = false;
    //所有协程结束后回收资源
    for ($i = 0; $i < $concurrency; $i++) {
        $co = array_shift($workers);
        $co->join();
    }
}

Dalam kod di atas, kami mencipta coroutine $concurrency untuk pemprosesan tak segerak melalui gelung for, dan setiap coroutine ialah permintaan Bebas, selepas memproses satu permintaan, permintaan seterusnya akan diproses secara automatik, dengan itu mencapai tujuan memproses berbilang permintaan serentak.

Begitu juga, kod di atas boleh memuat turun fail secara berkelompok dengan memanggil kaedah batchDownload, seperti berikut:

$uris = ['https://www.example.com/image1.jpg', 'https://www.example.com/image2.jpg', 'https://www.example.com/image3.jpg'];
$outputDir = '/path/to/output';
batchDownload($uris, $outputDir);

Summary

Melaksanakan muat turun fail konkurensi tinggi dalam Swoole adalah lebih baik daripada kaedah tradisional, dan IO tak segerak dilaksanakan melalui coroutine. Beralih antara CPU dan IO menghapuskan keperluan untuk menunggu respons pelayan, yang meningkatkan keupayaan pemprosesan serentak permintaan. Pada masa yang sama, ia adalah mudah dan pantas untuk merangkum kod ke dalam kaedah yang boleh digunakan semula, supaya kita boleh memanggilnya secara langsung dalam pembangunan seterusnya, meningkatkan kecekapan pembangunan.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan muat turun fail yang sangat serentak 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