TP5 [10501]SQLSTATE[HY000]: General error: 2006 MySQL server has gone away [thinkphp]
[10501]SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
application/database.php 增加数据库断线重连配置
//断线重连
'break_reconnect' => true,
[10501]SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
application/database.php 增加数据库断线重连配置
//断线重连
'break_reconnect' => true,
composer安装
composer require topthink/think-worker=1.0.*
workman服务需要PHP开启某些函数
//使用workerman需要解除以下函数的禁用
stream_socket_server
stream_socket_client
pcntl_signal_dispatch
pcntl_signal
pcntl_alarm
pcntl_fork
posix_getuid
posix_getpwuid
posix_kill
posix_setsid
posix_getpid
posix_getpwnam
posix_getgrnam
posix_getgid
posix_setgid
posix_initgroups
posix_setuid
posix_isatty
在项目根目录创建
server.php
代码如下
<?php
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','push/Worker');
require __DIR__ . '/thinkphp/start.php';
*创建模块应答
application|push|controller|Worker.php
代码如下
<?php
namespace app\push\controller;
use think\worker\Server;
use think\Log;
use think\Controller;
class Worker extends Server
{
protected $socket = 'websocket://0.0.0.0:2346';
/**
* 收到信息
* @param $connection
* @param $data
*/
public function onMessage($connection, $data)
{
$params =$data;
$data = json_decode($data,true);
if ($data['sign']){
$connection->send($data['sign']);
}else{
$return_data ="我于".date("Y-m-d H:i:s")."收到您的信息:".$params;
$connection->send($return_data);
}
}
/**
* 当连接建立时触发的回调函数
* @param $connection
*/
public function onConnect($connection)
{
}
/**
* 当连接断开时触发的回调函数
* @param $connection
*/
public function onClose($connection)
{
}
/**
* 当客户端的连接上发生错误时触发
* @param $connection
* @param $code
* @param $msg
*/
public function onError($connection, $code, $msg)
{
echo "error $code $msg\n";
}
/**
* 每个进程启动
* @param $worker
*/
public function onWorkerStart($worker)
{
Log::write('进程启动了:'.date('Y-m-d H:i:s'),'info');
}
public function index(){
parent::start();
}
}
启动php服务进程
php server.php start #启动 |stop 停止|restart重启
Nginx配置反向代理
在server内添加
location /wss {
proxy_pass http://127.0.0.1:2346/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 5000M;
}
客户端访问代码
我本地创建了一个8.html文件访问
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试接收数据</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<button type="button" class="signScore">点击一下</button>
<script type="application/javascript">
function StartWebSocket(){
websocket = new WebSocket("ws://app.dev.ejiegd.com/wss");
websocket.onopen = function (data) {
// 发送信息
var content =Math.random().toString(36).slice(2,10);
websocket.send(content);
};
websocket.onmessage = function (data) {
console.log("接收内容");
alert(data.data);
console.log(data.data); // 接收信息
};
websocket.onclose = function (data) {
console.log("关闭", data); //关闭
};
}
$(".signScore").click(function () {
StartWebSocket();
})
</script>
</body>
</html>
最终效果
workerman可以一直运行,以daemon(守护进程)方式启动workerman即可后台一直运行。
启动停止workerman:
启动
以debug(调试)方式启动
php server.php start
以daemon(守护进程)方式启动
php server.php start -d
停止
php server.php stop
重启
php server.php restart
平滑重启
php server.php reload
查看状态
php server.php status
debug和daemon方式区别:
1、以debug方式启动,代码中echo、var_dump、print等打印函数会直接输出在终端。
2、以daemon方式启动,代码中echo、var_dump、print等打印会默认重定向到/dev/null文件,可以通过设置Worker::$stdoutFile = '/your/path/file';来设置这个文件路径。
3、以debug方式启动,终端关闭后workerman会随之关闭并退出。
4、以daemon方式启动,终端关闭后workerman继续后台正常运行。
1、今天遇到一个很奇葩的问题,
在by_user表中,存在28518这个id,但是使用下面的语句,更新不了字段的值。
请教了一下高人,发现我在表中设置该字段的值是null,
如果数值需要参与计算,建议将数值的默认值修改成0,
原创来源:CSDN 博客
https://blog.csdn.net/taotie_/article/details/107788473
在centos7.5主机部署了lnmp1.8环境
部署thinkphp5的程序时候,rewrite转发配置正常。但显示空白,经过多番研究,发现是fastcgi的安全目录open_Dir问题
/usr/local/nginx/conf
【fastcgi.conf】
大概在26-27行
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
#未改前
#fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";
#修改后
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/../:/tmp/:/proc/";
OK 大功告成
场景:category_ids 值为1,2,4
查询 category_ids = 2 和 4的所有记录
查询语句:$map['category_id']=array('in',$category_ids)
❌
$category_ids =1,2,3
$map[] =['category_id','in',$category_ids];
✔
user thinkDb; //引入DB类
$map=array();
$map['status'] =1;
$map['EXP']=Db::raw("FIND_IN_SET($cid,cate_ids)");
cate_ids 里面存储的数据如1,2,3
测试可用
git仓库地址
https://github.com/endroid/qr-code
composer安装
$ composer require endroid/qr-code
实例:
<?php
use Endroid\QrCode\QrCode;
use Endroid\QrCode\QrCodeInterface;
use Endroid\QrCode\WriterRegistryInterface;
//代码片段
public function erweima(){
$text='hello';
$qrCode = new QrCode($text);
$qrCode->setSize(300);
// Set advanced options
$logo=APP_ROOT.'/logo.jpg';
$qrCode->setWriterByName('png');
$qrCode->setMargin(10);
$qrCode->setEncoding('UTF-8');
$qrCode->setForegroundColor(['r' => 0, 'g' => 0, 'b' => 0, 'a' => 0]);
$qrCode->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255, 'a' => 10]);
//加logo
$qrCode->setLogoPath($logo);
$qrCode->setLogoSize(80, 80);
$qrCode->setRoundBlockSize(true);
$qrCode->setValidateResult(false);
$qrCode->setWriterOptions(['exclude_xml_declaration' => true]);
//返回二进制流
$img=$qrCode->writeString();
$imginfo = 'data:png;base64,' . chunk_split(base64_encode($img));//转base64
//echo "<img src='$imginfo'>";
return $imginfo;
}
?>