Workerman/MySQL
Nota
Esta biblioteca não é mais mantida, recomenda-se o uso de illuminate/database ou topthink/think-orm
Descrição
Programas que permanecem em memória frequentemente encontram o erro mysql gone away ao usar mysql, o que ocorre porque a conexão do programa com o mysql fica inativa por muito tempo e é desconectada pelo servidor mysql. Esta classe de banco de dados pode resolver esse problema, pois quando ocorre o erro mysql gone away, tenta-se reconectar automaticamente.
Dependências
Esta classe mysql depende das extensões pdo e pdo_mysql, a ausência de qualquer uma delas resultará no erro Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in .....
Executar o comando php -m na linha de comando listará todas as extensões PHP CLI instaladas. Se não houver pdo ou pdo_mysql, você deve instalá-las.
Sistema 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
Se não encontrar o nome do pacote, tente usar yum search php mysql para procurá-lo.
Sistema Ubuntu/Debian
PHP5.x
apt-get install php5-mysql
PHP7.x
apt-get install php7.0-mysql
Se não encontrar o nome do pacote, tente usar apt-cache search php mysql para procurá-lo.
Não consegue instalar com os métodos acima?
Se não conseguir instalar com os métodos acima, consulte manual do Workerman - Apêndice - Instalação de extensão - Método 3: Compilação de código-fonte.
Instalação do Workerman/MySQL
Método 1:
Você pode instalar via composer, executando o seguinte comando na linha de comando (o repositório composer fica no exterior, o processo de instalação pode ser muito lento).
composer require workerman/mysql
Após o sucesso do comando acima, um diretório vendor será gerado, então você deve incluir o arquivo autoload.php do vendor no seu projeto.
require_once __DIR__ . '/vendor/autoload.php';
Método 2:
Baixar o código-fonte, coloque o diretório descompactado em seu próprio projeto (em qualquer lugar), e simplesmente requerir o arquivo de origem.
require_once '/your/path/of/mysql-master/src/Connection.php';
Atenção
É fortemente recomendado inicializar a conexão com o banco de dados no callback onWorkerStart, evitando inicializar a conexão antes de Worker::runAll();. A conexão inicializada antes de Worker::runAll(); pertence ao processo principal, e os subprocessos herdarão essa conexão, o que resultará em erros ao compartilhar a mesma conexão de banco de dados entre o processo principal e os subprocessos.
Exemplo
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)
{
// Armazenar a instância db em uma variável global (também pode ser armazenada em um membro estático de alguma classe)
global $db;
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
// Obter a instância db através da variável global
global $db;
// Executar SQL
$all_tables = $db->query('show tables');
$connection->send(json_encode($all_tables));
};
// Executar worker
Worker::runAll();
Uso Específico de MySQL/Connection
// Inicializar conexão db
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
// Obter todos os dados
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
// Equivalente a
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
// Equivalente a
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");
// Obter uma linha de dados
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
// Equivalente a
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
// Equivalente a
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");
// Obter uma coluna de dados
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
// Equivalente a
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
// Equivalente a
$db->column("SELECT `ID` FROM `Persons` WHERE sex='M'");
// Obter um único valor
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->single();
// Equivalente a
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
// Equivalente a
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");
// Consultas Complexas
$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));
// Equivalente a
$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');
// Inserir
$insert_id = $db->insert('Persons')->cols(array(
'Firstname'=>'abc',
'Lastname'=>'efg',
'Sex'=>'M',
'Age'=>13))->query();
Equivalente a
$insert_id = $db->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`)
VALUES ( 'abc', 'efg', 'M', 13)");
// Atualizar
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// Equivalente a
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// Equivalente a
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");
// Excluir
$row_count = $db->delete('Persons')->where('ID=9')->query();
// Equivalente a
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");
// Transações
$db->beginTrans();
....
$db->commitTrans(); // ou $db->rollBackTrans();