Centos7 编译安装 PHP grpc protobuf 扩展(宝塔环境)

以PHP7.2为例 编译安装 grpc 扩展 (注意 grpc 版本对应的 protobuf 版本号) # 下载解压 grpc cd ~ wget http://pecl.php.net/get/grpc-1.30.0.tgz tar xvf grpc-1.30.0.tgz cd grpc-1.30.0 # 生成配置并编译安装(编译安装时间较长, 耐心等待) /www/server/php/72/bin/phpize ./configure --with-php-config=/www/server/php/72/bin/php-config make && make install # 配置PHP扩展, 重启PHP服务, 清理下载文件 echo "extension = grpc.so" >> /www/server/php/72/etc/php.ini /etc/init.d/php-fpm-72 reload /www/server/php/72/bin/php -m|grep -i gRPC cd .. && rm -rf grpc-1.30.0* 编译安装 protobuf 扩展 # 下载解压 protobuf cd ~ wget http://pecl.php.net/get/protobuf-3.12.2.tgz tar xvf protobuf-3.12.2.tgz cd protobuf-3.12.2 # 生成配置并编译安装(编译安装时间较长, 耐心等待) /www/server/php/72/bin/phpize ./configure --with-php-config=/www/server/php/72/bin/php-config make && make install # 配置PHP扩展, 重启PHP服务, 清理下载文件 echo "extension = protobuf.so" >> /www/server/php/72/etc/php.ini /etc/init.d/php-fpm-72 reload /www/server/php/72/bin/php -m|grep -i protobuf cd .. && rm -rf protobuf-3.12.2* grpc 版本对应的 protobuf 版本号 grpc protobuf grpc protobuf grpc protobuf v1.0.0 3.0.0(GA) v1.12.0 3.5.2 v1.22.0 3.8.0 v1.0.1 3.0.2 v1.13.1 3.5.2 v1.23.1 3.8.0 v1.1.0 3.1.0 v1.14.2 3.5.2 v1.24.0 3.8.0 v1.2.0 3.2.0 v1.15.1 3.6.1 v1.25.0 3.8.0 v1.2.0 3.2.0 v1.16.1 3.6.1 v1.26.0 3.8.0 v1.3.4 3.3.0 v1.17.2 3.6.1 v1.27.3 3.11.2 v1.3.5 3.2.0 v1.18.0 3.6.1 v1.28.1 3.11.2 v1.4.0 3.3.0 v1.19.1 3.6.1 v1.29.0 3.11.2 v1.6.0 3.4.0 v1.20.1 3.7.0 v1.30.0 3.12.2 v1.8.0 3.5.0 v1.21.3 3.7.0 链接 宝塔 - 安装第三方PHP扩展示例 grpc.io github - grpc/src/php pecl- protobuf pecl- gRPC

2025 年 11 月 14 日 · 阅读时长 1 分钟 · 共 312 字 · DeleyNomore

gogs 标签模板

#007bff 分类:功能缺陷 #007bff 分类:优化改进 #007bff 分类:新增功能 #007bff 分类:文档修改 #007bff 分类:问题讨论 #007bff 分类:求助 #28a745 环境:正式服 #28a745 环境:测试服 #28a745 环境:其他 #ffc107 进度:待确认 #ffc107 进度:已忽略 #ffc107 进度:开发中 #ffc107 进度:测试中 #ffc107 进度:已上线 #dc3545 优先级:紧急 #e83e8c 优先级:高 #dc96e8 优先级:中 #f3b4b5 优先级:低

2025 年 11 月 14 日 · 阅读时长 1 分钟 · 共 126 字 · DeleyNomore

Linux Shell 命令 fdisk mkfs mount fuser (硬盘分区 挂载)

Linux 硬盘 在 Linux 中,外围设备都位于 /dev 挂载点,内核通过以下的方式理解硬盘: /dev/hdX[a-z]: IDE 硬盘被命名为 hdX /dev/sdX[a-z]: SCSI 硬盘被命名为 sdX /dev/xdX[a-z]: XT 硬盘被命名为 xdX /dev/vdX[a-z]: 虚拟硬盘被命名为 vdX /dev/fdN: 软盘被命名为 fdN /dev/scdN or /dev/srN: CD-ROM 被命名为 /dev/scdN 或 /dev/srN fdisk 硬盘分区命令 用法: fdisk [options] <disk> 更改分区表 fdisk [options] -l [<disk>] 列出分区表 显示或操作磁盘分区表。 选项: -b, --sector-size <size> 物理和逻辑扇区大小 -B, --protect-boot 在创建新标签时不删除引导位 -c, --compatibility[=<mode>] 模式为"dos"或"nondos"(默认) -L, --color[=<when>] 对输出着色(auto|always|never) 默认情况下启用颜色 -l, --list 显示分区并退出 -o, --output <list> 输出列 -t, --type <type> 只识别指定的分区表类型 -u, --units[=<unit>] 显示单位: 圆柱体:"cylinders" 或 扇区:"sectors" (默认值) -s, --getsz 以512字节扇区显示设备大小[已弃用] --bytes 以字节而不是人类可读的格式打印大小 -w, --wipe <mode> 擦除签名(自动、始终或从不) (auto|always|never) -W, --wipe-partitions <mode> 从新分区擦除签名(自动、始终或从不) (auto|always|never) -C, --cylinders <number> 指定硬盘的柱面数 -H, --heads<number> 指定硬盘的磁头数 -S, --sectors <number> 指定每个磁道的扇区数,用于分区表,一个合理的数值是63 -h, --help 显示此帮助 -V, --version 显示版本 可用输出列: gpt: 设备开始-结束扇区大小类型 Type-UUID Attrs名称UUID dos: 设备起始端扇区柱面大小类型 Id Attrs Boot End-C/H/S Start-C/H/S bsd: 切片开始结束扇区柱面大小类型 Bsize Cpg Fsize sgi: 设备起始端扇区柱面大小类型Id属性 sun: 设备开始结束扇区柱面大小类型Id标志 有关详细信息,请参见fdisk(8)。 --------------------------------------------------------------------- 更改分区表 [帮助] DOS(MBR) a 切换可引导标志 b 编辑嵌套BSD disklabel c 切换dos兼容性标志 通用: d 删除分区 F 列出未划分的可用空间 l 列出已知分区类型 n 添加新分区 p 打印分区表 t 更改分区类型 v 验证分区表 i 打印分区信息 其他: m 打印此菜单 u 更改显示/输入单位 x 额外功能(仅限专家) 脚本: I 从sfdisk脚本文件加载磁盘布局 O 将磁盘布局转储到sfdisk脚本文件 保存并退出: w 将表写入磁盘并退出 q 不保存更改就退出 创建新标签: g 创建一个新的空GPT分区表 G 创建一个新的空SGI(IRIX)分区表 o 创建一个新的空DOS分区表 s 创建一个新的空Sun分区表 mount 挂载设备命令 语法: mount [-hV] mount -a [-fFnrsvw] [-t vfstype] mount [-fnrsvw] [-o options [,...]] device | dir mount [-fnrsvw] [-t vfstype] [-o options] device dir -V:显示程序版本 -h:显示辅助讯息 -v:显示较讯息,通常和 -f 用来除错。 -a:将 /etc/fstab 中定义的所有档案系统挂上。 -F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。 -f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。 -n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。 -s-r:等于 -o ro -w:等于 -o rw -L:将含有特定标签的硬盘分割挂上。 -U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。 -t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。 -o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。 -o sync:在同步模式下执行。 -o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。 -o auto、-o noauto:打开/关闭自动挂上模式。 -o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async. -o dev、-o nodev-o exec、-o noexec允许执行档被执行。 -o suid、-o nosuid: 允许执行档在 root 权限下执行。 -o user、-o nouser:使用者可以执行 mount/umount 的动作。 -o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。 -o ro:用唯读模式挂上。 -o rw:用可读写模式挂上。 -o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。 扩展笔记 : Linux 下第一块磁盘标记为 /dev/sda ...

2025 年 11 月 14 日 · 阅读时长 6 分钟 · 共 2699 字 · DeleyNomore

Mysql 查询同一名字下时间差小于 5 秒的记录

题目如下 SQL 数据样本 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名字', `time` datetime(0) NOT NULL COMMENT '时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 106 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (2, '张三', '2021-04-19 00:00:00'); INSERT INTO `user` VALUES (6, '李四', '2021-04-19 01:00:00'); INSERT INTO `user` VALUES (10, '王五', '2021-04-19 02:00:00'); INSERT INTO `user` VALUES (15, '张三', '2021-04-19 00:00:02'); INSERT INTO `user` VALUES (19, '王五', '2021-04-19 02:00:04'); INSERT INTO `user` VALUES (20, '李四', '2021-04-19 03:00:20'); INSERT INTO `user` VALUES (100, '张三', '2021-04-01 00:00:00'); INSERT INTO `user` VALUES (101, '李四', '2021-04-17 11:00:00'); INSERT INTO `user` VALUES (102, '王五', '2021-04-14 19:00:00'); INSERT INTO `user` VALUES (103, '张三', '2021-04-05 02:29:02'); INSERT INTO `user` VALUES (104, '王五', '2021-04-10 11:45:31'); INSERT INTO `user` VALUES (105, '李四', '2021-04-08 20:14:48'); Mysql 5.7 解题参考: SELECT u.`id`, u.`name`, u.`time` FROM ( SELECT *, TIMESTAMPDIFF(SECOND, `time`, `time1`) as delta1, TIMESTAMPDIFF(SECOND, `time`, `time2`) as delta2 FROM ( SELECT (@r := @r + 1) r, user.`id`, user.`name`, user.`time` FROM (SELECT @r := 0) AS t, user ORDER BY user.`name`, user.`time` ) AS b LEFT JOIN ( SELECT (@r1 := @r1 + 1) r1, user.`name` as name1, user.`time` as time1 FROM (SELECT @r1 := -1) AS t1, user ORDER BY name1, time1 ) AS b1 ON b1.r1 = b.r AND b1.`name1` = b.name LEFT JOIN ( SELECT (@r2 := @r2 + 1) r2, user.`name` as name2, user.`time` as time2 FROM (SELECT @r2 := 1) AS t2, user ORDER BY name2, time2 ) AS b2 ON b2.r2 = b.r AND b2.`name2` = b.name ORDER BY b.r ) AS u WHERE (u.delta1 <= 5 AND u.delta1 >= -5) OR (u.delta2 <= 5 AND u.delta2 >= -5) Mysql 8.0 解题参考: SELECT NAME , `time` FROM ( SELECT NAME, `time`, UNIX_TIMESTAMP(`time`) - UNIX_TIMESTAMP(pre_time) AS pre_delta, UNIX_TIMESTAMP(last_time) - UNIX_TIMESTAMP(`time`) AS last_delta FROM ( SELECT NAME, `time`, lag(`time`, 1) over (PARTITION BY NAME ORDER BY `time`) AS pre_time, lead(`time`, 1) over (PARTITION BY NAME ORDER BY `time` ) AS last_time FROM `user` ) t) t WHERE pre_delta <= 5 OR last_delta <= 5 原理 ...

2025 年 11 月 14 日 · 阅读时长 2 分钟 · 共 569 字 · DeleyNomore

MySql 获取每个分组最新 10 条记录 自定义变量

SELECT a.* FROM ( SELECT t1.*, @curr_cnt := t1.type AS curr_type, @rank := IF( @prev_cnt = @curr_cnt, @rank + 1, 1 ) AS rank, @prev_cnt := @curr_cnt AS prev_type FROM `goods` AS t1, ( SELECT @curr_cnt := 0, @prev_cnt := 0, @rank := 0 ) AS t2 ORDER BY t1.type, t1.addtime DESC ) AS a WHERE a.rank <= 10 查询逻辑 对 goods 表进行排序,先按分类 type 正序,再按上架时间 addtime 倒序 `goods` AS t1, ...中间省略 ORDER BY t1.type, t1.addtime 初始化变量,相当于 SET @curr_cnt := 0, @prev_cnt := 0, @rank := 0; SELECT @curr_cnt := 0, @prev_cnt := 0, @rank := 0 按分类进行编号,当 type 与上一条记录的 type 相同时编号 +1, 不同时编号重置为 1 @curr_cnt := t1.type AS curr_type, @rank := IF( @prev_cnt = @curr_cnt, @rank + 1, 1 ) AS rank, @prev_cnt := @curr_cnt AS prev_type 筛选最新上架的 10 条记录 ( 编号 < 10 ) WHERE a.rank <= 10

2025 年 11 月 14 日 · 阅读时长 1 分钟 · 共 208 字 · DeleyNomore

PHP Composer 包完全开发指南 + 多包嵌套独立 Git 版本管理

本地开发、Git 独立管理与线上部署完整解决方案 目录 介绍 问题背景 功能抽离与代码复用的艺术 框架相关包 框架无关包 抽离的时机与策略 本地开发方案对比 方案一:composer path 存储库 方案二:composer 符号链接 方案三:直接修改 vendor 目录 方案四:Git Submodules 方案五:Git Subtree 方案六:Git Worktree 方案七:Composer 私有包仓库 方案对比总结 推荐方案对比与选择 方案一:基础 Path 存储库方案 方案二:Git 独立管理增强方案 方案三:符号链接结合通配符配置方案(最佳实践) 方案一:基础 Path 存储库方案 详细步骤 工作原理解析 方案二:Git 独立管理增强方案 Git 独立管理策略 最佳实践 方案三:符号链接结合通配符配置方案(最佳实践) 方案概述 详细实施步骤 优势分析 性能优化建议 方案选择指南 实际案例:Laravel 与自定义包的独立管理 发布包到 Packagist 官方仓库 准备工作 创建 GitHub 仓库 配置 composer.json 发布到 Packagist 自动更新包版本 完整开发到发布流程 私有仓库简介 私有 Packagist 仓库 私有 Git 仓库 包的维护与协作 贡献者指南 版本更新策略 安全性考虑 常见问题解答 参考资料 介绍 在现代 PHP 开发中,代码复用和模块化设计已成为高效开发的关键。随着项目的发展,我们经常需要将特定功能从主项目中抽离出来,形成独立的可复用组件。这种抽离不仅提高了代码的可维护性,还能在多个项目间共享功能,避免重复开发。 ...

2025 年 11 月 14 日 · 阅读时长 28 分钟 · 共 13803 字 · DeleyNomore

Sublime text 手动集火教程 (windows)

备份原始 sublime_text.exe 到 sublime_text.exe.bak 转到 https://hexed.it/ -> 单击“打开文件”(sublime_text.exe) 查找十六进制:80 78 05 00 0f 94 c1 替换为 c6 40 05 01 48 85 c9 另存为(sublime_text.exe)替换源文件,完成 ...

2025 年 11 月 14 日 · 阅读时长 1 分钟 · 共 94 字 · DeleyNomore

Visual Studio 2022 安装到非系统盘完全指南

Visual Studio 是一款功能强大但庞大臃肿的集成开发环境, 尽管在安装 Visual Studio 时可以选择安装位置, 但无论如何更改安装位置,仍然会有许多组件安装到 C 盘上。 本文将详细介绍将 Visual Studio 安装到非 C 盘的步骤, 使您能够更灵活地管理您的开发环境。 ...

2025 年 11 月 14 日 · 阅读时长 2 分钟 · 共 807 字 · DeleyNomore

WSL2 安装详细过程与问题解决方案记录 + 安装 Docker Desktop

WSL2 安装详细过程与问题解决方案记录 系统环境 Windows 10 企业版 LTSC 21H2 OS 内部版本 19044.6456 目标:在不开启 Hyper-V 功能的情况下安装 Docker(使用 WSL2 后端) 完整安装流程 1. 前置条件检查 首先确认 BIOS 中已启用虚拟化: ...

2025 年 11 月 14 日 · 阅读时长 4 分钟 · 共 1607 字 · DeleyNomore

关于 package lock json 是否应该提交到 Git 仓库

关于 package-lock.json 是否应该提交到 Git 仓库,以下是经过验证的行业实践和技术分析: 主流技术社区的共识 项目类型 推荐做法 代表案例 前端应用 ✅ 必须提交 Next.js、Create-React-App Node 服务 ✅ 必须提交 Express、NestJS 开源库 ⚠️ 不提交(特殊情况除外) React、Vue、Lodash Monorepo ✅ 必须提交 Nx、Turborepo 技术原理深度解析 锁文件的作用 package-lock.json 记录精确的依赖树结构,包括: ...

2025 年 11 月 14 日 · 阅读时长 2 分钟 · 共 828 字 · DeleyNomore