dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib 解决方案

dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib
解决方案

ln -s /usr/local/opt/readline/lib/libreadline.dylib /usr/local/opt/readline/lib/libreadline.7.dylib

发表在 MAC | dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib 解决方案已关闭评论

docker 设置时区

RUN apk add --no-cache tzdata
ENV TZ=Asia/Shanghai

发表在 docker | docker 设置时区已关闭评论

简单易用分布式锁

class PublicFunc{
    public static function lock($name, $ex = 60)
    {
        $val = uniqid();
        if ($redis->set($name, $val, 'NX', 'EX', $ex)) {
            register_shutdown_function(function () use ($name, $val) {
                PublicFunction::unlock($name, $val);
            });
        } else {
            throw new \Exception('执行中,请稍等');
        }
    }

    public static function unlock($name)
    {//释放锁需要先判断是否是自己持有的锁,如果是则释放,否则不释放,多不操作要求原子操作,所以需要lua脚本
        static $releaseLuaScript = <<<LUA
if redis.call("GET",KEYS[1])==ARGV[1] then
    return redis.call("DEL",KEYS[1])
else
    return 0
end
LUA;
        return $redis->eval($releaseLuaScript, 1, $name, $val);
    }
}
发表在 php, php 优化, php函数集 | 简单易用分布式锁已关闭评论

nginx 504 Gateway Time-out

方向代理增加超时时间
location ~ /api {
proxy_pass http://127.0.0.1:8081;
proxy_read_timeout 3600;//反向代理读取超时时间,默认60秒
}

发表在 nginx | nginx 504 Gateway Time-out已关闭评论

根据生日计算年龄



    public static function getAgeFromBirthDay($birthday)
    {
        $bday = new \DateTime($birthday); // 你的出生日

        $today = new \Datetime(date('Y-m-d'));

        $diff = $today->diff($bday);
        return $diff->y;
    }
发表在 php, php函数集, 基础 | 根据生日计算年龄已关闭评论

跨域访问设置方式

header('Access-Control-Allow-Origin: *');//允许跨域域名
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, OPTIONS, DELETE');//允许跨域方式
header('Access-Control-Allow-Headers: *');//允许header
header('Access-Control-Expose-Headers: *');//某些header无法传递,须要指明header白名单(content-type 就在此列)
发表在 js, 前端, 设计模式, 运维 | 跨域访问设置方式已关闭评论

js ISO-8859-1 转中文

fetch 获取的 header 内容如果是中文(多子节),则会转译成 ISO-8859-1 编码格式,需要转编码转换

var str = “ç\u0088±æ\u0088\u0091ä¸\u00ADå\u009B½”;
var utfstring =decodeURI(escape(str))//先编码再解码
//或者 utfstring =decodeURIComponent(escape(str)) 

decodeURIComponent 和 decodeURIComponent 区别具体看这里。encodeURI 自身无法产生能适用于HTTP GET 或 POST 请求的URI,例如对于 XMLHTTPRequests, 因为 "&", "+", 和 "=" 不会被编码,然而在 GET 和 POST 请求中它们是特殊字符。然而encodeURIComponent这个方法会对这些字符编码
参考

发表在 js, 前端 | js ISO-8859-1 转中文已关闭评论

fetch 下载流文件

前后端分离的项目,前端大部分使用fetch调用接口,遇到下载的时候,服务器接口一般直接返回流文件(链接本身就是一个文件)

export const getExport = async (url, postData) => {
    let options = null
    if (postData) {
        options = _headerOptions('POST')
        options.headers['content-type'] = 'application/json'
        options.body = JSON.stringify(postData)
    } else {
        options = _headerOptions('GET')
    }

    let response = await fetch(config.apiHost + url, options)
    response.blob().then((blob) => {
        const a = window.document.createElement('a');
        const downUrl = window.URL.createObjectURL(blob);// 获取 blob 本地文件连接 (blob 为纯二进制对象,不能够直接保存到磁盘上)
        const m = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(response.headers.get('Content-Disposition'));
        const filename = m[1].replace(/['"]/g, '');
        // console.log(decodeURI(escape(filename[0])))
        a.href = downUrl;
        a.download = filename;
        a.click();
        window.URL.revokeObjectURL(downUrl);
    });

    return [];
}
发表在 js, 前端 | fetch 下载流文件已关闭评论

curl命令上传文件

curl 'http://xxxxxx' -F "theFile=/Users/xxxx/Downloads/1.jpg;filename=xxxx"

后台接收到的信息

var_dump($_FILE);
/*
array(1) {
  ["theFile"]=>
  array(6) {
    ["name"]=>
    string(7) "xxxx"
    ["tempName"]=>
    string(14) "/tmp/phpnk5HXI"
    ["tempResource"]=>
    array(0) {
    }
    ["type"]=>
    string(0) ""
    ["size"]=>
    int(36)
    ["error"]=>
    int(0)
  }
}
*/
发表在 Shell | curl命令上传文件已关闭评论

使用 certbot 安装免费的安全证书

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python-certbot-nginx

certbot certonly --webroot -w /xxx -d www.ivhong.com -d ivhong.com -w /xxxx -d www.ivhui.com -d ivhui.com --agree-tos --email xxxx@163.com
--------------参数解释 :
* certonly  只获取证书
* --webroot  以webroot插件去获得证书
* -w  需配合--webroot参数一起使用,用来指定网站根目录
* -d   指定域名
* --agree-tos  用意ACME用户协议(如果省略此项,则在命令执行过程中会询问是否同意)
* --email 指定邮箱用来接收一些通知(如果省略此项,则在命令执行过程中会要求填写)
* (如果有多个域名,则按照一个 -w  /var/www/example  后接一个 -d example.com  的形式继续输入。)

nginx 配置:

        listen 443 ssl;
        listen 80;
        server_name ivhui.com www.ivhui.com;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/ivhong/www/ivhui/web;

#    ssl on;//这里如果是on的话,http访问网址将会出错
ssl_certificate /etc/letsencrypt/live/www.ivhong.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.ivhong.com/privkey.pem;
ssl_session_timeout 5m;
 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
 ssl_prefer_server_ciphers on;

来源:https://blog.csdn.net/qq_35751770/article/details/78018613

发表在 运维 | 使用 certbot 安装免费的安全证书已关闭评论