websocket 断开重连
https://blog.svenhetin.com/chu-tan-he-shi-xian-websocketxin-tiao-zhong-lian/
虽然 homestead 用的很习惯,还是想尝试新东西 docker 。也不是新东西了,出来有些年了。既然用 laravel ,那么就用 laradock
熟悉 virtualBox + vagrant + homestead 的朋友,对于 laradock 上手也会很快。当初,装 homestead 需要安装 virtualBox(也可以是vm等) 和 vagrant,然后是使用 homestead 来实现环境的配置安装。对于 docker 可以这样理解,docker 就是 virtualBox + vagrant,或是 vagrant。 我们只需要安装一个 docker 就可以了。然后下载 laradock 即可以开始安装了。
安装使用,一步到位,初观全局
laradock: https://github.com/laradock/laradock
这里以 win 为例子:
# 先选定一个磁盘位置,用来存放 laradock 并且相邻文件夹做为 www 目录(当然也可以其他位置)
cd /e/
mkdir service
cd service
git clone https://github.com/laradock/laradock.git
cd laradock
# 准备配置文件
cp env-example .env
# 修改配置文件
vim .env
# 修改 APP_CODE_PATH_HOST = '../www'
# 创建并启动
docker-compose up -d nginx php-fpm mysql redis workspace
# 重启
docker-compose restart
# 进入服务器
winpty docker-compose exec workspace bash
# 退出
exec
上边的过程,可能有些长久。先创建 laravel 项目。
# 默认安装最新版本。当前版本 6.8
composer create-project laravel/laravel --prefer-dist docker.cn
再配置 nginx,创建默认 laravel 项目
cd service/laradock/nginx/sites
# 复制一份配置出来。命名一定要以 .conf 作为后缀
cp app.conf.example docker.cn.conf
# 修改 docker.cn.conf
vim docker.cn.conf
# 通常会修改 server 下的 server_name 和 root。将 server_name 修改为你想要指定的域名。比如 docker.cn。 root修改为映射的文件目录。比如 /var/www/study/docker.cn/public 。保存退出。
# 每个对象都是一个容器
# 比如 修改了 nginx 只需要单独启动 nginx 即可
docker-compose up -d nginx
然后再执行 winpty docker-compose exec workspace bash 。如果发现还是访问不了。可以 docker-compose restart 再执行 winpty docker-compose exec workspace bash
配置 host
# 修改 host 文件,再末尾加入
vim hosts
GG
127.0.0.1 docker.cn
###
https://xueyuanjun.com/post/9608
做聊天项目的时候,通常会用到关键词过滤。对于一些敏感信息,可能还会进行内容加密。这里从两个不同的功能点,总结下过程。也是在别人的基础上,跑了一遍而已。照着做,可以一步到位。
环境
1. php
2. js
3. laravel
https://github.com/FireLustre/php-dfa-sensitive
composer require lustre/php-dfa-sensitive
# 项目中
use DfaFilter\SensitiveHelper;
# 添加词库,使用文件
$path = storage_path('sensitive/words.txt');
$handle = SensitiveHelper::init()->setTreeByFile($wordFilePath);
# 添加词库,单个添加
$data = [
'哎呦我的天',
'太阳',
'太阳块融化我的脸'
];
$handle = SensitiveHelper::init()->setTree($data);
# 替换,检测
$islegal = $handle->islegal($content);
$content = '啥啥啥,哎呦我的天呀,太阳快融化我的脸';
$content = $handle->replace($content, '*', true);
上边这些,github
上都有,照着做就可以了。
https://www.zkii.net/tech/php/1115.html
这里数据加密使用 aes。数据加密解密的对象是字符串。无论哪 js 还是 php,都可以互相转换。不过这里可能存在一种文体,js 加密的 js 可以解密,但 php 不能解密。反之亦然。出现这种情况,往往是加密解密模式没有配对上。
** js 加密解密 **
参考: https://blog.csdn.net/yingbaoyu/article/details/95761177
如果不是 node 环境,可以下载 https://pan.baidu.com/s/1Mvg8vhlD56wvS4b6yjUoaA 提取码:57gd
例子:
const aseKey = 'YjKp7COQ9QZN2EgMJdiI8tzBsJarvQAr';
const aseIv = 'zmtuC5UyMfK3r1QYXKa1lYmNNy8F5jiP';
//将秘钥转换成Utf8字节数组
const key = CryptoJS.enc.Utf8.parse(aseKey);
const iv = CryptoJS.enc.Utf8.parse(aseIv);
let data = {
name: 'vini',
gender: 1
}
data = JSON.stringify(data);
let encoded = CryptoJS.AES.encrypt(data, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString();
console.log(encoded);
let uncoded = CryptoJS.AES.decrypt(encoded, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
console.log(uncoded);
# 这个时候, data 应该等于 uncoded
key 的长度决定了 CBC 模式的不同。
# php 加密解密
<?php
namespace App\Helper;
class Aes
{
static public function encrypt($data)
{
$method = 'AES-256-CBC';
$key = 'YjKp7COQ9QZN2EgMJdiI8tzBsJarvQAr';
$iv = 'zmtuC5UyMfK3r1QY';
return openssl_encrypt($data, $method, $key, 0, $iv);
}
static public function decrypt($data)
{
$method = 'AES-256-CBC';
$key = 'YjKp7COQ9QZN2EgMJdiI8tzBsJarvQAr';
$iv = 'zmtuC5UyMfK3r1QY';
return openssl_decrypt($data, $method, $key, 0, $iv);
}
}
这里为了方便,把 method key iv 都写死了。项目里边不会这样做。比如,可以定义一个类:
<?php
namespace App\Utils;
class Aes
{
protected $aesSecret = 'YjKp7COQ9QZN2EgMJdiI8tzBsJarvQAr', $aesIv = '00000000000000000000000000000000';
/**
* 进制转换
* @param string $hex
* @return string
*/
protected function aesHexIv($hex = '')
{
$string = '';
$hex = $hex != '' ? $hex : $this->aesIv;
for ($i = 0; $i < strlen($hex) - 1; $i += 2) {
$string .= chr(hexdec($hex[$i] . $hex[$i + 1]));
}
return $string;
}
/**
* AES加密
* @param string $content
* @param string $key
* @param string $hex
* @return string
*/
public function aesEncrypt($content = '', $key = '', $hex = '')
{
$hash = hash('sha256', $key ?: $this->aesSecret, true);
$enCrypt = openssl_encrypt($content, 'AES-256-CBC', $hash, PKCS7_TEXT, $this->aesHexIv($hex));
return base64_encode($enCrypt);
}
/**
* AES解密
* @param string $content
* @param string $key
* @param string $hex
* @return string
*/
public function aesDecrypt($content = '', $key = '', $hex = '')
{
$content = base64_decode(str_replace(' ', '+', $content));
$hash = hash('sha256', $key ?: $this->aesSecret, true);
return openssl_decrypt($content, 'AES-256-CBC', $hash, PKCS7_TEXT, $this->aesHexIv($hex));
}
}
https://www.php.net/manual/zh/openssl.pkcs7.flags.php
https://blog.csdn.net/GlatChen/article/details/79978875
https://suijimimashengcheng.51240.com/
进一步了解 aes 加密解密
在多端配合的情况下,不是 key
和 iv
都对,就可以解密出加密的数据的。 秘钥位数,加密模式,填充方式也得一一对应上。
aes 参数
使用 yarn 来管理
npm config set registry=https://registry.npm.taobao.org
yarn config set registry https://registry.npm.taobao.org
yarn install
npm run watch-poll
composer require laravel/ui --dev
php artisan ui bootstrap
商户操作:
# 生成 32 位秘钥
# http://code.php.net.cn 在线编辑
// 创建随机字符串
function createNoncestr($length = 16)
{
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for($i = 0; $i < $length; $i ++)
{
$str .= substr ( $chars, mt_rand ( 0, strlen ( $chars ) - 1 ), 1 );
}
return $str;
}
$str = createNoncestr(32);
echo $str;
https://kf.qq.com/faq/180824JvUZ3i180824YvMNJj.html
api 证书不影响支付,对提现等功能才有用。
这里的关键点:
1. redis 异步队列。
2. 多项目。
面对上边这种情况,怎么处理呢。如果不处理又会出现什么现象呢。
因为我们使用 supervisord 进行常驻队列侦听。如果不指定对应的 queue,多项目就会出现串的情况。这个是就可以用 queue 来处理该问题了。
command=/alidata/service/php/bin/php /alidata/www/www.mlxiu.com/artisan queue:work redis --queue=test --sleep=3 --tries=3
public function __construct($id)
{
$queueName = config('queue.name');
if ($queueName) {
$this->onQueue($queueName);
}
}
queue.name 是自己额外在 queue.config 中添加的变量。
net::ERR_INCOMPLETE_CHUNKED_ENCODING 500 错误,至少有一种可能是服务器磁盘满了。