Kvm.la https://www.kvm.la/ zh-CN I'm alive, I'm here! 人生的两大悲剧:想要的没得到和想要的得到了。 Tue, 27 Jan 2026 15:52:15 +0000 Tue, 27 Jan 2026 15:52:15 +0000 youtube的Shorts就是shift......... https://kvm.la/1869.html https://kvm.la/1869.html Tue, 27 Jan 2026 15:52:15 +0000 YY.K 两三年前刷过,老是重复出现看过的视频, 现在还是一点都没变。。。。。。

 

真是shi。。。。。。。。 shift

]]>
0 https://kvm.la/1869.html#comments https://kvm.la/feed/
workerman和swoole单文件静态php https://kvm.la/1868.html https://kvm.la/1868.html Tue, 20 Jan 2026 05:07:00 +0000 YY.K worker和swoole直接常驻内存运行抛弃fpm直接高效运行, 官方提供了现成的静态编译php文件,拿来直接可以运行,不用再自己吭哧吭哧再去编译,直接带上nginx就可以跑,如果将php打包成二进制文件会更简单。

 

几个相关项目发布地址

https://github.com/swoole/swoole-cli/releases
https://github.com/dixyes/phpmicro
https://github.com/crazywhalecc/static-php-cli

https://www.swoole.com/download
https://www.workerman.net/download

swoole-cli静态php

wget -O - https://github.com/swoole/swoole-cli/releases/download/v6.1.4.0/swoole-cli-v6.1.4-linux-x64.tar.xz | tar -xJ 
install swoole-cli /usr/bin/swoole

workerman官方静态php

wget https://www.workerman.net/download/php/php-8.4-linux-x86_64.tar.gz|  tar -xz

phpmicro可以打包php为二进制文件

 

swoole启动fpm

swoole-cli -P -h
# 运行 FPM
swoole-cli -P --fpm-config /opt/php-8.1/etc/php-fpm.conf -p /opt/php-8.1/var
# 关闭守护进程
swoole-cli -P --fpm-config /opt/php-8.1/etc/php-fpm.conf -p /opt/php-8.1/var -F
# 使用 root 账户启动
swoole-cli -P --fpm-config /opt/php-8.1/etc/php-fpm.conf -p /opt/php-8.1/var -F -R
]]>
0 https://kvm.la/1868.html#comments https://kvm.la/feed/
发现两个新的邮局方案mox和stalwart https://kvm.la/1867.html https://kvm.la/1867.html Sun, 18 Jan 2026 09:30:30 +0000 YY.K https://github.com/stalwartlabs/stalwart/releases

https://github.com/mjl-/mox/releases

]]>
0 https://kvm.la/1867.html#comments https://kvm.la/feed/
PostgreSQL查找慢查询 https://kvm.la/1864.html https://kvm.la/1864.html Sat, 10 Jan 2026 15:07:00 +0000 YY.K 统计CPU
ps -u postgres -o %cpu | awk '{s+=$1} END {print "Postgres Total CPU: " s "%"}'

查看活跃查询

SELECT pid, now() - query_start AS duration, query, state FROM pg_stat_activity WHERE state = 'active' ORDER BY duration DESC;
SELECT pid, now() - query_start AS duration, query, state FROM pg_stat_activity WHERE state = 'active' ORDER BY duration DESC LIMIT 5;

查看连接IP和查询语句

SELECT pid, now() - query_start AS 执行时间, usename AS 用户名, 
client_addr AS 连接IP, state AS 状态, query AS 查询语句         
FROM pg_stat_activity WHERE
 pid <> pg_backend_pid() ORDER BY 执行时间 DESC;

查看扫表

SELECT 
    relname AS 表名,
    seq_scan AS 全表扫描次数,
    seq_tup_read AS 全表扫描读取行数,
    idx_scan AS 索引扫描次数,
    idx_tup_fetch AS 索引提取行数
FROM pg_stat_user_tables
WHERE seq_scan > 0
ORDER BY seq_tup_read DESC
LIMIT 10;

启用插件

CREATE EXTENSION IF NOT EXISTS pg_stat_statements; 

 重置自动增续ID

SELECT setval('tag_id_seq', (SELECT MAX(id) FROM tag));
]]>
0 https://kvm.la/1864.html#comments https://kvm.la/feed/
nginx隐藏真实文件路径 https://kvm.la/1863.html https://kvm.la/1863.html Sat, 10 Jan 2026 06:51:00 +0000 YY.K 给浏览器浏览器返回头
$file=decode($url);
header("X-Accel-Redirect: /privatefiles/$file");

nginx配置

    location /privatefiles {
        internal;  #内部访问
        alias /var/www/html/xaccel/restrictedfiles;
    }   

 

将文件名url加密, 然后接收解密,通过X-Accel-Redirect再转给nginx返回数据。

为什么要这么做?  一些文件路径在某些原因下不想暴露真实路径,又不通过程序再去读一遍问题直接转交个nginx响应。

转载自:https://dev.to/gbhorwood/nginx-serving-private-files-with-x-accel-redirect-57dl

]]>
0 https://kvm.la/1863.html#comments https://kvm.la/feed/
Thinkphp使用postgresql新库报错解决 https://kvm.la/1862.html https://kvm.la/1862.html Sun, 21 Dec 2025 23:06:00 +0000 YY.K DROP FUNCTION IF EXISTS public.table_msg(varchar) CASCADE; DROP FUNCTION IF EXISTS public.table_msg(varchar, varchar) CASCADE; DROP FUNCTION IF EXISTS public.pgsql_type(varchar) CASCADE; DROP TYPE IF EXISTS public.tablestruct CASCADE; CREATE OR REPLACE FUNCTION public.pgsql_type(a_type character varying) RETURNS character varying AS $BODY$ DECLARE v_type character varying; BEGIN CASE a_type WHEN 'int8' THEN v_type := 'bigint'; WHEN 'int4' THEN v_type := 'integer'; WHEN 'int2' THEN v_type := 'smallint'; WHEN 'bpchar' THEN v_type := 'char'; ELSE v_type := a_type; END CASE; RETURN v_type; END; $BODY$ LANGUAGE plpgsql; -- 2. tablestruct 类型 CREATE TYPE public.tablestruct AS ( fields_key_name varchar(100), fields_name varchar(200), fields_type varchar(20), fields_length bigint, fields_not_null varchar(10), fields_default varchar(500), fields_comment varchar(1000) ); -- 3. table_msg 函数(带 schema 参数) CREATE OR REPLACE FUNCTION public.table_msg(a_schema_name varchar, a_table_name varchar) RETURNS SETOF public.tablestruct AS $body$ DECLARE v_ret tablestruct; v_oid oid; v_sql varchar; v_rec record; v_key varchar; BEGIN -- 获取表 oid SELECT c.oid INTO v_oid FROM pg_class c INNER JOIN pg_namespace n ON c.relnamespace = n.oid AND lower(n.nspname) = lower(a_schema_name) WHERE c.relname = a_table_name; IF NOT FOUND THEN RETURN; END IF; -- 构造动态查询 v_sql := ' SELECT a.attname AS fields_name, a.attnum AS fields_index, pgsql_type(t.typname::varchar) AS fields_type, a.atttypmod - 4 AS fields_length, CASE WHEN a.attnotnull THEN ''not null'' ELSE '''' END AS fields_not_null, pg_get_expr(ad.adbin, ad.adrelid) AS fields_default, d.description AS fields_comment FROM pg_attribute a INNER JOIN pg_class c ON a.attrelid = c.oid INNER JOIN pg_type t ON a.atttypid = t.oid LEFT JOIN pg_attrdef ad ON ad.adrelid = c.oid AND ad.adnum = a.attnum LEFT JOIN pg_description d ON d.objoid = c.oid AND d.objsubid = a.attnum WHERE a.attnum > 0 AND a.attisdropped = false AND c.oid = ' || v_oid || ' ORDER BY a.attnum; '; -- 遍历字段 FOR v_rec IN EXECUTE v_sql LOOP v_ret.fields_name := v_rec.fields_name; v_ret.fields_type := v_rec.fields_type; IF v_rec.fields_length > 0 THEN v_ret.fields_length := v_rec.fields_length; ELSE v_ret.fields_length := NULL; END IF; v_ret.fields_not_null := v_rec.fields_not_null; v_ret.fields_default := v_rec.fields_default; v_ret.fields_comment := v_rec.fields_comment; SELECT constraint_name INTO v_key FROM information_schema.key_column_usage WHERE table_schema = a_schema_name AND table_name = a_table_name AND column_name = v_rec.fields_name; IF FOUND THEN v_ret.fields_key_name := v_key; ELSE v_ret.fields_key_name := ''; END IF; RETURN NEXT v_ret; END LOOP; RETURN; END; $body$ LANGUAGE plpgsql VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; COMMENT ON FUNCTION public.table_msg(a_schema_name varchar, a_table_name varchar) IS '获得表信息'; -- 4. table_msg 函数(简化版,只传 table_name) CREATE OR REPLACE FUNCTION public.table_msg(a_table_name varchar) RETURNS SETOF public.tablestruct AS $body$ DECLARE v_ret tablestruct; BEGIN FOR v_ret IN SELECT * FROM public.table_msg('public', a_table_name) LOOP RETURN NEXT v_ret; END LOOP; RETURN; END; $body$ LANGUAGE plpgsql VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; COMMENT ON FUNCTION public.table_msg(a_table_name varchar) IS '获得表信息'; ]]> 0 https://kvm.la/1862.html#comments https://kvm.la/feed/ rhel系更新启动内核 https://kvm.la/1861.html https://kvm.la/1861.html Fri, 19 Dec 2025 17:46:07 +0000 YY.K dracut --force #强制更新initramfs #dracut --force /boot/initramfs-$(uname -r).img $(uname -r) #grubby --set-default /boot/vmlinuz-5.19.0-ml.x86_64 #设置指定内核 grubby --set-default 0 #设置启动第一个内核 grubby --default-kernel #查看启动内核 ]]> 0 https://kvm.la/1861.html#comments https://kvm.la/feed/ 初学golang之用beego快速创建项目 https://kvm.la/1860.html https://kvm.la/1860.html Wed, 17 Dec 2025 14:16:00 +0000 YY.K 现安装golang https://go.dev/dl/

go install github.com/beego/bee/v2@latest
export PATH=$PATH:$(go env GOPATH)/bin
bee new app
cd app
go mod tidy
bee run
]]>
0 https://kvm.la/1860.html#comments https://kvm.la/feed/
苹果giftcard礼品卡链接备忘录 https://kvm.la/1842.html https://kvm.la/1842.html Mon, 15 Dec 2025 18:03:00 +0000 YY.K https://www.apple.com/shop/buy-giftcard/giftcard

]]>
0 https://kvm.la/1842.html#comments https://kvm.la/feed/
关闭windows账户锁定策略 https://kvm.la/1859.html https://kvm.la/1859.html Mon, 15 Dec 2025 08:50:54 +0000 YY.K 在 Windows 系统中,账户锁定策略(Account Lockout Policy) 用于在多次登录失败后锁定账户,以防止暴力破解。但在远程桌面(RDP)、自动化运维或测试环境中,这一机制可能导致正常账号被频繁锁定。

net accounts /lockoutthreshold:0

 

验证方式

net accounts

输出中显示:Lockout threshold: Never

]]>
0 https://kvm.la/1859.html#comments https://kvm.la/feed/