Rumah > rangka kerja php > Swoole > teks badan

Cara Swoole melaksanakan sandaran data berprestasi tinggi

WBOY
Lepaskan: 2023-06-25 13:06:42
asal
901 orang telah melayarinya

Dalam beberapa tahun kebelakangan ini, sandaran data telah menjadi bahagian penting dalam pembinaan maklumat perusahaan. Apabila volum perniagaan dan volum data perusahaan meningkat, penyelesaian sandaran tradisional tidak lagi dapat memenuhi keperluan, jadi beberapa alat sandaran baharu telah muncul. Swoole ialah rangka kerja komunikasi rangkaian berprestasi tinggi berdasarkan bahasa PHP, yang digunakan terutamanya untuk melaksanakan aplikasi pelayan. Artikel ini akan memperkenalkan cara menggunakan Swoole untuk mencapai sandaran data berprestasi tinggi.

1. Sandarkan data

Pertama, kita perlu membuat sandaran data. Perisian pangkalan data seperti MySQL telah memberikan kami alat yang berkaitan Kami hanya perlu memanggil arahan yang sepadan untuk membuat sandaran data. Berikut ialah fungsi sandaran mudah:

function backupDatabase($db, $user, $password, $host, $port, $output)
{
    $exec = "mysqldump --opt --skip-lock-tables --extended-insert --user={$user} --password={$password} --host={$host} --port={$port} {$db}";
    if($output)
    {
        $exec .= " > {$output}";
    }
    exec($exec);
}
Salin selepas log masuk

Fungsi ini menerima parameter berikut:

$db: nama pangkalan data yang perlu disandarkan

$pengguna: nama pengguna pangkalan data

$kata laluan; kata laluan pangkalan data;

Fungsi ini menyandarkan pangkalan data kepada fail, yang boleh menjadi fail skrip sql yang digunakan semasa memulihkan data. Sudah tentu, kaedah sandaran lain juga boleh digunakan, seperti menyalin fail pangkalan data, dsb.

2. Sandaran serentak

Jika data besar, proses sandaran mungkin mengambil sedikit masa. Menggunakan kaedah sandaran tradisional, anda hanya boleh membuat sandaran satu demi satu mengikut urutan sandaran yang ditentukan, dan tidak boleh melaksanakan berbilang tugas sandaran pada masa yang sama. Swoole menyediakan sokongan coroutine, yang boleh melaksanakan tugas sandaran tak segerak dan serentak.

Berikut ialah fungsi sandaran serentak yang dilaksanakan menggunakan Swoole:

function concurrentBackup($max, $databases)
{
    $num = count($databases);
    $max = min($max, $num);
    $chan = new chan($max);

    for($i = 0; $i < $max; $i++)
    {
        $chan->push($i);
    }

    $results = [];
    $i = 0;
    $executor = new SwooleCoroutineMysql();

    while($i < $num)
    {
        if($result = $chan->pop())
        {
            $database = $databases[$i];
            go(function() use($database, $executor, $chan, &$results) {
                $executor->connect([
                    'host' => $database['host'],
                    'user' => $database['user'],
                    'password' => $database['password'],
                    'database' => $database['schema']
                ]);

                $filename = "/tmp/{$database['schema']}.sql";
                backupDatabase($database['schema'], $database['user'], $database['password'], $database['host'], $database['port'], $filename);

                $executor->query('DROP TABLE IF EXISTS test');

                $result = $executor->query("source {$filename}");
                if($result === false) {
                    $results[$database['schema']] = 'error';
                } else {
                    $results[$database['schema']] = 'ok';
                }

                $executor->close();

                $chan->push(1);
            });

            $i++;
            if($i == $num) break;
        }
    }

    while(count($results) < $num)
    {
        Co::sleep(0.01);
    }

    return $results;
}
Salin selepas log masuk

Fungsi ini menerima dua parameter:

$maks: bilangan maksimum sandaran serentak

$pangkalan data: pangkalan data yang perlu disandarkan, termasuk setiap satu pangkalan data Maklumat sambungan.

Fungsi ini memulakan berbilang tugas sandaran serentak melalui coroutine. Mula-mula buat saluran dengan saiz $max untuk mengawal bilangan mata wang. Kemudian tugas sandaran dilaksanakan dalam gelung, setiap kali mengambil kedudukan yang tersedia dari saluran dan memulakan coroutine. Sandarkan pangkalan data yang ditentukan dalam coroutine, dan kemudian pulihkan kandungan fail sandaran ke pangkalan data sasaran. Akhirnya, keputusan disimpan dalam tatasusunan $results.

Oleh kerana coroutine adalah utas yang ringan dan boleh mengendalikan berbilang tugas serentak dalam satu utas, sandaran serentak yang cekap boleh dicapai.

3. Memampatkan fail sandaran

Apabila membuat sandaran data, untuk menjimatkan ruang storan, biasanya perlu memampatkan fail sandaran. Swoole menyediakan dua kaedah pemampatan, gzip dan zlib, yang boleh memampatkan fail sandaran dengan mudah.

Berikut ialah fungsi untuk memampatkan fail sandaran:

function compressBackupFile($filename, $level = 6, $mode = SWOOLE_ZLIB)
{
    $output = $filename . '.gz';
    $ouputFile = gzopen($output, 'wb' . $level);
    $inFile = fopen($filename, 'rb');

    if ($ouputFile && $inFile) {
        if($mode == SWOOLE_ZLIB) {
            $z = new SwooleZlib(SW_ZLIB_DEFLATE, $level, SW_ZLIB_ENCODING_GZIP);
            while(!feof($inFile)) {
                $data = fread($inFile, 1024 * 4);
                if(!$data) break;
                if($z->deflate($data)) {
                    gzwrite($ouputFile, $z->output);
                }
            }
            $z->flush(true);
            gzwrite($ouputFile, $z->output);
        } else {
            while(!feof($inFile)) {
                $data = fread($inFile, 1024 * 4);
                if(!$data) break;
                gzwrite($ouputFile, $data);
            }
        }
        fclose($inFile);
        gzclose($ouputFile);
        unlink($filename);
        return true;
    } else {
        return false;
    }
}
Salin selepas log masuk

Fungsi ini menerima tiga parameter:

$nama fail: nama fail sandaran yang perlu dimampatkan;

$tahap: tahap mampatan, julat nilai ialah 1-9, lalai ialah 6;

$mod: mod mampatan, nilainya ialah SWOOLE_ZLIB atau SWOOLE_GZIP, lalai ialah SWOOLE_ZLIB.

Menggunakan fungsi ini, fail sandaran boleh dimampatkan ke dalam format gz atau zlib.

4. Mencapai sandaran berprestasi tinggi

Dengan menggabungkan tiga fungsi di atas, kita boleh mencapai sandaran data berprestasi tinggi. Berikut ialah contoh program:

$databases = [
    [
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'root',
        'password' => '',
        'schema' => 'db1',
    ],
    [
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'root',
        'password' => '',
        'schema' => 'db2',
    ],
    [
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'root',
        'password' => '',
        'schema' => 'db3',
    ],
    [
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'root',
        'password' => '',
        'schema' => 'db4',
    ],
];

$max = 4;

$s1 = microtime(true);
$results = concurrentBackup($max, $databases);

foreach($results as $schema => $result)
{
    echo "{$schema} backup: {$result}
";
}

$s2 = microtime(true);
echo "time consumed: " . round($s2 - $s1, 3) . "s
";

foreach($databases as $database)
{
    $filename = "/tmp/{$database['schema']}.sql.gz";
    compressBackupFile($filename, 6, SWOOLE_GZIP);
}
Salin selepas log masuk

Program ini mentakrifkan empat pangkalan data yang perlu disandarkan, dan menetapkan bilangan maksimum mata wang kepada 4. Mula-mula panggil fungsi concurrentBackup untuk menyandarkan data secara selari, dan kemudian mengeluarkan hasil sandaran dan masa pelaksanaan proses sandaran. Akhir sekali, mampatkan fail sandaran.

Gunakan Swoole untuk mencapai sandaran data berprestasi tinggi, yang boleh meningkatkan kecekapan sandaran berbanding kaedah sandaran tradisional. Walau bagaimanapun, apabila menggunakan Swoole untuk sandaran data, anda perlu memberi perhatian kepada penalaan parameter prestasi seperti saiz kolam benang untuk memanfaatkan Swoole.

Atas ialah kandungan terperinci Cara Swoole melaksanakan sandaran data berprestasi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan