Workerman/MySQL
주의
이 라이브러리는 더 이상 유지되지 않으며, illuminate/database 또는 topthink/think-orm 사용을 권장합니다.
설명
상주 메모리 프로그램은 MySQL을 사용할 때 종종 mysql gone away 오류에 직면합니다. 이는 프로그램과 MySQL 간의 연결이 오랜 시간 동안 통신이 없어서 MySQL 서버 측에서 연결이 끊어진 결과입니다. 이 데이터베이스 클래스는 이 문제를 해결할 수 있으며, mysql gone away 오류가 발생할 경우 자동으로 재시도합니다.
의존하는 확장
이 MySQL 클래스는 pdo 및 pdo_mysql 두 가지 확장에 의존하며, 이들 중 하나가 부족할 경우 Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in .... 오류가 발생합니다.
명령줄에서 php -m을 실행하면 설치된 모든 PHP CLI 확장을 나열합니다. pdo 또는 pdo_mysql이 없다면, 직접 설치해야 합니다.
centos 시스템
PHP5.x
yum install php-pdo
yum install php-mysql
PHP7.x
yum install php70w-pdo_dblib.x86_64
yum install php70w-mysqlnd.x86_64
패키지명을 찾을 수 없다면, yum search php mysql로 검색해 보세요.
ubuntu/debian 시스템
PHP5.x
apt-get install php5-mysql
PHP7.x
apt-get install php7.0-mysql
패키지명을 찾을 수 없다면, apt-cache search php mysql로 검색해 보세요.
위 방법으로 설치할 수 없나요?
위 방법으로 설치할 수 없다면, workerman 매뉴얼 - 부록 - 확장 설치 - 방법 3 소스 코드 컴파일 설치를 참조하세요.
Workerman/MySQL 설치
방법 1:
composer를 통해 설치할 수 있으며, 명령줄에서 다음 명령어를 실행합니다(리포지토리가 해외에 있으므로 설치 과정이 매우 느릴 수 있습니다).
composer require workerman/mysql
위 명령이 성공하면 vendor 디렉토리가 생성되며, 프로젝트에 vendor 아래의 autoload.php를 포함시켜야 합니다.
require_once __DIR__ . '/vendor/autoload.php';
방법 2:
소스 코드 다운로드 후 압축 해제한 디렉토리를 원하는 위치에 두고 원본 파일을 직접 require합니다.
require_once '/your/path/of/mysql-master/src/Connection.php';
주의
강력히 권장하는 것은 onWorkerStart 콜백 내에서 데이터베이스 연결을 초기화하는 것입니다. Worker::runAll();이 실행되기 전에 연결을 초기화하면 주 프로세스에 속하는 연결이 생성되고, 자식 프로세스가 이 연결을 상속받아 주 프로세스와 자식 프로세스가 동일한 데이터베이스 연결을 공유하여 오류가 발생할 수 있습니다.
예시
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8484');
$worker->onWorkerStart = function($worker)
{
// db 인스턴스를 전역 변수에 저장합니다 (특정 클래스의 정적 멤버에 저장할 수도 있습니다)
global $db;
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
// 전역 변수에서 db 인스턴스를 가져옵니다
global $db;
// SQL 실행
$all_tables = $db->query('show tables');
$connection->send(json_encode($all_tables));
};
// worker 실행
Worker::runAll();
MySQL/Connection 구체적 사용법
// db 연결 초기화
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
// 모든 데이터 가져오기
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
// 동등
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
// 동등
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");
// 한 행 데이터 가져오기
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
// 동등
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
// 동등
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");
// 한 열 데이터 가져오기
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
// 동등
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
// 동등
$db->column("SELECT `ID` FROM `Persons` WHERE sex='M'");
// 단일 값 가져오기
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->single();
// 동등
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
// 동등
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");
// 복잡한 쿼리
$db->select('*')->from('table1')->innerJoin('table2','table1.uid = table2.uid')->where('age > :age')->groupBy(array('aid'))->having('foo="foo"')->orderByASC/*orderByDESC*/(array('did'))
->limit(10)->offset(20)->bindValues(array('age' => 13));
// 동등
$db->query('SELECT * FROM `table1` INNER JOIN `table2` ON `table1`.`uid` = `table2`.`uid`
WHERE age > 13 GROUP BY aid HAVING foo="foo" ORDER BY did LIMIT 10 OFFSET 20');
// 삽입
$insert_id = $db->insert('Persons')->cols(array(
'Firstname'=>'abc',
'Lastname'=>'efg',
'Sex'=>'M',
'Age'=>13))->query();
동등
$insert_id = $db->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`)
VALUES ( 'abc', 'efg', 'M', 13)");
// 업데이트
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// 동등
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// 동등
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");
// 삭제
$row_count = $db->delete('Persons')->where('ID=9')->query();
// 동등
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");
// 트랜잭션
$db->beginTrans();
....
$db->commitTrans(); // or $db->rollBackTrans();