NSQ使用curl命令增加一个新Topic

使用nsq的web面板增加topic会有奇怪的问题,如图

这个匪夷所思的问题到现在没有什么解决方法,只能通过另外一种方式,使用http协议增加一个topic

curl -X POST "http://172.16.164.248:4151/topic/create?topic=purse.withdraw.result"

给Let’s encrypt颁发的SSL证书开启OCSP stapling

在iPhone等客户端打开Let’s encrypt证书的https网站,会出现等待时间过长的问题,究其原因,大概是,https握手的时候,浏览器会去找证书颁发者问,目前已经吊销的证书列表有哪些。Let’s encrypt的服务器在海外,因为神秘力量作用,“查已吊销”动作非常耗时。

Let’s encrypt证书免费到香的不行,配合上计划任务,只要服务器不欠费情况下,可以自动续期,全程做到无需人工介入,这点比花钱的单域名证书香太多了。

网络上查询一段时间,发现有个技术叫“OCSP stapling”。先解释一下OCSP:

OCSP 是一个在线证书查询接口,它建立一个可实时响应的机制,让浏览器可以实时查询每一张证书的有效性,解决了 CRL 的实时性问题,但是 OCSP 也引入了一个性能问题,某些客户端会在 SSL 握手时去实时查询 OCSP 接口,并在得到结果前会阻塞后续流程,这对性能影响很大,严重影响用户体验。(OCSP 地址也在证书的详细信息中)

再解释一下OCSP Stapling:

OCSP Stapling 就是为了解决 OCSP 性能问题而生的,其原理是:在 SSL 握手时,服务器去证书 CA 查询 OCSP 接口,并将 OCSP 查询结果通过 Certificate Status 消息发送给浏览器,从而让浏览器跳过自己去验证的过程而直接拿到结果,OCSP 响应本身有了签名,无法伪造,所以 OCSP Stapling 既提高了效率也不会影响安全性。另外服务器有更好的网络,能更快地获取到 OCSP 结果,同时也可以将结果缓存起来,极大的提高了性能、效率和用户体验。

接下来直接上在nginx中,虚拟主机配置OCSP Stapling

先在服务器上找到三个证书文件:www.aa.com.key www.aa.com.pem

另外一个文件可能叫ca.cer

在Windows上打开这个文件是长这样的:

Windows打开查看

在mac预览的时候,长这样:

Mac预览

其实就是Let’s Encrypt 给咱们颁发证书的上一级证书的公钥证书

准备好了三个证书后,在server_name 同一层加如下配置:

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /usr/local/nginx/conf/ssl/your.domain.com/ca.cer;
resolver 8.8.8.8 8.8.4.4 114.114.114.114 114.114.115.115 valid=60s;
resolver_timeout 2s;

配置完毕后,执行nginx -t检查一下有没有语法错误,再nginx -s reload走一下

找一台iPhone 打开网站看看速度有没有飞快许多

参考链接:
https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol#Browser_support
https://www.feiniaomy.com/post/156.html
https://www.sohu.com/a/204468378_612370
https://www.jianshu.com/p/540124f370e0

Mac shell提示complete:13: command not found: compdef

Compdef is basically a function used by zsh for load the auto-completions. The completion system needs to be activated. If you’re using something like oh-my-zsh then this is already taken care of, otherwise you’ll need to add the following to your ~/.zshrc

实际解决方案,修改~/.zshrc 在开头增加下面的命令即可

autoload -Uz compinit
compinit

Completion functions can be registered manually by using the compdef function directly like this compdef . But compinit need to be autoloaded in context before using compdef.

微信小程序直播功能准入要求

一、类目要求:

  1. 小程序开发者为国内非个人主体开发者;
  2. 小程序开发者为下述类目品类,类目具体信息可参考《微信小程序开放的服务类目》:
    1)电商平台:电商平台
    2)商家自营:百货、食品、初级食用农产品、酒/盐、图书报刊/音像/影视/游戏/动漫、汽车/其他交通
    工具的配件、服装/鞋/箱包、玩具/母婴用品(不含食品)、家电/数码/手机、美妆/洗护、珠宝/饰品/眼镜
    /钟表、运动/户外/乐器、鲜花/园艺/工艺品、家居/家饰/家纺、汽车内饰/外饰、办公/文具、机械/电子
    器件、电话卡销售、预付卡销售、宠物/农资、五金/建材/化工/矿产品;
    3)教育:培训机构、教育信息服务、学历教育(学校)、驾校培训、教育平台、素质教育、婴幼儿教
    育、在线教育、教育装备、出国移民、出国留学、特殊人群教育、在线视频课程;
    4)金融业:证券/期货投资咨询、保险;
    5)出行与交通:航空、地铁、水运、城市交通卡、打车(网约车)、顺风车(拼车)、出租车、路况、
    路桥收费、加油/充电桩、城市共享交通、高速服务、火车、公交、长途客运、停车、代驾、租车;
    6)房地产:房地产、物业管理、房地产经营、装修/建材;
    7)生活服务:丽人、宠物(非医药类)、宠物医院/兽医、环保回收/废品回收、摄影/扩印、婚庆服务、
    搬家公司、百货/超市/便利店、家政、营业性演出票务、生活缴费;
    8)IT科技:硬件与设备、基础电信运营商、电信业务代理商、软件服务提供商、多方通信;
    9)餐饮:餐饮服务场所/餐饮服务管理企业、点餐平台、外卖平台、点评与推荐、菜谱、餐厅排队;
    10)旅游:旅游线路、旅游攻略、旅游退税、酒店服务、公寓/民宿、门票、签证、出境WiFi、景区服
    务;
    11)汽车:养车/修车、汽车资讯、汽车报价/比价、车展服务、汽车经销商/4S店、汽车厂商、汽车预售
    服务;
    12)体育:体育场馆服务、体育赛事、体育培训、在线健身
    二、运营要求:
    1、主体下小程序近半年没有严重违规
    2、小程序近90天存在支付行为
    以上2个运营条件和类目同时满足的前提下,下面3个条件满足其一即可
    3、主体下公众号累计粉丝数大于100
    4、主体下小程序近7日dau大于100
    5、主体在微信生态内近一年广告投放实际消耗金额大于1w
    以上准入要求于 2020 年 02 月 24 日进行公示生效。为营造良好健康的微信生态,腾讯公司有权对《微信
    小程序直播功能准入要求》不时予以调整并公布,请予以关注。

来源:https://res.wx.qq.com/mmbizwxampnodelogicsvr_node/dist/images/access_47d0ce.pdf

Docker快速开启一个MySQL5.7实例

docker run --name mysql57 -v /Users/charles/docker/mysql57/etc:/etc/mysql/conf.d -v /Users/charles/docker/mysql57/data:/var/lib/mysql -p 3357:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

第一个-v是绑定mysql的配置文件夹

第二个-v是绑定mysql的数据文件夹

-p 3357:3306 将本机的3357端口绑定到docker实例的3306端口上

-e MYSQL_ROOT_PASSWORD=root 设置MySQL的root账号对应的密码是root

tips: -e是设置docker容器的环境配置

Laravel6.18.19优雅切换发件账户

在做一个通知系统时,业务需求,根据不同场景使用不同的账户发送邮件,laravel默认只支持一个邮箱发邮件。不满实际情况,使用Config::set()方法动态设置账户后,可以成功发送邮件,再次set无法再次修改发件账户。

查阅多个资料的值,需要重新设置SwiftMailer。

创建邮箱账户配置文件/config/my_emails.php

<?php
return [
    'emails' => [
        'a' => [
            'email' => 'a@188.com',
            'password' => '专属客户端密码',
            'smtp' => 'smtp.188.com',
            'port' => '465',
            'encryption' => 'ssl',
            'name' => '靓仔A',
        ],
        'b' => [
            'email' => 'b@188.com',
            'password' => '专属客户端密码',
            'smtp' => 'smtp.188.com',
            'port' => '994',
            'encryption' => 'ssl',
            'name' => '靓女b',
        ],
    ],
];

接下来创建切换助手类

<?php
namespace App\Mail;
use Illuminate\Support\Facades\Mail;

class MailHelper
{
    public static function setAccount($accountName)
    {
        $transport = new \Swift_SmtpTransport(
            config("my_emails.emails.{$accountName}.smtp"),
            config("my_emails.emails.{$accountName}.port"),
            config("my_emails.emails.{$accountName}.encryption")
        );
        $transport->setUsername(config("my_emails.emails.{$accountName}.email"));
        $transport->setPassword(config("my_emails.emails.{$accountName}.password"));
        $mailer = new \Swift_Mailer($transport);
        Mail::setSwiftMailer($mailer);
        Mail::alwaysFrom(config("my_emails.emails.{$accountName}.email"), config("my_emails.emails.{$accountName}.name"));
    }
}

实际使用如下:

<?php
MailHelper::setAccount('a');
Mail::to('boy@163.com')->send(new TestMail());
MailHelper::setAccount('b');
Mail::to('girl@163.com')->send(new TestMail());

PHPStorm在windows上优雅使用gitbash

gitbash是windows上开发的一个神器终端工具,在执行一些类Linux命令时得心应手。

phpstorm的内置terminal是windows内置的cmd,不适合php开发,于是需要把cmd换成gitbash

直接替换后,会弹出新窗口,需要配置参数,如下面

"C:\git\bin\bash.exe" --login -i

PHP7.4.0一些新特性

2019年11月28日,php.net发布了php7.4.0,根据php.net网站公开信息,博主来翻译一下本次更新的一些特性

强类型的类变量(Typed properties)

类属性在定义的时候,可以设置它的类型

class User {
    public int $id;
    public string $name;
}

上面的例子可以强制$user->id 指定为 integer 类型,$user->name 指定为 string 类型

箭头函数(Arrow functions)

箭头函数提供了一个简练的返回值的语法

$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);

PS: => 右边仅仅支持一句话语句,不支持多个分号的语句

子类可以更改父类方法返回类型(Limited return type covariance and argument type contravariance)

class A {}
class B extends A {}

class Producer {
    public function method(): A {}
}
class ChildProducer extends Producer {
    public function method(): B {}
}

仅仅使用自动加载的时候,才支持此特性。在单个文件中,只有非循环类型引用是可用的,因为所有类在被使用之前引入到工作空间

空合并赋值运算符(Null coalescing assignment operator)

$array['key'] ??= computeDefault();
// 约等于下面的语句
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}

优雅合并数组(Unpacking inside arrays)

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// $fruits = ['banana', 'orange', 'apple', 'pear', 'watermelon'];
// 等于下面的操作,保留了数组元素的顺序
$fruits = array_merage(['banana', 'orange'], $parts, ['watermelon']);

数字类型文字分隔符(Numeric literal separator)

6.674_083e-11; // float 浮点型
299_792_458;   // decimal 十进制
0xCAFE_F00D;   // hexadecimal 十六进制
0b0101_1111;   // binary 二进制

数字文本可以在数字之间包含下划线。这点博主有点懵逼,等博主用7.4.0跑一下看看什么结果

弱引用(Weak references)

弱引用允许码农保留对某个对象的引用,该对象不会阻止该对象被销毁。

允许从__toString()中抛出异常(Allow exceptions from __toString())

现在允许从 __toString() 方法中抛出异常。之前这么做,php会报一个致命错误(fatal error)。字符串转换方法(__toString())中现有的可恢复致命错误已转换为错误异常。换句话说:__toString方法中可以随便抛异常,上层可以捕获这异常并可以进行相应处理,旧版php不能这么做

CURL

libcurl在版本>=7.56.0中,CURLFile 支持 stream wrappers 和空白文件名(plain file names)

过滤器(Filter)

FILTER_VALIDATE_FLOAT 过滤器支持最小范围(min_range)和最大范围(max_range)参数选项, FILTER_VALIDATE_INT也是如此

FFI扩展

FFI是一个新的PHP扩展(extension),它可以简单地调用C语言类库的原生方法、使用原生变量、创建或访问数据结构

GD扩展

添加了IMG_FILTER_SCATTER 图像过滤器常量以对图像应用散射过滤器。

哈希(Hash)

增加了依赖于Castagnoli’s 多项式的CRC32哈希算法。这个CRC32用于存储系统中,例如iSCSI、SCTP、Btrfs、ext4。

多字节字符串(Multibyte String)

增加了mb_str_split()函数,它提供了和str_split()相同的功能,但是操作的是代码点(code point),而不是字节(Bytes)

代码点(code point)是指与一个编码表中的某个字符对应的代码值。UTF-16编码采用不同长度的编码表示所有Unicode代码点,每个16位二进制表示一个代码单元(code unit)。基本字符的范围为[U+0000~U+FFFF],辅助字符,即上面提到的增补字符,其两个代码单元的范围分别为[U+D800~U+DBFF]和[U+DC00~U+DFFF]。这样很容易就能知道一个代码单元是一个基本字符的编码还是一个辅助字符的第一或第二部分。

OPcache

支持预加载代码

正则(Regular Expressions (Perl-Compatible))

preg_replace_callback()preg_replace_callback_array()函数添加了flags参数, 这个参数支持PREG_OFFSET_CAPTUREPREG_UNMATCHED_AS_NULL常量。这会影响传递给回调函数的匹配内容的数组格式。

PDO

用户名和密码现在可以指定为mysql、mssql、sybase、dblib、firebird和oci驱动程序的PDO DSN的一部分。以前,只支持pgsql驱动程序。如果在构造函数和DSN中都指定了用户名/密码,则构造函数优先。

现在可以在SQL查询中转义问号,以避免它们被解释为参数占位符。使用 ?? 向数据库发送单个问号,例如使用PostgreSQL JSON key 存在 (?) 操作符。

PDO_OCI

现在可以使用PDOStatement::getColumnMeta()方法了

PDO_SQLite

PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT) 可以检查是否是只读状态,而不用修改数据库内容

PDO::errorInfo() and PDOStatement::errorInfo()中,PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true) 启用了SQLite3 扩展结果码(result code)

尚未完成….