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