>  기사  >  PHP 프레임워크  >  Workerman이 mysql 연결 풀을 작성합니다.

Workerman이 mysql 연결 풀을 작성합니다.

尚
앞으로
2019-12-19 17:19:112081검색

Workerman이 mysql 연결 풀을 작성합니다.

먼저 연결 풀링이 사용되는 이유와 연결 풀이 어떤 문제를 해결할 수 있는지 이해해야 합니다.

연결 풀링의 주요 기능

1 TCP 연결을 설정하기 위한 세 번의 핸드셰이크 비용을 줄입니다. 데이터 서버와 네 손을 흔들어 연결을 종료함으로써 클라이언트와 mysql 서버의 부하를 줄이고 요청 응답 시간을 단축합니다

2. 데이터베이스의 동시 연결 수를 줄입니다. 즉, 문제를 해결합니다. 너무 많은 응용 프로그램 서버로 인해 데이터베이스에 연결이 너무 많습니다

문제를 해결하려면 1

그러면 작업자만 데이터베이스 연결 풀은 가장 효율적인 방법은 아니지만 문제를 요구합니다. PHP는 단일 프로세스 및 단일 스레드이기 때문에 PHP를 사용하여 데이터베이스 연결 풀을 구현하려면 별도의 프로세스가 필요하며, 이는 프로세스 간 통신을 포함하므로 원래 mysql과의 직접 통신이 연결 풀을 사용하는 프로세스가 되고 다시 . MySQL 통신은 애플리케이션 측의 부하를 증가시킵니다.

문제 1을 해결하는 가장 효율적인 방법은 각 비즈니스 프로세스에 대해 데이터베이스 싱글톤(예: Workerman에서 제공하는 DB 클래스)을 설정하여 영구 데이터베이스 연결을 구현하여 각 프로세스의 모든 요청이 자체 영구 데이터베이스 연결을 사용하도록 하는 것입니다. , 전체 프로세스 수명주기에서 단 하나의 TCP 핸드셰이크 및 연결 해제 웨이브 오버헤드가 있으며 애플리케이션은 연결 풀과 같은 프로세스 간 IPC 통신의 중간 계층이 없으며 성능이 가장 높습니다. 그들을.

질문 2의 경우

먼저 보유한 애플리케이션 서버 수와 ​​각 서버가 mysql에 대해 동시 연결 수를 확인하세요. 응용 프로그램 서버가 10개만 있고 각 서버에 50개의 프로세스가 있으며 각 프로세스에 1개의 데이터베이스 연결이 있는 경우 mysql 서버에 대한 동시 연결은 총 10*50=500개(활성 연결 아님)이고 동시 연결 수는 500개입니다. mysql 연결 문제 2를 해결하기 위해서는 연결 풀을 사용할 필요가 없습니다.

1,000개의 응용 프로그램 서버가 있는 경우 연결 풀이 필요하지만 이 연결 풀은 1,000개의 응용 프로그램 서버에 대해 1,000개의 연결 풀이 있기 때문에 로컬 응용 프로그램 서버에서 실행되는 연결 풀이 될 수 없습니다. 10개의 연결만 열면 데이터베이스 연결 수가 쉽게 채워집니다. 따라서 현재 서버에서 몇 가지 작업 프로세스를 열어 연결 풀을 구현한다고 해서 이 문제가 해결될 것이라고 기대하지 마십시오.

1,000개의 애플리케이션 서버 클러스터에서 각 서버에 여러 프로세스를 설정하여 연결 풀링을 구현하는 것도 신뢰할 수 없는 방법입니다. 문제 2를 해결하는 실질적인 방법은 독립적인 데이터베이스 연결 풀 서버나 클러스터를 구축하여 모든 데이터베이스 링크를 전역적으로 관리하는 것입니다.

요약하자면,

질문 1에 대해서만 PHP의 mysql 연결 풀을 구현하는 경우 데이터베이스 싱글톤은 소위 연결 풀보다 더 간단하고 효율적인 접근 방식입니다.

질문 2를 실현하려면 비즈니스가 일정한 규모를 갖춰야 합니다. 실제로 Workerman을 사용하여 별도의 연결 풀 클러스터를 생성하려면 다음과 같은 간단한 방법으로 몇 가지 작업 프로세스를 생성하고 그에 대한 데이터베이스를 생성합니다. 연결 후 작업 프로세스는 sql 요청을 받아 mysql 서버로 보냅니다. mysql 서버가 반환된 후 작업 프로세스는 결과를 sql 개시자에게 보냅니다.

연결 풀 코드는 다음과 유사합니다. 여러 서버로 구성된 연결 풀 클러스터인 경우 앞에 lvs

// task worker,使用Text协议
$task_worker = new Worker('Text://0.0.0.0:1234');
$task_worker->count = 64;
$task_worker->name = 'MysqlTask';
$task_worker->onMessage = function($connection, $sql)
{
     // 执行sql.... 得到结果,这里省略....
     $sql_result = your_mysql_query($sql);
     // 发送结果
     $connection->send(json_encode($sql_result));
};

를 추가하여

use \Workerman\Connection\AsyncTcpConnection;
// 与远程连接池服务建立异步链接,ip为远程连接池服务的ip,如果是集群就是lvs的ip
$sql_connection = new AsyncTcpConnection('Text://ip:1234');
// 发送sql
$sql_connection->send("SELECT ... FROM .....");
// 异步获得sql结果
$sql_connection->onMessage = function($sql_connection, $sql_result)
{
     // 这里只是打印结果
     var_dump(json_decode($task_result));
};
// 执行异步链接
$sql_connection->connect();

를 호출하는 것이 가장 좋습니다. workerman tutorial 칼럼을 주목해주세요.

위 내용은 Workerman이 mysql 연결 풀을 작성합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제