swoole4 配置及简单使用
Tcp.php
<?php namespace server; use \Swoole\Coroutine\Channel; require_once 'Pdo.php'; class Tcp{ protected $number = 5; //数据包长度 protected $host = '0.0.0.0'; //监听对应外网的IP 0.0.0.0监听所有ip protected $port = 9502; //监听端口号 protected $config = array( //数据库配置 'db_port' => 3306, 'db_host' => '', //地址 'db_name' => '', //库名 'db_pass' => '', //密码 'db_user' => '', //用户名 'db_prefix' => '', //表前缀 ); public function __construct(){ //创建tcp服务器对象,监听0.0.0.0:9678端口 $server = new \Swoole\Server($this->host, $this->port); //设置参数 //如果业务代码是全异步 IO 的,worker_num设置为 CPU 核数的 1-4 倍最合理 //如果业务代码为同步 IO,worker_num需要根据请求响应时间和系统负载来调整,例如:100-500 //假设每个进程占用 40M 内存,100 个进程就需要占用 4G 内存 $server->set(array( 'worker_num' => 10, //设置启动的worker进程数。【默认值:CPU 核数】 'max_request' => 1000, //设置每个worker进程的最大任务数。【默认值:0 即不会退出进程】 'daemonize' => 1, //开启守护进程化【默认值:0,守护进程:1】 'ssl_cert_file' => '', //证书位置 'ssl_key_file' => '', //秘钥位置 'heartbeat_idle_time' => 180, // 表示一个连接如果180秒内未向服务器发送任何数据,此连接将被强制关闭 'heartbeat_check_interval' => 18, // 表示每18秒遍历一次 )); //监听连接进入事件 $server->on('Connect', function ($server, $fd) { echo "Client: 设备FD编号:{$fd} 设备已连接.\n"; }); //监听数据接收事件 $server->on('Receive', function ($server, $fd, $reactor_id, $data) { //实例化类 $pdo = new Pdo($this->config); //加入log file_put_contents('./TCP.log', '[' . date('Y-m-d H:i:s') . ']' . var_export($data,true) . PHP_EOL,FILE_APPEND);
var_dump($data);
$table = ''; //表名 $keys = ['','','','','','','','','','']; //字段名 $val = "(".implode(',', array_fill(0, count([$data[0],$data[1],$data[3],$data[2],$data[4],$data[5],$data[6],$data[7],$data[8],$data[9]]), '?')).")"; /*
* 数据添加示例 * @return string $table 表名 * @return array $keys 字段 * @return array $data 数据 * @return string $val 占位 * */ $pdo->Insert($table,$keys,$data,$val);return; }); //监听连接关闭事件 $server->on('Close', function ($server, $fd) { //实例化类 $pdo = new Pdo($this->config); $pdo->Offline($fd); echo "Client: 设备FD编号:{$fd} 设备已断开连接.\n"; }); //启动服务器 $server->start(); } } new Tcp();
pdo.php <?php namespace server; use JPush\Client as JPush; //激光推送 use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; use function PHPSTORM_META\type; class Pdo{ // 数据库表名 protected $table; // 数据库主键 protected $primary = 'id'; //表前缀 protected $prefix = ''; // WHERE和ORDER拼装后的条件 private $filter = array(); //PDO private $pdo; //PDOStatement private $Statement; //PDO链接数据库 public function __construct($config) { class_exists('PDO') or exit("not found PDO"); try{ $this->pdo = new \PDO("mysql:host=" . $config['db_host'] . ";port=" . $config['db_port'] . ";dbname=" . $config['db_name'], $config['db_user'], $config['db_pass']); }catch(PDOException $e){ //数据库无法链接,如果您是第一次使用,请先配置数据库! exit($e->getMessage()); } $this->prefix = $config['db_prefix']; $this->pdo->exec("SET NAMES UTF8"); } //使用类请引入对应Composer安装包路径 //如:require_once(dirname(dirname(dirname(dirname(__FILE__)))).'/vendor/autoload.php');
/* * 数据插入 * @return string $table 表名 * @return array $keys 字段 * @return array $value 数据 * @return string $val 占位 * */ public function Insert($table = '',$keys = [],$values = [],$val = ''){ try{ if (empty($values) or $val == ''){ return; } $this->pdo->beginTransaction(); $sql = $this->pdo->prepare("insert into $table (".implode(',',$keys).") values $val"); // foreach($values as &$row) { $sql->execute($values); // } $this->pdo->commit(); }catch (Exception $e){ //加入log file_put_contents('./swoole.log', '[' . date('Y-m-d H:i:s') . ']' . var_export($e->getMessage(),true) . PHP_EOL,FILE_APPEND); return false; } } //设备下线 public function Offline($fd = ''){ try{
}catch (Exception $e){ //加入log file_put_contents('./swoole.log', '[' . date('Y-m-d H:i:s') . ']' . var_export($e->getMessage(),true) . PHP_EOL,FILE_APPEND); return false; } } //设备上线 public function Online($fd = ''){ try{
}catch (Exception $e){ //加入log file_put_contents('./swoole.log', '[' . date('Y-m-d H:i:s') . ']' . var_export($e->getMessage(),true) . PHP_EOL,FILE_APPEND); return false; } }