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;
}
}