gatewayworker与mysql的连接及数据库操作

1.Workerman/MySQL 数据库连接类下载与安装

gatewayworker与mysql连接,需要使用 Workerman/MySQL 数据库连接类,它依赖 PDO_MYSQL和PDO 扩展。需要先使用phpinfo()查看php是否已安装了这两个扩展。

Workerman/MySQL 数据库连接类下载地址:https://github.com/walkor/mysql/archive/master.zip

下载后只需要Connection.php 一个文件即可,这个文件可以放在任何位置,

我直接放到gatewayworker中的应用文件夹内了,即与events.php同一个文件夹,因为放到这里,可以使用:require_once (‘Connection.php’); 直接引用使用,不用考虑麻烦的路径问题。

2.gatewayworker 中mysql的连接与初始化
(1)新建一个类的静态成员,用来保存mysql数据库实例,需要在events类内,各个回调函数外,添加:

public static $db = null;

如:

class Events
{
    
    /**
     * 新建一个类的静态成员,用来保存mysql数据库实例
     */
    public static $db = null;

    public static function onWorkerStart($businessWorker)
    {

(2)在回调函数内引用Workerman/MySQL 数据库连接类文件:

  require_once ('Connection.php');

(3)连接数据库:

       require_once ('Connection.php');
       self::$db =new \Workerman\MySQL\Connection('localhost', '3306', 'root', '', 'tpshop23');

手册里,对于连接数据库的代码是放到了onWorkerStart($worker)里面:


use \GatewayWorker\Lib\Gateway;
require_once '/your/path/of/mysql-master/src/Connection.php';

/**
 * 数据库示例,假设有个your_db_name库,里面有个user表
 */
class Events
{
    /**
     * 新建一个类的静态成员,用来保存数据库实例
     */
    public static $db = null;

    /**
     * 进程启动后初始化数据库连接
     */
    public static function onWorkerStart($worker)
    {
        self::$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
    }

而在实际项目中,很可能并不是每时每刻都需要连接mysql,比如只在onclose的时候才需要连接mysql写入数据,那么就没有必要把连接mysql的代码写入onWorkerStart($worker)这个全局初始化函数中,否则mysql将被成千上万的用户一直连接,尤其是使用gatewayworker建立了长连接,很可能一个用户一连接就是几个小时,浪费了mysql的连接消耗。

为什么mysql的连接代码放到onworkerstart中,会导致它在gatewayworker中一直保持连接状态呢?

因为常驻内存的程序在使用mysql时经常会遇到mysql gone away的错误,这个是由于程序与mysql的连接长时间没有通讯,连接被mysql服务端踢掉导致。而Workerman/MySQL数据库类可以解决这个问题,当发生mysql gone away错误时,会自动重试一次。

所以若不需要在系统执行的大部分时间内都连接mysql,是没有必要将其放置在全局初始化函数中的。

3.mysql的使用:
可以参考Workerman/MySQL 数据库连接类的使用手册;
http://doc.workerman.net/components/workerman-mysql.html
(1)插入数据:

       $insert_id =self::$db->insert('tp_chat_time')->cols(array(
           'start_time'=>$start_time,
           'end_time'=>$end_time,
           'member_user_id'=>$mbid,
           'bj_id'=>$live_id,
           'difference'=>$difference,
           'expend_cp'=>$expend_cp,
           'chat_mode'=>2,
       ))->query();

(2)更新数据:
关于数据库的更新操作,手册给了三种写法:

// 更新
$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 = self::$db->query("UPDATE `tp_users` SET `user_cp` =$user_cp_final WHERE user_id=$mbid");

关于更新数据,主要是手册里的代码都是常量,没有变量,而在实际写代码的时候,肯定是要在里面加变量的,一旦变量加入函数中,就会造成运行错误,比如下面这个是手册里的第二种写法:

   $where = array('user_id'=>$mbid);
   $update = array('user_cp'=>$user_cp_final);
   $row_count = self::$db->update('tp_users')->cols($update)->where($where)->query();

这种方式的写法,会造成cols()的混淆,将 w h e r e 和 where和 whereupdate都执行进了cols(),同理用手册里的第一种写法,也会造成同样的错误产生,所以最简单的还是直接写SQL命令吧。

你可能感兴趣的:(gatewayworker)