>  기사  >  백엔드 개발  >  PHP 및 MySQL에서 대용량 데이터 쿼리 및 전송을 위한 Swoole 및 Workerman의 최적화 방법

PHP 및 MySQL에서 대용량 데이터 쿼리 및 전송을 위한 Swoole 및 Workerman의 최적화 방법

PHPz
PHPz원래의
2023-10-15 12:00:401009검색

PHP 및 MySQL에서 대용량 데이터 쿼리 및 전송을 위한 Swoole 및 Workerman의 최적화 방법

Swoole과 Workerman은 두 가지 고성능 PHP용 네트워크 프레임워크입니다. 이들은 대규모 데이터 쿼리 및 전송을 위한 특정 최적화 방법을 가지고 있습니다. 이 기사에서는 이 두 가지 프레임워크에 중점을 두고 특히 PHP 및 MySQL에서 대용량 데이터 쿼리 및 전송을 위한 최적화 방법을 소개하고 해당 코드 예제를 제공합니다.

1. PHP 및 MySQL 대용량 데이터 쿼리 및 전송을 위한 Swoole의 최적화 방법:

  1. 코루틴 사용: Swoole은 비차단 비동기 I/O 작업을 실현할 수 있는 코루틴을 지원하여 쿼리 및 전송 효율성을 향상시킵니다. 코루틴을 사용하면 스레드 전환으로 인한 오버헤드를 방지하고 동시성 성능을 향상할 수 있습니다.

다음은 MySQL 쿼리에 Swoole 코루틴을 사용하기 위한 샘플 코드입니다.

<?php
Coun(function () {
    $db = new SwooleCoroutineMySQL();
    $db->connect([
        'host' => '127.0.0.1',
        'port' => 3306,
        'user' => 'root',
        'password' => '123456',
        'database' => 'test',
    ]);

    // 开始协程
    go(function () use ($db) {
        $result = $db->query('SELECT * FROM table');
        var_dump($result);
    });

    // 开始协程
    go(function () use ($db) {
        $result = $db->query('SELECT * FROM table2');
        var_dump($result);
    });
});
?>
  1. 연결 풀 사용: Swoole은 연결 풀을 사용하여 MySQL과의 연결을 관리하고 연결을 자주 생성 및 삭제하는 것을 방지하며 성능을 향상시킬 수 있습니다.

다음은 MySQL 쿼리에 Swoole 연결 풀을 사용하기 위한 샘플 코드입니다.

<?php
$dbPool = new SwooleCoroutineChannel(10); // 设置连接池大小为10

$dbConfig = [
    'host' => '127.0.0.1',
    'port' => 3306,
    'user' => 'root',
    'password' => '123456',
    'database' => 'test',
];

for ($i = 0; $i < 10; $i++) {
    go(function () use ($dbConfig, $dbPool) {
        $db = new SwooleCoroutineMySQL();
        $db->connect($dbConfig);
        $dbPool->push($db); // 将连接放入连接池
    });
}

go(function () use ($dbPool) {
    $db = $dbPool->pop(); // 从连接池中取出一个连接
    $result = $db->query('SELECT * FROM table');
    var_dump($result);
    $dbPool->push($db); // 将连接放回连接池
});
?>

2. Workerman의 PHP 및 MySQL 대용량 데이터 쿼리 및 전송을 위한 최적화 방법:

  1. 멀티 프로세스 쿼리: Workerman은 다중 프로세스 모델을 지원합니다. , 다중 프로세스 쿼리를 통해 쿼리 효율성을 향상시킬 수 있습니다. PHP의 포크 기능을 사용하여 하위 프로세스를 생성할 수 있으며, 각 하위 프로세스는 쿼리 작업을 담당합니다.

다음은 Workerman 다중 프로세스를 사용하여 MySQL을 쿼리하는 샘플 코드입니다.

<?php
use WorkermanWorker;
use WorkermanConnectionTcpConnection;

$worker = new Worker();
$worker->count = 4; // 设置进程数为4

$worker->onWorkerStart = function ($worker) {
    $db = new mysqli('127.0.0.1', 'root', '123456', 'test');
    if ($db->connect_errno) {
        printf("Connect failed: %s
", $db->connect_error);
        exit();
    }

    // 每个进程中的回调函数单独查询数据
    $worker->onMessage = function (TcpConnection $connection, $data) use ($db) {
        $result = $db->query('SELECT * FROM table');
        $connection->send($result->fetch_all(MYSQLI_ASSOC));
    };
};

Worker::runAll();
?>
  1. 캐시 사용: Workerman은 캐시를 사용하여 쿼리 결과를 저장하고 다중 쿼리를 피할 수 있습니다. 캐싱 기능은 PHP의 memcached 확장 또는 Redis 확장을 사용하여 구현할 수 있습니다.

다음은 Workerman을 사용하여 쿼리 결과를 캐시하기 위한 샘플 코드입니다(Redis를 캐시로 사용).

<?php
use WorkermanWorker;
use WorkermanConnectionTcpConnection;
use WorkermanlibTimer;
use PredisClient;

$worker = new Worker();
$worker->count = 4;

$redis = new Client(array(
    'scheme' => 'tcp',
    'host'   => '127.0.0.1',
    'port'   => 6379,
));

$worker->onWorkerStart = function ($worker) use ($redis) {
    // 查询数据并存入缓存
    $current_time = time();
    $result = $redis->get('data');
    if (!$result) {
        $db = new mysqli('127.0.0.1', 'root', '123456', 'test');
        if ($db->connect_errno) {
            printf("Connect failed: %s
", $db->connect_error);
            exit();
        }
        $result = $db->query('SELECT * FROM table');
        $redis->set('data', serialize($result));
        $redis->expire('data', 60); // 设置缓存失效时间为60秒
        $db->close();
    } else {
        $result = unserialize($result);
    }

    // 每个进程中的回调函数返回缓存结果
    $worker->onMessage = function (TcpConnection $connection, $data) use ($result) {
        $connection->send($result);
    };
};

// 定期更新缓存
$worker->onWorkerStart = function ($worker) use ($redis) {
    Timer::add(60, function () use ($redis, $worker) {
        $db = new mysqli('127.0.0.1', 'root', '123456', 'test');
        if ($db->connect_errno) {
            printf("Connect failed: %s
", $db->connect_error);
            exit();
        }
        $result = $db->query('SELECT * FROM table');
        $redis->set('data', serialize($result));
        $db->close();

        // 更新每个进程中的结果
        foreach ($worker->connections as $connection) {
            $connection->send($result);
        }
    });
};

Worker::runAll();
?>

위는 Swoole과 Workerman이 PHP 및 MySQL 대용량 데이터 쿼리 및 전송의 최적화 방법에 대해 자세히 소개한 것입니다. 해당 코드 예제도 마찬가지입니다. Swoole의 코루틴과 연결 풀, Workerman의 다중 프로세스와 캐시를 사용하여 PHP와 MySQL에서 대용량 데이터 쿼리와 전송의 효율성을 높이고 시스템 성능을 향상시킬 수 있습니다.

위 내용은 PHP 및 MySQL에서 대용량 데이터 쿼리 및 전송을 위한 Swoole 및 Workerman의 최적화 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.