Workerman/MySQL

说明

常驻内存的程序在使用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/MySQL

方法1:

可以通过composer安装,命令行运行以下命令(composer源在国外,安装过程可能会非常慢)。

composer config -g repo.packagist composer https://mirrors.aliyun.com/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();运行前就初始化连接,在Worker::runAll();运行前初始化的连接属于主进程,子进程会继承这个连接,主进程和子进程共用相同的数据库连接会导致错误。

示例

use Workerman\Worker;

require_once __DIR__ . '/Workerman/Autoloader.php';

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($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();

workerman mysql_workerman/mysql相关推荐

  1. workerman连接mysql_workerman Mysql使用

    // 初始化db连接 $db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name'); // ...

  2. php+mysql+workerman+uni-app开发一套新能源汽车充电桩管理平台

    前言 充电桩管理系统按理用springboot技术架构去解决,但因为客户的开发周期短,预算低原因,我们使用了我们最熟悉的php+workerman技术栈解决了,经过2个月的开发,一年的使用,目前整套系 ...

  3. workerman高并发异步mysql_workerman怎么实现高并发

    并发概念太模糊,这里以两种可以量化的指标并发连接数和并发请求数来说明. 并发连接数是指服务器当前时刻一共维持了多少TCP连接,而这些连接上是否有数据通讯并不关注. (推荐学习: workerman教程 ...

  4. workerman mysql git_swoole和workerman哪个更易开发?

    因为项目需要, 智能家居一类的, 本来准备用C做, 想想swoole和workerman很火很成熟, 不少稳定应用场景了, 想想为什么不能用这俩试一下呢? 我C水平那么烂, 用PHP能满足需求多好? ...

  5. workerman的基本用法

    workerman是什么? Workerman是一个异步事件驱动的PHP框架,具有高性能,可轻松构建快速,可扩展的网络应用程序.支持HTTP,Websocket,SSL和其他自定义协议.支持libev ...

  6. workerman结合laravel开发在线聊天应用的示例代码

    项目背景: 最近由于公司的业务需求,需要用到聊天功能.而且有比较多的个性化需求需要定制.之前使用别人的聊天组件是基于微擎的.如果要移植到普通的H5在逻辑修改还有定制上存在比较多的困难.为此只能克服困难 ...

  7. php使用workerman实战,使用workerman实现在线聊天的方法

    workerman 是一个php编写的通讯服务.之前的项目都是用它做数据接口服务 这次用它做一个简单的在线聊天室~ 1.下载最新版本的workerman 可以去http://www.workerman ...

  8. ubuntu workerman kaer

    2019独角兽企业重金招聘Python工程师标准>>> debian/ubuntu系统安装教程(如果不是root用户请用sudo 后面加命令) http://programmer.s ...

  9. workman php 安装,workerman安装及遇到的问题解决

    下面由workerman入门教程栏目给大家介绍workerman安装及遇到的问题解决方法,希望对需要的朋友有所帮助! 1.workerman安装 workerman是php的一个socket框架,简化 ...

最新文章

  1. Qt 学习之路:模型-视图高级技术
  2. 从Java到Spring为何独得青睐Spring Summit 2017不可不知的那些事儿
  3. 网络回溯分析技术八大应用之运维评估 网络运维的真正价值
  4. mac怎么用c语言写文件路径,Mac 中使用os模块更改文件路径
  5. PHPcms 把盛大登陆换成人人网登陆
  6. HTML---HTML简介
  7. 网页挂码方式html css,CSS代码 解决网页挂马问题
  8. Mr.J-- 图片墙动画效果
  9. Springboot整合ES
  10. 2019年在NLP领域,资源有限的个人/团队能做哪些有价值有希望的工作?
  11. 红帽 Red Hat Linux相关产品iso镜像下载【百度云】(转载)
  12. JavaSE基础——异常、File文件类
  13. 关于opencv4.5.3读取视频失败问题
  14. scala教程(一)
  15. python pyhook_python pyHook安装
  16. 离散数学-⑦-离散概率
  17. 如何搜索自己博客内的文章
  18. N-BaIoT-Network-based-Detection-of-IoT-Botnet-Attacks
  19. MapProxy的部署与TMS地图服务代理
  20. java xlsm_使用apache poi写入xlsm(Excel 2007)

热门文章

  1. 计算机应用基础试模块5ACCSE,2015年计算机二级《Access》上机最后冲刺卷(1)
  2. python 不确定度_python机器学习-chapter2_16
  3. threejs坐标转换
  4. C++中正确使用PRId64
  5. 好奇怪呀后面加什么标点_狗狗吃饭时奇怪的小动作,你知道代表什么吗?做个懂狗的好主人...
  6. 【转】Linux的.a、.so和.o文件
  7. 理解 Azure 平台中虚拟机的计算能力
  8. 【转】2.3SharePoint服务器端对象模型 之 访问网站和列表数据(Part 3)
  9. Team Foundation Server的回滚操作
  10. 【Python CheckiO 题解】Roman Numerals