在 Laravel 之外使用 illuminate 组件

当代框架基本都是有组件构成,这使得框架变得更加灵活。The Laravel Components | github Laravel 中有不少优质组件,那如何在 Laravel 之外使用 illuminate 组件呢? illuminate/validation 以 illuminate/validation 为例,validation 有丰富的数据验证功能。 在项目的 composer.json 文件中添加: ... "require": { ... "illuminate/validation": "^5.8", ... 从 Laravel-Lang/lang 项目中复制需要的语言文件放到自己的项目中。 例如:在 Yii2 项目中,复制对应语言文件到项目中的 assets/lang/zh-CN/validation.php。 创建 common/Validator.php: <?php namespace app\common; use Illuminate\Filesystem\Filesystem; use Illuminate\Translation\FileLoader; use Illuminate\Translation\Translator; use Illuminate\Validation\Factory; class Validator { private static $instance = null; private function __construct() { } public static function getInstance(): Factory { if (null === static::$instance) { $translationPath = get_alias('@assets/lang'); $translationLocale = 'zh-CN'; $transFileLoader = new FileLoader(new Filesystem(), $translationPath); $translator = new Translator($transFileLoader, $translationLocale); static::$instance = new Factory($translator); } return static::$instance; } } 在全局函数文件添加: // https://learnku.com/docs/laravel/5.8/validation/3899#manually-creating-validators // $rules = [ // 'name' => 'required|string|min:2|max:5', // 'code' => 'required|string|min:2|max:5', // ]; function validator(array $data, array $rules, array $messages = [], array $customAttributes = []) { return \app\common\Validator::getInstance()->make($data, $rules, $messages, $customAttributes); } 测试使用: ...

September 11, 2020 · 1 min · 173 words · Me

Redis 正则批量删除 key

EVAL "return redis.call('del', 'defaultKey', unpack(redis.call('keys', ARGV[1])))" 0 prefix:* 循环删除: EVAL "local keys = redis.call('keys', ARGV[1]) \n for i=1,#keys,5000 do \n redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) \n end \n return keys" 0 prefix:* References How to atomically delete keys matching a pattern using Redis | stackoverflow – EOF –

August 17, 2020 · 1 min · 48 words · Me

MySQL JSON 数据类型

The JSON Data Type | mysql As of MySQL 5.7.8, MySQL supports a native JSON data type JSON Function Reference | mysql A JSON column cannot have a non-NULL default value. 索引 设置虚拟列 -> 虚拟列建立索引 在 MySQL 5.7 中,支持两种 Generated Column,即 Virtual Generated Column 和 Stored Generated Column,前者只将 Generated Column 保存在数据字典中(表的元数据),并不会将这一列数据持久化到磁盘上;后者会将 Generated Column 持久化到磁盘上,而不是每次读取的时候计算所得。很明显,后者存放了可以通过已有数据计算而得的数据,需要更多的磁盘空间,与 Virtual Column 相比并没有优势,因此,MySQL 5.7 中,不指定 Generated Column 的类型,默认是 Virtual Column。 如果需要 Stored Generated Golumn 的话,可能在 Virtual Generated Column 上建立索引更加合适,一般情况下,都使用 Virtual Generated Column,这也是 MySQL 默认的方式。 ...

August 14, 2020 · 1 min · 160 words · Me

Composer vendor 提交至 Git

应该将 vendor 提交到 Git 吗 一般建议是 不。vendor 目录应添加到 .gitignore。 最佳实践是让所有开发人员使用 Composer 来安装依赖项。类似地,构建服务器、CI、部署工具等都应该作为项目启动的一部分来运行 Composer。 虽然在某些环境下这样做很诱人,但也会导致一些问题: 大型 VCS 存储库的大小和更新代码时的差异。 在你自己的 VCS 复制你所有依赖的历史。 将通过 git 安装的依赖项添加到 git repo 中将显示为 submodules。这是有问题的,因为它们不是真正的 submodules,您将会遇到问题。 如果你真的觉得你必须这样做,你有几个选择: 限制自己安装带标记的版本(没有 dev 版本),这样就只能安装压缩版,并避免与 git submodules 有关的问题。 Use --prefer-dist or set preferred-install to dist in your config. Remove the .git directory of every dependency after the installation, then you can add them to your git repo. You can do that with rm -rf vendor/\*\*/.git in ZSH or find vendor/ -type d -name ".git" -exec rm -rf {} \; in Bash. 但这意味着您必须在运行 composer 更新之前从磁盘中删除这些依赖项。 Add a .gitignore rule /vendor/**/.git to ignore all the vendor .git folders. 这种方法不需要在运行编写器更新之前从磁盘删除依赖项。 我的做法 问题解决了,但是不确信做法是否正确。 ...

August 10, 2020 · 1 min · 142 words · Me

tcpdump 入门使用

tcpdump 是类 Unix 系统上最常用、最轻量的网络抓包与分析工具。它直接调用 libpcap 库,在内核层抓取链路层的数据包,然后解析输出文本格式的"数据包头部摘要",也可将原始数据保存为 pcap 文件供 Wireshark 等 GUI 工具进一步分析。 字多不看 sudo tcpdump host httpforever.com and tcp port 80 -A -nn 一举成名天下知 man tcpdump 常用参数速查 参数 作用 -i 指定接口(不指定默认第一个可用接口) -nn 不解析主机名和端口名(仅显示数字) -v/-vv/-vvv 详细级别(-v/-vv/-vvv) -c 捕获指定数量后退出 -s 抓取长度(0 = 全包;新版默认 262144 bytes) -w 将原始数据写入 pcap 文件 -r 读取 pcap 文件离线解析 -A / -X 以 ASCII / 十六进制+ASCII 方式打印负载 -i any 监听所有的网卡 -A 只使用 ASCII 打印报文的全部数据,不要和 -X 一起使用。截取 HTTP 请求的时候可以用 sudo tcpdump -nSA port 80 -S 显示绝对的序列号(sequence number),而不是相对编号 过滤语法 tcpdump 采用 BPF 过滤语法(Berkeley Packet Filter): ...

June 29, 2020 · 4 min · 647 words · Me, LLM

配置 Laradock PhpStorm Xdubug

最近在学习 Yii2 的源码,为了方便调试所以研究下 Laradock + PhpStorm + Xdubug 的配置。 环境 macOS Laradock v10.0 请保证 Laradock 是最新的版本,可以减少不必要的麻烦。也推荐使用我精简过的项目 imzyf/my-dock | github。 配置 Laradock vim .env WORKSPACE_INSTALL_XDEBUG=true PHP_FPM_INSTALL_XDEBUG=true 重新编译 php-fpm 和 workspace 容器: docker-compose build php-fpm workspace 配置 PhpStorm 配置 Docker Preferences > Build, Execution, Deploymnent > Docker 配置 PHP Preferences > Languages & Frameworks > PHP,PHP CLI Interpreter 点 ... 点击 +,选择 From Docker, Vagrant… ...

May 26, 2020 · 1 min · 137 words · Me

PHP float 精度

实例 1 $a = 1.1; var_dump(gettype($a)); // string(6) "double" var_dump($a); // float(1.1) 实例 2 $a = "123456789.1100110011"; $a = (float) $a; var_dump($a); // float(123456789.11001) var_dump(sprintf('%.11f', $a)); // string(21) "123456789.11001099646" $b = 123456789.11001; var_dump($b); // float(123456789.11001) var_dump(sprintf('%.11f', $b)); // string(21) "123456789.11000999808" $c = '123456789.1100110011'; $c = (float) $c; var_dump($c); // float(123456789.11001) $c = (string) $c; var_dump($c); // string(15) "123456789.11001" $c = (float) $c; var_dump($c); // float(123456789.11001) var_dump(sprintf('%.11f', $c)); // string(21) "123456789.11000999808" var_dump($a === $b); // bool(false) - 说明 $a 还是携带着 float 的精度 var_dump($b === $c); // bool(true) 实例 3 // # 1 var_dump(120085 === 1200.85 * 100); // bool(false) // # 2 var_dump(120085 == 1200.85 * 100); // bool(false) // # 3 var_dump(120081 == 1200.81 * 100); // bool(true) // # 4 var_dump(120085 - 1200.85 * 100); // float(1.4551915228367E-11) 实例 4 $a = 0.1; $b = 0.9; $c = 1; var_dump(($a + $b) == $c); // bool(true) var_dump(($c - $b) == $a); // bool(false) var_dump(sprintf('%.20f', $a + $b)); // string(22) "1.00000000000000000000" var_dump(sprintf('%.20f', $c - $b)); // string(22) "0.09999999999999997780" var_dump((0.5 - 0.25) === 0.25); // bool(true) 0.5 二进制 0.1,0.25 二进制 0.01 var_dump((0.25 + 0.25) === 0.5); // bool(true) 实例 5 $n = 19.99; dump($n * 100); // 1999.0 dump((int) ($n * 100)); // 1998 !!! dump((string) ($n * 100)); // "1999" dump((int) (string) ($n * 100)); // 1999 dump(round($n * 100)); // 1999.0 !!! dump((int) round($n * 100)); // 1999 分析 看文档: ...

May 9, 2020 · 3 min · 428 words · Me

IDE Snippet

PhpStorm PhpStorm 使用经验 | ZYF.IM Cursor 备份扩展 cursor --list-extensions > cursor_extensions.txt xargs -L 1 cursor --install-extension < cursor_extensions.txt VSCode 配置文件 ~/Library/Application\ Support/Cursor/User/settings.json ~/Library/Application\ Support/Cursor/User/keybindings.json 编辑 settings.json command + , 右上角点击 Open Settings(JSON)。 { "terminal.integrated.fontSize": 14, "window.zoomLevel": 1.4, "editor.fontSize": 14, "editor.wordWrapColumn": 300, "editor.renderWhitespace": "all", } VIM 常用 全选(高亮显示):按 esc 后,然后 ggvG 或者 ggVG 全部复制:按 esc 后,然后 ggyG 全部删除:按 esc 后,然后 dG 粘贴到终端 vim 缩进错乱 stackoverflow 在 vim 中粘贴前先输入: :set paste 原因:在终端的 vim 中没有相应的程序来处理这个从其他应用复制粘贴的过程,所以 vim 通过插入键盘输入的 buffer 来模拟这个粘贴的过程,这个时候 vim 会以为这是用户输入的。 ...

April 28, 2020 · 1 min · 98 words · Me, LLM

PHP GD 入门使用

GD 安装、配置 考虑到功能需要使用字体库、图像格式 jpeg\png 所以先安装相关库。 字体库 FreeType 2 https://www.freetype.org/ # 在临时目录进行操作 cd /tmp # https://download.savannah.gnu.org/releases/freetype/ wget http://download.savannah.gnu.org/releases/freetype/freetype-2.10.1.tar.gz tar zxvf freetype-2.10.1.tar.gz cd freetype-2.10.1 ./configure --prefix=/usr/local/freetype && make && make install 图像格式 jpeg cd /tmp # http://www.ijg.org/ wget http://www.ijg.org/files/jpegsrc.v9d.tar.gz tar zxvf jpegsrc.v9.tar.gz cd jpeg-9/ ./configure --prefix=/usr/local/jpeg && make && make install 图像格式 png cd /tmp # http://www.libpng.org/pub/png/libpng.html wget https://download.sourceforge.net/libpng/libpng-1.6.37.tar.gz --no-check-certificate tar zxvf libpng-1.6.37.tar.gz cd libpng-1.6.37 ./configure --prefix=/usr/local/libpng && make && make install 安装 GD ...

April 16, 2020 · 1 min · 212 words · Me

PHP Code Snippet

PHP Sandbox Online PHP editor | 3v4l.org PHP Sandbox | onlinephp.io PHP.net Supported Versions | PHP.net Unsupported Branches | PHP.net References PHP News, Articles, Upcoming Changes, and more | PHP.Watch brew tap shivammathur/php brew tap shivammathur/extensions PHP CLI # 查看 PHP 编译时的参数 php -r "phpinfo();" | grep configure # 查看 .ini 配置文件路径 php --ini php -r "phpinfo();" | grep "Configuration File" # 查看 Modules php -m # 显示 PHP 信息 php -i php -i | grep -E "Loaded Configuration|Scan this dir" php -r "echo ini_get('memory_limit');" php -r "phpinfo();" | grep memory # 显示扩展配置 php --ri gd # 检查扩展是否存在 php --re decimal # 交互式运行模式。具有函数、常量、类名、变量、静态方法调用和类常量的 `tab` 补全功能 # http://php.net/manual/en/features.commandline.interactive.php php -a # 检查 PHP-FPM 配置文件语法 php-fpm -tt Snippets // 临时设置最大内存占用 ini_set('memory_limit', '1024M'); // 设置脚本最大执行时间为 0 永不过期 set_time_limit(0); Composer aliyun repo 阿里云 Composer 全量镜像 ...

April 15, 2020 · 2 min · 290 words · Me