程序员茄子
全部
编程
代码
资讯
案例
综合
联系我们
软件定制开发/软件按需定制 技术文章
php
mysql
shell
go
vue
css
api接口对接
支付接口对接
同一个 DELETE,changes() 返回 1,total_changes 涨了 3
编程
同一个 DELETE,changes() 返回 1,total_changes 涨了 3
2026-11-07 00:05:59
RowsAffected 到底数了什么:SQLite 的 sqlite3_changes 只算语句直接改的行,total_changes 连触发器程序和外键级联一起算,却不含 REPLACE 消解。给出五个可复现探针,以及触发器内读 changes() 的保存/恢复陷阱、INSTEAD OF 视图恒为 0、expo-sqlite 与 bun 的真实踩坑,最后说明判「命中」与判「真变」为什么必须分开。
RowsAffected
SQLite
影响行数
触发器
外键级联
Go
数据库
mailq 里一堆 deferred 不是卡住:Postfix 的 300s/4000s 退避与 relayhost 单点吞吐
编程
mailq 里一堆 deferred 不是卡住:Postfix 的 300s/4000s 退避与 relayhost 单点吞吐
2026-11-07 00:04:42
mailq 里 deferred 邮件的重试时间戳总在往后跳,多半是 4xx 指数退避而不是队列卡住。整理 Postfix 2.4 起的默认值(queue_run_delay/minimal_backoff_time 各 300s、maximal_backoff_time 4000s、maximal_queue_lifetime 5d)、dead 目的地判定(failed_cohort_limit 默认 1、只算连接与握手失败)、relayhost 单点的吞吐算术,以及 transport 分 lane 的参数覆盖写法与排查命令。
Postfix
邮件队列
qmgr
relayhost
邮件服务器
退避
wget 遇 503 不进重试直接退出码 8:-t 20 只管网路中断,--retry-on-http-error 要自己开
编程
wget 遇 503 不进重试直接退出码 8:-t 20 只管网路中断,--retry-on-http-error 要自己开
2026-11-07 00:04:32
wget 默认 -t 20 只重试连接中断和读超时,HTTP 503/429 会直接以退出码 8 结束,日志里连 Retrying. 都没有。这篇按手册核对重试边界:--waitretry 线性退避默认 10 秒、read timeout 默认 900 秒、--retry-on-http-error 从 1.19.1 才有且官方不推荐,并给出退出码 0-8 的分支判断、-c 与 -O 共用会截断文件的原因,以及可直接抄的 flock + sha256sum 脚本。
wget
Shell
运维
下载工具
CodeQL 报 No code found during the build:exit 32 多半是构建缓存命中,编译器一次都没被调用
编程
CodeQL 报 No code found during the build:exit 32 多半是构建缓存命中,编译器一次都没被调用
2026-11-07 00:04:27
构建步骤成功、CodeQL analyze 却报 No source code was seen during the build / exit 32,根因常常是 Gradle、Bazel、dotnet 的构建缓存命中,编译器整场缺席,tracer 抽到 0 个文件。给出 debug-artifacts、build-tracer.log、src.zip 对比、本地建库四步排查,以及手动构建与 build-mode: none 两种修法的取舍。
代码扫描
SAST
CodeQL
静态分析
GitHub
Actions
CI
MySQL GET_LOCK 排查:metadata_locks 里 OWNER_THREAD_ID 不是连接 ID,重复取锁也不加行
编程
MySQL GET_LOCK 排查:metadata_locks 里 OWNER_THREAD_ID 不是连接 ID,重复取锁也不加行
2026-11-07 00:04:16
MySQL 5.7.5 起 GET_LOCK 由 MDL 实现,用户锁在 performance_schema.metadata_locks 里 OBJECT_TYPE='USER LEVEL LOCK'、LOCK_DURATION='EXPLICIT'。给出按名字查持有者与 PENDING 等待者的 SQL、OWNER_THREAD_ID 经 threads 换 PROCESSLIST_ID 才能 KILL 的原因、递归取锁只留一行的计数语义,以及超时返回 0 / 出错返回 NULL、3058 不回滚事务、@@lock_wait_timeout 无效的边界。
advisory-lock
MySQL
咨询锁
performance_schema
MDL
锁排查
Uncloud v0.22 部署笔记:没有控制面,用 WireGuard mesh 和 CRDT SQLite 管 Docker 集群
编程
Uncloud v0.22 部署笔记:没有控制面,用 WireGuard mesh 和 CRDT SQLite 管 Docker 集群
2026-11-06 21:32:10
Uncloud 用 WireGuard mesh 加 CRDT SQLite(corrosion)在多台 Docker 主机间同步集群状态,没有控制面和 quorum。笔记给出 uc machine init / uc run -p 域名:端口/https 的可复现步骤,讲清 gRPC over SSH、Caddy global 模式做 ingress、unregistry 直推镜像,并记录 v0.22.0 的原地改资源限制、uc image rm、m.internal DNS,以及 caddy deploy 会重签证书与机器名必须是 DNS label 两个升级坑。
docker
部署
运维
Go
NGINX upstream keepalive 实测:配了 keepalive 16,后端连接数仍是 15557 条
综合
NGINX upstream keepalive 实测:配了 keepalive 16,后端连接数仍是 15557 条
2026-11-06 21:31:05
NGINX 只写 keepalive 16 不会复用连接:给出 upstream keepalive + proxy_http_version 1.1 + 清空 Connection 头三段式配置,并用四组对照压测说明半配置为何会静默产生 8 千多次 prematurely closed、端口耗尽的 [crit] 报错为何被 grep 漏掉,以及如何用 ss 和 upstream_connect_time 验证复用真的生效。
nginx
运维
反向代理
502
别用 overrides 把 rolldown 1.3.0 塞进 Vite 8.3.6:它锁着版本,HMR 与构建会踩空
代码
别用 overrides 把 rolldown 1.3.0 塞进 Vite 8.3.6:它锁着版本,HMR 与构建会踩空
2026-11-06 21:07:17
Rolldown 1.3.0 官方提醒别用 overrides/resolutions 强塞进 Vite:Vite 8.3.6 及更早需要改动才能配合,版本是锁死的。本文说明锁版本背后的 lockstep 假设、overrides 如何污染 lockfile、先升 Vite 再升 rolldown 的顺序、三包管理器自检命令,以及实验性 import attributes 的隔离做法。
Vite
Rolldown
前端构建
依赖管理
OpenSSL 4.0 的十六进制输出变了两处:去掉多余的 00: 前缀,dump 宽度改成 24/16 字节
综合
OpenSSL 4.0 的十六进制输出变了两处:去掉多余的 00: 前缀,dump 宽度改成 24/16 字节
2026-11-06 21:07:07
OpenSSL 4.0 改了十六进制打印:最高字节 >= 0x80 时不再多打 00:,dump 宽度统一为签名 24 字节、其它 16 字节。靠 grep ^00:、按列宽 cut 或按行数拼 hex 的脚本会静默错位。含两版本 diff 复现、指纹与 DER 比对替代方案、多行输出聚合写法与升级自检清单。
OpenSSL
Shell
运维
证书
OpenSSL 4.0 把 SM2 的默认区分标识符改成 1234567812345678:老签名的国密验签会突然不通过
代码
OpenSSL 4.0 把 SM2 的默认区分标识符改成 1234567812345678:老签名的国密验签会突然不通过
2026-11-06 21:05:13
OpenSSL 4.0 把 SM2 签名的默认区分标识符从空串改成 1234567812345678,导致存量国密签名验不过而证书链看起来完全正常。本文解释 distid 如何进入 Z 值与摘要、给出 3.x 与 4.0 交叉验签的复现命令、distid: 空值的两种命令行写法,以及应用层显式设置的建议。
OpenSSL
SM2
国密
签名验签
x509
MySQL 26.10 的 Health Monitor 进了社区版:默认只看不拦,磁盘快满也不会把你踢成只读
编程
MySQL 26.10 的 Health Monitor 进了社区版:默认只看不拦,磁盘快满也不会把你踢成只读
2026-11-06 21:05:06
MySQL 26.10 把 Health Monitor 组件带入社区版:通过 Performance Schema 看磁盘、内存、CPU、进程信息,并给出磁盘容量预测。低磁盘 fencing 默认关闭,意味着它只观察不拦截。本文讲清默认只监控数据目录的盲区、与 mysqld_exporter 的分工、启用 fencing 前要定的策略。
MySQL
运维
监控
容量规划
ALTER TABLE 报 Row size too large 未必是你真的超了:MySQL 9.7.4 把行大小校验退回旧口径
编程
ALTER TABLE 报 Row size too large 未必是你真的超了:MySQL 9.7.4 把行大小校验退回旧口径
2026-11-06 21:04:04
MySQL 9.7.0 的 InnoDB 死锁修复让行大小估算变准,也把 CREATE/ALTER TABLE 的校验改严,存量表定义被拒并报 Row size too large。9.7.4 与 8.4.11 恢复旧校验,但 ALGORITHM=INSTANT 仍走严格算法。含三条快速定性对照、列宽估算 SQL 与处理顺序。
MySQL
InnoDB
DDL
升级迁移
real_escape_string 在双引号里并不安全:PHP 8.6 的 mysqli_quote_string 连引号一起处理
代码
real_escape_string 在双引号里并不安全:PHP 8.6 的 mysqli_quote_string 连引号一起处理
2026-11-06 21:03:56
PHP 8.6 新增 mysqli_quote_string,按连接 SQL 模式选引号样式并包起来。real_escape_string 的输出在双引号里配合 NO_BACKSLASH_ESCAPES 并不安全,本文给出可复现注入样例、quote_string 返回值已带引号别再套一层、标识符仍须白名单,以及 8.5 及以下的自写替代。
PHP
MySQL
SQL注入
安全
PHP 8.6 的 pack()/unpack() 能写端序了:s</>、l</>、q</> 与 f<、d> 的用法和 ValueError 边界
代码
PHP 8.6 的 pack()/unpack() 能写端序了:s</>、l</>、q</> 与 f<、d> 的用法和 ValueError 边界
2026-11-06 21:03:11
PHP 8.6 的 pack()/unpack() 支持在 s/S/l/L/q/Q 及 f/d 后写 < 与 > 指定端序,替代手写移位拼高低字。文中给支付与硬件协议头的打包解包写法、unpack 偏移与键名、有符号取舍、Java ByteBuffer 与 C struct 对齐对照,以及 v/n/V/N/g/G/e/E 上加修饰符抛 ValueError 的边界。
PHP
二进制协议
pack
接口对接
PHP 8.6 的 trim() 开始默认剥掉换页符 \f:签名串、CSV 和粘贴文本都会变
编程
PHP 8.6 的 trim() 开始默认剥掉换页符 \f:签名串、CSV 和粘贴文本都会变
2026-11-06 21:03:00
PHP 8.6 把换页符 \f(0x0C)加入 trim/ltrim/rtrim 的默认字符集。参与签名清洗的字段、CSV 行解析、粘贴留证文本都会因此悄悄变值;历史数据里带 \f 的那批会突然验签失败。含复现片段、grep/INSTR 存量排查与显式传字符集保证跨版本一致的写法。
PHP
字符串处理
签名
升级迁移
Go 1.28 的 Range 请求超过 200 段就整段忽略:断点续传与分片下载会退回整包
编程
Go 1.28 的 Range 请求超过 200 段就整段忽略:断点续传与分片下载会退回整包
2026-11-06 21:02:02
Go 1.28 对 FileServer/ServeContent 等入口限制 Range 头段数,超过 httpservecontentmaxranges(默认 200)就整段忽略,返回 200 全量而不是 206,断点续传和分片下载会静默失效。该默认值已回溯到 1.27.2 与 1.26.9。含 curl 构造 201 段的验证方法与关闭限制的取舍。
Go
HTTP
文件下载
GODEBUG
Go 1.28 加了 netmarshal,默认还是 0:JSON 里的 IPMask 与 IPNet 仍是一串 base64
编程
Go 1.28 加了 netmarshal,默认还是 0:JSON 里的 IPMask 与 IPNet 仍是一串 base64
2026-11-06 21:01:54
Go 1.28 新增 netmarshal,控制 net.IPMask、net.IPNet、net.HardwareAddr 的 JSON 是读数 base64 还是可读文本。1.28/1.29 默认仍为 0,预计 1.30 才翻转。文中给出两种编码对照、go.mod 的 godebug 固定方式、灰度期混合版本会怎么炸,以及哪些场景才值得打开。
Go
GODEBUG
序列化
JSON
crypto/tls 的 Read/Write 每次都白付一次 deferreturn:2 万连接 profile 里占 2.7% CPU
编程
crypto/tls 的 Read/Write 每次都白付一次 deferreturn:2 万连接 profile 里占 2.7% CPU
2026-11-06 20:03:33
Go 标准库 crypto/tls 的 handshakeContext 有四处未开放编码的 defer,握手完成后的原子早返回也要走 runtime.deferreturn。2 万条长连接广播的 profile 里这部分占整机 2.7% CPU,同形状基准 7.2ns/op 对 2.1ns/op。给出 -d=defer 的验证方法与拆分写法。
Go
TLS
性能优化
Go IM 消息存储拆解:100 条一桶的 Mongo 分桶、幂等写入与三个线上 bug
案例
Go IM 消息存储拆解:100 条一桶的 Mongo 分桶、幂等写入与三个线上 bug
2026-11-06 20:02:57
拆解 OpenIM 系 IM-Server 的消息存储:为什么聊天记录不用 MySQL、一条消息一文档死在哪、100 条一桶的 Bucket Pattern 如何用 (seq-1)/100 定位,Kafka 重复消费下的幂等写入状态机,读时改写让一条群消息只存一份,以及 del_list 无界增长、IsFull 空数组 panic、桶大小写死寻址无法迁移这些真实问题。
Go
MongoDB
存储设计
IM
服务端提前返回 502 后,Go 的 writeLoop 还在读你的 buffer
编程
服务端提前返回 502 后,Go 的 writeLoop 还在读你的 buffer
2026-11-06 20:01:53
复现并解释 Go 的一个数据竞争:服务端只看请求头就提前回 502 时,http.Transport 的 writeLoop 仍在后台按 32KiB 读请求体,而调用方已经开始重试、复用同一块 buffer。拆开 persistConn 的 writeLoop/readLoop 与 roundTrip 的 select,说明文档约定、真实后果,以及 vmagent 为何故意保留这个竞争、vmauth 为何必须修。
Go
并发
HTTP
数据竞争
接口签名总对不上:%20 变 +、漏编码 !'()*、键序被 locale 改过
代码
接口签名总对不上:%20 变 +、漏编码 !'()*、键序被 locale 改过
2026-11-06 09:02:20
前端签名能过、后端复算不一致,问题多半在待签名串而不在算法。这篇按踩坑频率列出八处字节级差异:空格编成 %20 还是 +、encodeURIComponent 保留的 !'()*、quote 的 safe 默认值、排序受 locale 影响、空值与 undefined 的剔除规则、数组编码,以及 body 被重新序列化后验签必挂。附两端签名原文对比的四步排查法。
接口对接
签名
URL编码
PHP
Go
小程序虚拟支付 paySig 验不过:signData 不能重新序列化,iOS 走的是 Apple IAP
代码
小程序虚拟支付 paySig 验不过:signData 不能重新序列化,iOS 走的是 Apple IAP
2026-11-06 09:01:25
小程序虚拟支付和 JSAPI 不是一套链路:服务端只出签名,下单在客户端。本文按报错分诊:paySig 与 signature 两把密钥怎么配、signData 被 JSON 重排后为什么必报 -15006、session_key 被 wx.login 刷掉的表现,以及发货推送幂等键为何要用平台单号、iOS 只能走 Apple 现网环境。附错误码对照与真机联调清单。
微信小程序
虚拟支付
支付对接
HMAC
幂等
Rspamd 不出 BAYES_SPAM:min_learns 是 ham/spam 各自 200,不是总数
编程
Rspamd 不出 BAYES_SPAM:min_learns 是 ham/spam 各自 200,不是总数
2026-11-06 00:04:39
Rspamd 训练了几百封邮件却始终不出 BAYES_SPAM/BAYES_HAM,日志里那句 "skip classification as ham class has not enough learns: 23, 200 required" 就是答案:min_learns=200 是每个类各自的门槛。文中给默认 statistic.conf、配置该放 local.d/classifier-bayes.conf(不能与 local.d/statistic.conf 并用)、Redis 后端 servers 写 localhost 的双栈坑、autolearn 三种写法与"符号已存在就不学"的限制、rspamc learn_spam/stat 核对与 bayes_expiry 维护。
Rspamd
邮件服务器
反垃圾邮件
Bayes
运维实战
SA5011 说这里会 nil 解引用:证据其实是你自己写的那句 if x == nil
编程
SA5011 说这里会 nil 解引用:证据其实是你自己写的那句 if x == nil
2026-11-06 00:04:18
staticcheck 的 SA5011 不是「这里一定 nil」,而是把你自己写过的 nil 比较当作证据。本文拆它的判定组合,讲清三类误报(多余的第二次检查、测试里 t.Fatal 之后、自定义 Fatalf 不被识别为终止函数)、golangci-lint facts 缓存导致的抖动,以及 2026.2 停用 SA5011 后 gopls nilness 的替代与取舍。
SA5011
staticcheck
Go
lint
nilness
大家都在搜索什么?
devops
易支付
一个官网+多少钱
统一接受回调
统一回调
python
sub
node
宝塔日志
mysql
shell
ElasticSearch
css
vue
api接口对接
2025
支付接口对接
go
php
php回调
上一页
1
2
3
4
5
6
7
…
347
下一页
共 347 页
到第
页
确定