Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 339

Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 392

Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 394
分类 默认分类 下的文章 - Joyber 的博客

分类 默认分类 下的文章

Yii2 内置全部常用缓存依赖

1. FileDependency 文件依赖

yii\caching\FileDependency
原理:校验文件最后修改时间,文件改动则缓存失效。
适用:配置文件、静态模板、json元数据。

use yii\caching\FileDependency;

$query->cache(60, new FileDependency([
    'fileName' => '@config/menu.json'
]))

2. ExpressionDependency PHP表达式依赖

yii\caching\ExpressionDependency
原理:每次读取缓存,执行一段PHP表达式;返回值变化,缓存失效。
适用:自定义逻辑,比如读取Redis里的版本号、全局配置版本。

use yii\caching\ExpressionDependency;

$query->cache(0, new ExpressionDependency([
    'expression' => 'Yii::$app->redis->get("global_version")'
]));

3. TagDependency 标签依赖(业务开发最推荐)

yii\caching\TagDependency
原理:缓存打上标签;不需要自动检测,代码手动根据标签批量清除缓存。

你当前统计count场景非常适合这个,比DbDependency少一条额外SQL。

示例:

use yii\caching\TagDependency;

// 写入缓存,绑定标签 estate-{$merchantId}
$count = PropertyCommunity::find()
    ->where(['estate_id' => $merchantId])
    ->cache(0, new TagDependency([
        'tags' => ["estate:{$merchantId}"]
    ]))
    ->count();

// 新增/修改/删除数据后,一行代码清空该标签下所有缓存
TagDependency::invalidate(Yii::$app->cache, ["estate:{$merchantId}"]);

优点:读缓存时不会额外执行SQL;缺点:数据变更需要手动调用 invalidate。

4. ChainedDependency 组合依赖

yii\caching\ChainedDependency
原理:组合多个依赖,任意一个依赖触发变更 → 缓存失效。

use yii\caching\ChainedDependency;

new ChainedDependency([
    'dependencies' => [
        new FileDependency(['fileName'=>'@config/conf.json']),
        new TagDependency(['tags'=>['estate:1001']])
    ]
]);

5. DbQueryDependency(DbDependency升级版)

yii\caching\DbQueryDependency
接收 QueryInterface 对象,而不是原生SQL字符串,支持参数绑定,防SQL注入。

use yii\caching\DbQueryDependency;
use yii\db\Query;

new DbQueryDependency([
    'query' => (new Query())
        ->select('MAX(updated_at)')
        ->from('property_community')
        ->where(['estate_id' => $merchantId])
]);

选型对比(结合你的项目)

依赖读缓存额外SQL触发方式适合场景
DbDependency✅ 每次读执行1条SQL自动检测SQL结果低并发,不想手动清缓存
DbQueryDependency✅ 同上自动检测Query结果同上,推荐替代DbDependency
TagDependency❌ 无额外SQL代码手动清除标签高并发统计count,优先选这个
FileDependency❌文件修改时间配置文件
ExpressionDependency❌php表达式返回值Redis版本号、自定义变量
ChainedDependency看子依赖任一子依赖变更多条件组合

重点建议

你现在 PropertyCommunity count统计:优先 TagDependency。
理由:
DbDependency每次访问count都会额外跑一条MAX(updated_at),并发上来会增加数据库压力;TagDependency在新增/删除数据时手动 invalidate 标签,读的时候没有额外开销。

2010年后出生群体(10后)成年进入社会的压力与出路

现在2010年出生的人,2026年是16岁,再过几年会陆续成年、走入社会。他们所处的时代,和80、90、00后完全不一样:增量时代基本结束,是存量竞争、高度数字化的时代,压力结构发生了很大变化。

一、他们将要面对的核心压力

1. 就业:岗位门槛抬升,内卷从大学前置到基础教育

10后面临的是高等教育普及化,本科、研究生的人数持续增多,学历不再是“保底通行证”。很多基础岗位不再只看文凭,更看重实操能力、项目经验、复合技能。
一方面传统稳定岗位竞争极度激烈;另一方面大量重复性岗位会被AI、自动化替代,简单流水线、基础文职、基础客服、初级图文处理这类岗位会持续缩减。
同时,行业迭代速度极快,可能上学时热门的专业,毕业时行业已经收缩,需要持续学习,不能靠“一技吃一辈子”。

2. 生活成本与资产压力

房价、大城市生活成本依然偏高,但收入增长速度放缓。
过去几代人可以靠买房实现资产增值的时代不再,房产不再是稳赚的投资。他们大概率很难依靠单一工资快速完成买房、结婚、育儿的人生任务。
并且社会默认的人生时间表(几岁结婚、生子)正在松动,但家庭和传统观念仍会带来隐性期待压力。

3. 精神与心理压力

10后是原生互联网世代,从小浸泡短视频、社交网络,习惯看到别人“高光生活”,更容易产生比较焦虑。
信息过载,真假信息混杂,辨别信息、管理注意力会变成一种刚需能力。同时,竞争从小就开始:课外培训、特长、升学竞争,长期高压,心理耗损会更明显。
另外,社会不确定性变强,经济、行业变化快,很难获得一份“一眼望到头”的稳定工作,不确定性焦虑是这一代人很突出的情绪。

4. 家庭支持的分化

家庭条件差距会被放大:能提供教育资源、试错资金、人脉支持的家庭,孩子试错空间更大;普通家庭的孩子,容错成本很高,一次选择失误代价更大。
养老压力也会传导到他们身上:老龄化加剧,未来赡养老人的负担会落在这一代人身上。

二、出路:不再是单一路线,而是多赛道选择

过去的主流路径:读书→好大学→进大厂/体制→买房成家,这套路径对10后不再是最优解,甚至不再是通用解。出路会分成几类:

1. 专业技术路线:深耕硬核能力,做AI难以替代的岗位

AI擅长标准化、重复性工作;但需要复杂人际判断、动手实操、复杂临场决策、深度创意的岗位更安全。

  • 硬核工程:医疗、精密制造、能源、土木、生物医药、先进设备维修;
  • 高端服务:临床医护、心理咨询、养老康复、高端教育;
  • 创意类:原创内容、剧本、产品设计,重点是原创审美与洞察,而不是简单排版生成。
    核心思路:不要只学知识,要学解决真实问题的能力。证书只是背书,解决问题的案例、作品集才是硬通货。

2. 稳定公共服务路线:体制、公共事业,但要理性看待

公务员、事业单位、基层公共岗位依然是抗风险选择,但竞争会持续激烈,收入不会暴富,优势是稳定性。
适合偏好低风险、追求安稳生活的人,但不要抱着“一劳永逸”的期待,体制内同样需要持续考核与学习。

3. 个体小商业/自由职业、技能个体户

数字化降低了个人创业门槛,不需要开实体店,靠单项技能就能接单:比如定制设计、剪辑、技术运维、手工、本地生活服务、知识咨询。
特点:上限高、自由度高,但不稳定,需要懂营销、财务、风险控制。适合擅长自我管理、抗压力强的人。
未来的趋势:很多人不再隶属于某一家公司,而是以独立个体,对接多个项目。

4. 跨区域选择:不扎堆一线城市

不必全部挤在一线大城市。新一线、地级市、县域,机会结构不一样:大城市适合技术、创意、互联网;中小城市适合本地服务业、公共岗位、轻资产小生意。
可以灵活切换:年轻时去大城市积累经验,后期回压力更低的城市定居,拆分“搞事业”和“安家”两个目标。

5. 底层生存能力(最重要)

相比于学历,下面几项能力会决定他们长期能不能走下去:

  1. 终身学习能力:行业3-5年一变,学会快速自学新工具,学会使用AI作为效率工具,而不是害怕AI;
  2. 财务基础素养:懂得储蓄、控制负债,不超前消费,建立风险缓冲金。不再默认依靠资产增值,靠现金流管理生活;
  3. 情绪与心理韧性:接受人生不是线性上升,允许阶段性低谷,减少社交比较;
  4. 可迁移能力:沟通、项目统筹、谈判、问题排查,这类能力可以跨行业复用。

三、一个客观判断

10后面临的不是“没有机会”,而是没有轻松的机会。
增量时代,只要肯吃苦就能抓住时代红利;存量时代,单纯努力不够,需要选对方向、持续迭代、控制风险。
对他们来说最重要的转变:放弃“必须成功”的单一成功标准。成功不一定等于高薪、买房、结婚生子,拥有健康、稳定现金流、自主选择权,也是很好的人生。

四、风险提醒

  • 不要盲目追逐短期网红风口,很多风口生命周期很短;
  • 尽量避免高负债(消费贷、高杠杆买房),在不确定环境里,现金流安全优先级最高;
  • AI是工具,不是对手,最好的策略是学会驾驭AI,提升效率,而不是和AI比拼基础劳动。

✅ 可以,Win11右下角任务栏时间区域显示星期,有两种方案

方案一:系统原生(不用装软件,推荐)

原理:修改短日期格式,会全局影响系统所有地方的日期展示(文件资源管理器、Excel等日期都会带星期),但不需要第三方工具。
  1. Win+R,输入 intl.cpl 回车,直接打开【区域】面板
  2. 点右下角 其他设置 → 切换到【日期】标签页
  3. 修改【短日期】输入框(英文输入法!)

    • ddd:简写,如 周二
    • dddd:完整,如 星期二

示例:

  • 国内默认短日期 yyyy/M/d,改成:yyyy/M/d dddd → 显示 2026/10/6 星期二
  • 想要简写:yyyy/M/d ddd → 2026/10/6 周二
  • 点【应用】→【确定】。如果没立刻生效,重启资源管理器:任务管理器找到explorer.exe右键重启。
⚠️ 缺点:全局生效,所有软件里的短日期都会带上星期。如果不想改动全系统日期格式,用方案二。

方案二:第三方 ElevenClock(推荐开发人员,只改任务栏时钟,不影响系统)

开源免费 Github 工具,专门给Win11任务栏时钟自定义格式,只修改右下角时间显示,不改动系统全局日期格式,可以实现换行、自定义星期。

  1. 微软商店或者 Github 下载 ElevenClock
  2. 安装后右键右下角时钟 → ElevenClock 设置
  3. 开启自定义格式,示例模板:

    HH:mm
    dddd
    yyyy/M/d

    效果:

    14:30
    星期二
    2026/10/6

    这个方案不会干扰文件、Excel、脚本里的日期格式,适合你这种开发环境。

小提示

任务栏如果比较窄,太长的dddd(星期二)可能会被截断,优先试 ddd(周二)。
想恢复默认:回到intl.cpl日期设置页,点【重置】即可一键还原。

calc(20rpx + env(safe‑area‑inset‑bottom)) 详解

env() 是CSS环境变量函数,safe‑area‑inset‑bottom 代表iOS全面屏底部手势条(小黑条)的避让高度,单位px。

你的写法含义:20rpx固定距离 + 系统给的底部安全区px距离,常用于小程序底部fixed悬浮按钮、底部栏的bottom / padding‑bottom。

一、四个安全区环境变量

env(safe-area-inset-top);    /* 顶部刘海/灵动岛高度 px */
env(safe-area-inset-right);  /* 右边避让,横屏生效 px */
env(safe-area-inset-bottom); /* 底部手势条高度 px */
env(safe-area-inset-left);   /* 左边避让,横屏生效 px */
  • 非全面屏手机:safe‑area‑inset‑bottom = 0px,表达式等价于 calc(20rpx + 0),只会保留你的20rpx基础距离。
  • iPhone全面屏:会自动叠加小黑条的高度(34px等)。

二、关键坑点(高频踩坑)

1️⃣ H5网页必须开启 viewport‑fit=cover

不加,safe‑area‑inset‑bottom 永远等于0,完全失效。

<meta name="viewport" content="width=device‑width,initial‑scale=1,viewport‑fit=cover">
微信小程序不需要写meta,框架默认开启cover模式,直接可用。

2️⃣ 历史兼容:constant()(iOS11.2以前旧版本)

旧版Safari用constant(),新版本用env(),constant写在env上方,做降级兼容。

/* 兼容旧iOS */
padding‑bottom: calc(20rpx + constant(safe‑area‑inset‑bottom));
padding‑bottom: calc(20rpx + env(safe‑area‑inset‑bottom));

3️⃣ calc内部符号两侧必须空格,否则直接失效

✅正确:calc(20rpx + env(safe‑area‑inset‑bottom))
❌错误:calc(20rpx+env(safe‑area‑inset‑bottom)) +两边没空格会解析失败。

4️⃣ 单位混用注意(小程序)

env(safe‑area‑inset‑bottom) 返回px;你写的是rpx。

微信小程序内部会自动做单位换算,calc(rpx + env(xxx)) 是支持直接写的,不需要手动转px,小程序引擎自动处理。
H5不支持rpx单位,H5要统一全部改成px。

5️⃣ env支持回退默认值(第二个参数)

设备不支持安全区变量时,使用回退值:

env(safe‑area‑inset‑bottom, 0px);

示例:

padding‑bottom: calc(20rpx + env(safe‑area‑inset‑bottom,0px));

三、两种业务场景示例(微信小程序)

场景1:底部fixed悬浮按钮,bottom定位

.fixed‑btn{
  position: fixed;
  bottom: calc(20rpx + env(safe‑area‑inset‑bottom));
  right: 30rpx;
}

含义:距离底部基础20rpx,iPhone全面屏再叠加手势条高度。普通安卓/非全面屏,就只有20rpx。

场景2:底部栏增加内边距padding‑bottom(推荐,避免内容被小黑条遮挡)

.footer‑bar{
  padding‑bottom: calc(24rpx + constant(safe‑area‑inset‑bottom));
  padding‑bottom: calc(24rpx + env(safe‑area‑inset‑bottom));
}

四、常见错误现象排查清单

  1. env完全不起作用:

    • H5:检查meta有没有加viewport‑fit=cover
    • 符号+忘记加空格;
    • 顺序写反,env写在constant前面。
  2. iPhone底部距离变得巨大:>

    你写的是基础距离 + safe‑area‑inset‑bottom,如果你本身元素已经靠到屏幕最底边,就不要额外再加基础值,直接写 env(safe‑area‑inset‑bottom),否则会双重叠加,留白过大。

五、H5完整可复制样板

.bottom‑wrap {
  padding‑bottom: calc(16px + constant(safe‑area‑inset‑bottom));
  padding‑bottom: calc(16px + env(safe‑area‑inset‑bottom,0px));
}
小程序直接复制,把px替换成rpx即可。

Ubuntu24.04(桌面版,NetworkManager)

方式1:全局断开再重连(最简单,推荐)

sudo nmcli networking off
sudo nmcli networking on

一行合并写法:

sudo nmcli networking off && sudo nmcli networking on

方式2:只重启单个连接(推荐SSH远程,不会断其他网卡)

  1. 先查看所有连接名称

    nmcli connection show

    示例输出:Wired connection 1、MyWiFi

  2. 断开、重连(替换名字)

    sudo nmcli con down "Wired connection 1"
    sudo nmcli con up "Wired connection 1"

方式3:直接重启NetworkManager服务(彻底重置网络)

sudo systemctl restart NetworkManager

方式4:netplan(服务器版,netplan管理)

sudo netplan apply

方式5:底层ip命令(直接操作网卡设备)

# 查看网卡名
ip addr
# 示例网卡 enp0s3
sudo ip link set enp0s3 down
sudo ip link set enp0s3 up

验证是否通网

ping 8.8.8.8
提示:Ubuntu24桌面默认用NetworkManager,优先用nmcli;服务器不带NM才用netplan。
SSH远程操作,尽量用【方式2】,避免全局断网导致连不上机器。

对应右上角菜单「断开网络 → 再连上」两种场景

场景A:点WiFi开关(关闭WiFi硬件,和右上角总WiFi开关一模一样)

# 第一步:关闭WiFi(相当于GUI点关闭WiFi)
nmcli radio wifi off

# 第二步:打开WiFi,系统会自动重连已保存WiFi
nmcli radio wifi on

一行合并:

nmcli radio wifi off && sleep 1 && nmcli radio wifi on

场景B:只断开当前这个WiFi连接(WiFi网卡不关,只是断开AP,就是点WiFi名称里的断开)

  1. 先查看连接名

    nmcli connection show --active

    拿到你的WiFi连接名称,例如 MyHomeWiFi

    # 断开当前WiFi
    nmcli con down "MyHomeWiFi"
    # 重新激活(自动重连)
    nmcli con up "MyHomeWiFi"

场景C:右上角【全部网络总开关】(有线+WiFi一起关掉,最接近右上角那个总网络开关)

sudo nmcli networking off
sudo nmcli networking on

区分重点

  • nmcli radio wifi off:无线网卡射频关闭,右上角WiFi图标消失,对应GUI的WiFi总开关。
  • nmcli con down "xxx":仅仅断开这个WiFi连接,网卡还开着,只是断开路由器,网卡还在扫描。
  • nmcli networking off:全局网络全部关闭,有线+WiFi一起断,GNOME右上角网络全部灰色。
Ubuntu24.04 GNOME桌面右上角点击网络开关,本质调用的就是 nmcli networking 或者 nmcli radio。
sleep 1 是给NetworkManager一点反应时间,防止太快执行导致不生效。

如果你是有线网线(不是wifi),那么用全局:

sudo nmcli networking off && sleep 1 && sudo nmcli networking on