<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[黑奇网-个人网站]]></title> 
<atom:link href="https://heiqw.com/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[黑奇网-个人网站]]></description>
<link>https://heiqw.com/</link>
<language>zh-cn</language>
<generator>www.emlog.net</generator>
<item>
    <title>记录一次电脑开机蓝屏无法启动解决办法代码0xc0000001修复引导</title>
    <link>https://heiqw.com/post-307.html</link>
    <description><![CDATA[<blockquote>
<p>记录一次电脑开机蓝屏无法启动解决办法代码</p>
</blockquote>
<h2>问题描述</h2>
<p>开机直接显示无法正常启动你的电脑，代码0xc0000001，安全模式什么的都进不去，甚至报错Autochk program not found</p>
<p><img src="https://image.heiqw.com/i/2026/07/16/pe8jh9.png" alt="" /></p>
<h2>故障解决</h2>
<ul>
<li>1、这个情况是由于磁盘分区是mbr格式的，容易掉引导，用微pe进去修复下引导就好了，mbr分区格式对应启动方式legacy</li>
</ul>]]></description>
    <pubDate>Thu, 16 Jul 2026 15:35:00 +0800</pubDate>
    <dc:creator>Donco</dc:creator>
    <guid>https://heiqw.com/post-307.html</guid>
</item>
<item>
    <title>修改浏览器缓存目录到内存条虚拟硬盘加快读写访问速度延长磁盘寿命</title>
    <link>https://heiqw.com/post-306.html</link>
    <description><![CDATA[<blockquote>
<p>Primo Ramdisk首先用到这个软件，这个软件可以虚拟内存条的容量作为一个磁盘，然后再通过修改浏览器缓存目录、映射硬链接的形式，强制把一些缓存数据，需要读写快但毫不重要的一些需要反复读写的临时数据存在那里共软件随时快速读写，这样一来不仅能大大加快网页打开速度，又能减少这部分缓存对硬盘读写造成的寿命损坏（虽然说这个伤害微乎其微，但是我内存都高低32G了也得替硬盘抗一点伤害吧？因为我内存条又用不完，硬盘写入量每天就浏览器和微信两个多，一天20G，这样下来内存条抗一些伤害也好啊！何乐而不为对吧！）</p>
</blockquote>
<h2>注意</h2>
<p>1、这个做法不适合内存小于16g的用户，因为本身小于16g都不太够用了，你额外拿内存容量来做缓存也不太好吧？除非你本身打开的软件不多，内存完全充足的情况下可以，再一个是后续软件开启<code>动态内存管理</code>这样就相当于用多少就占多少内存，而不是你设置多大那部分内存就不能用</p>
<p>2、绝对不适合重要数据，仅限于可有可无的缓存类型数据，因为内存条的结构本身就是断电后数据丢失，所以写在内存里要承担随时可能丢失数据的风险。但是像浏览器这种缓存数据就无所谓，因为本来就是高频访问而且是从云端下发临时存在本地的，没了大不了刷新一下就又有了</p>
<h2>简单的说下</h2>
<h2>第一步</h2>
<p>下载软件，Primo Ramdisk</p>
<p>老规矩，网上找，吾爱论坛</p>
<h2>第二步</h2>
<p>直接新建一个虚拟硬盘</p>
<p><img src="https://image.heiqw.com/i/2026/07/06/xhan91.png" alt="" /></p>
<p>硬盘类型选第二个据说快些，镜像的话就是相当于硬盘也保存一份，因为我本身就不想把缓存放硬盘，所以不打勾</p>
<p><img src="https://image.heiqw.com/i/2026/07/06/xhya7j.png" alt="" /></p>
<p>这些默认就行</p>
<p><img src="https://image.heiqw.com/i/2026/07/06/xib4vk.png" alt="" /></p>
<p>高级里面你记得放一些你要弄到的，选自动创建文件夹，因为前面说了内存断电数据就清空，所以整个虚拟盘都会清空，但是某些软件不会自己建目录，所以我们自动建为好</p>
<h2>第三步 改缓存目录到虚拟盘</h2>
<p><img src="https://image.heiqw.com/i/2026/07/06/xjlulz.png" alt="" /></p>
<p>不同浏览器设置不同，我这里是360极速浏览器，直接设置里搜索就行，然后修改，到这一步就差不多完了</p>
<h3>进阶玩法</h3>
<ul>
<li>
<p>1、我发现除了这个可以设置的缓存，360还有一些gpu显卡缓存，脚本缓存等等，其他的上面设置了也不会挪过去，这怎么办？这个就要自己创建硬链接的形式，强制指定存储目录到我们的虚拟内存盘了，它不会自动建，所以二级目录要用脚本建一下，如果你只弄缓存的话，忽略这一步</p>
</li>
<li>
<p>2、上面说的其他缓存，因为软件里没有设置的地方，也不会自己创建目录，所以我们每次开启设置启动脚本，开机自动建二级目录+硬链接，比如我用的360极速浏览器，我把缓存目录改到了虚拟盘，缓存目录倒是会自动创建其他不自动建的就用这个解决问题</p>
</li>
</ul>
<pre><code class="language-bat">@echo off
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&amp;&amp;exit
cd /d "%~dp0"

:: 一级目录（Primo已自动生成，重复md不会报错）
md "Z:\360ChromeX"

:: 浏览器缓存子文件夹
md "Z:\360ChromeX\GPUCache64"
md "Z:\360ChromeX\Code Cache"
md "Z:\360ChromeX\DawnCache"
md "Z:\360ChromeX\Service Worker"

mklink /J "D:\public\360ChromeX\Chrome\User Data\Default\GPUCache64" "Z:\360ChromeX\GPUCache64"
mklink /J "D:\public\360ChromeX\Chrome\User Data\Default\Code Cache" "Z:\360ChromeX\Code Cache"
mklink /J "D:\public\360ChromeX\Chrome\User Data\Default\DawnCache" "Z:\360ChromeX\DawnCache"
mklink /J "D:\public\360ChromeX\Chrome\User Data\Default\Service Worker" "Z:\360ChromeX\Service Worker"

echo Z盘所有目录初始化完成
timeout /t 2 /nobreak &gt;nul
exit</code></pre>
<h3>设置开机自动以管理员运行（任务计划程序，最稳）</h3>
<ul>
<li>Win+S 搜索「任务计划程序」打开</li>
<li>右侧【创建任务】<br />
常规：名称内存盘自动创建目录，勾选使用最高权限运行<br />
触发器：新建 → 登录时<br />
操作：新建 → 程序或脚本，选择刚才的C:\AutoRamDiskInit.bat</li>
<li>保存，开机登录后自动执行，瞬间补齐所有子文件夹</li>
</ul>
<p>注意：补充关键前置设置（解决快速启动导致缓存残留）<br />
你不要镜像、要关机彻底清空内存盘，<code>必须关闭 Windows 快速启动</code>：</p>
<p>关闭Windows快速启动</p>
<ul>
<li>Primo Ramdisk 主界面 → 选项</li>
<li>Windows 快速启动点【关闭】</li>
</ul>
<p>重启生效</p>
<p>快速启动会休眠内存盘数据，即使不开镜像，关机也不会清空 Temp 缓存，违背重启后清理的需求。</p>
<h3>注意脚本要根据自己的需求改路径，不同浏览器文件夹略有不同，找到修改即可，如果你不是很懂，那么只弄基础玩法浏览器设置里修改缓存路径就好了，不需要进阶脚本</h3>
<p><img src="https://image.heiqw.com/i/2026/07/06/xq1sgi.png" alt="" /></p>]]></description>
    <pubDate>Mon, 06 Jul 2026 20:11:00 +0800</pubDate>
    <dc:creator>Donco</dc:creator>
    <guid>https://heiqw.com/post-306.html</guid>
</item>
<item>
    <title>2026年新版宝塔面板一键跳过登录/绕过绑定/假绑定/免登录/去除验证登录绑定</title>
    <link>https://heiqw.com/post-305.html</link>
    <description><![CDATA[<blockquote>
<p>宝塔BT Panel的强制绑定账号无法绕过的彻底解决</p>
</blockquote>
<h2>源于宝塔官方免登录版本</h2>
<h2>说明</h2>
<p>对不起，我是标题党了，这个教程是你想要的，但确实不是什么绕过绑定，去除绑定等等，也不是老版本7.7.0之类的绕过绑定，毕竟7.7.0确实太老了，而是我今天偶然发现，宝塔面板自己也推出了一个免绑定的</p>
<p><img src="https://image.heiqw.com/i/2026/07/05/iylm8b.png" alt="" /></p>
<h3>稳定版：10.0.2</h3>
<p>（ 纯净版，简洁免绑定账号，无付费广告 ）<br />
推荐公司、企事业单位及生产环境使用，特别注重安全和稳定性，只修BUG，不加新功能</p>
<p><code>通用安装脚本（推荐）</code></p>
<pre><code class="language-bash">url=https://download.bt.cn/install/installStable.sh;if [ -f /usr/bin/curl ];then curl -sSO $url;else wget -O installStable.sh $url;fi;bash installStable.sh ed8484bec</code></pre>
<p><code>Centos/OpenCloud/Alibaba</code></p>
<pre><code class="language-bash">url=https://download.bt.cn/install/installStable.sh;if [ -f /usr/bin/curl ];then curl -sSO $url;else wget -O installStable.sh $url;fi;bash installStable.sh ed8484bec</code></pre>
<p><code>Debian</code></p>
<pre><code>wget -O install.sh https://download.bt.cn/install/installStable.sh &amp;&amp; bash install.sh ed8484bec</code></pre>
<p><code>Ubuntu/Deepin</code></p>
<pre><code>wget -O install.sh https://download.bt.cn/install/installStable.sh &amp;&amp; sudo bash install.sh ed8484bec</code></pre>
<p>我也是直接在官方看到的，终于算是良心发现了，非得登录干嘛对吧？毕竟宝塔开始源于一定的极客精神，既然极客精神了我觉得大可给更多的选择，不一定非得用户注册登录，因为有的人建了网站放那里真的很少用到，这点宝塔官方还是值得称赞的，终于可以听听用户的声音了，直到今天我用宝塔也算快有10年了吧，2016还是2017就开始用了，期间也推荐了给很多人</p>]]></description>
    <pubDate>Sun, 05 Jul 2026 11:43:00 +0800</pubDate>
    <dc:creator>Donco</dc:creator>
    <guid>https://heiqw.com/post-305.html</guid>
</item>
<item>
    <title>推荐一个如何查手机内存是否虚标/硬盘虚标山寨机查询打假app</title>
    <link>https://heiqw.com/post-304.html</link>
    <description><![CDATA[<p><a href="https://epcdiy.org/">https://epcdiy.org/</a></p>
<blockquote>
<p>白眼app</p>
</blockquote>
<p>简洁、高效、实用、轻量</p>
<p>一款使用C++编写的山寨机跑分、甄别工具</p>
<h2>功能</h2>
<p>白眼APP有什么功能？<br />
CPU跑分：可以为你的CPU进行跑个分，并且通过他人的跑分数据让您了解您的手机的大致性能。</p>
<p>内存测试：通过暴力填充系统运行内存的方式来判别真正运行内存。</p>
<p>磁盘测试：通过填充磁盘的方式测试手机真实储存空间。</p>
<p>在线排行榜：您的跑分数据将会被上传到软件数据库中，与他人共享。您也可以通过查看您在排行榜中的位置来了解您的手机的大致性能</p>]]></description>
    <pubDate>Sat, 04 Jul 2026 15:39:00 +0800</pubDate>
    <dc:creator>Donco</dc:creator>
    <guid>https://heiqw.com/post-304.html</guid>
</item>
<item>
    <title>php读取数据库列表以及操作数据库修改密码/忘记后台密码</title>
    <link>https://heiqw.com/post-303.html</link>
    <description><![CDATA[<blockquote>
<p>php读取数据库列表以及操作数据库修改密码，用来有ftp以及有文件权限时，但是缺不知道后台密码，或者忘记后台密码，后台密码被重置的情况了</p>
</blockquote>
<p>还可以用在比如说有的空间有防火墙，直接把phpmyadmin或者adminer之类的传上去会被拦截的情况，像昨天晚上我就遇到一例，一个人的后台密码被黑了被改了，弱口令，但是又临时需要急着传图片，无奈我只能手搓一个php先把后台密码改了，再回去后台传</p>
<h2>注意事项</h2>
<p>1、不一定能用，因为后续让ai重写的，我开始还没整合成一个php，但是应该没问题的，逻辑是这么个逻辑<br />
2、下列直接修改的仅适用于普通的md5密码存储，如果是特定的源码不是直接md5密码加密的，还需要改成对应的算法密文储存的数据才行哦</p>
<h2>简易数据库管理小工具（PHP5.3+ 兼容，极简代码）</h2>
<p>采用原生PDO（PHP5.3默认自带），无框架、无第三方类库，结构极简，三个功能：</p>
<ol>
<li>连接数据库，展示所有数据表</li>
<li>点击表名查看该表全部数据</li>
<li>根据ID编辑任意字段值保存</li>
</ol>
<h2>db_manager.php 完整单文件代码</h2>
<pre><code class="language-php">&lt;?php
// ==========数据库配置（自行修改）==========
$db_host = 'localhost';
$db_user = 'root';
$db_pwd  = 'root';
$db_name = 'testdb';
$charset = 'utf8';

// PDO连接数据库（PHP5.3兼容写法）
try {
    $dsn = "mysql:host=$db_host;dbname=$db_name;charset=$charset";
    $pdo = new PDO($dsn, $db_user, $db_pwd);
    $pdo-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    die("数据库连接失败：".$e-&gt;getMessage());
}

// 获取当前操作
$action = isset($_GET['act']) ? $_GET['act'] : 'tables';
$table  = isset($_GET['table']) ? $_GET['table'] : '';
$id     = isset($_GET['id']) ? intval($_GET['id']) : 0;

// 1、展示所有数据表
if($action == 'tables'){
    $stmt = $pdo-&gt;query("SHOW TABLES");
    $tables = $stmt-&gt;fetchAll(PDO::FETCH_NUM);
    echo '&lt;h3&gt;数据库 '.$db_name.' 所有数据表&lt;/h3&gt;';
    echo '&lt;ul&gt;';
    foreach($tables as $t){
        $tb = $t[0];
        echo "&lt;li&gt;&lt;a href='?act=show&amp;table=$tb'&gt;$tb&lt;/a&gt;&lt;/li&gt;";
    }
    echo '&lt;/ul&gt;';
}

// 2、查看指定表数据列表
elseif($action == 'show' &amp;&amp; !empty($table)){
    echo "&lt;p&gt;&lt;a href='?'&gt;返回表列表&lt;/a&gt;&lt;/p&gt;";
    echo "&lt;h3&gt;数据表：$table&lt;/h3&gt;";

    // 查询表字段
    $fieldStmt = $pdo-&gt;query("DESC `$table`");
    $fields = $fieldStmt-&gt;fetchAll(PDO::FETCH_ASSOC);

    // 查询表数据
    $dataStmt = $pdo-&gt;query("SELECT * FROM `$table`");
    $rows = $dataStmt-&gt;fetchAll(PDO::FETCH_ASSOC);

    if(empty($rows)){
        echo '&lt;p&gt;该表暂无数据&lt;/p&gt;';
    }else{
        // 输出表头
        echo '&lt;table border="1" cellpadding="4"&gt;';
        echo '&lt;tr&gt;';
        foreach($fields as $f){
            echo '&lt;th&gt;'.$f['Field'].'&lt;/th&gt;';
        }
        echo '&lt;th&gt;操作&lt;/th&gt;&lt;/tr&gt;';

        // 输出数据行
        foreach($rows as $row){
            echo '&lt;tr&gt;';
            foreach($row as $k=&gt;$v){
                echo '&lt;td&gt;'.htmlspecialchars($v).'&lt;/td&gt;';
            }
            // 取第一个字段当做主键ID（常规自增id）
            $pk = $fields[0]['Field'];
            $pkVal = $row[$pk];
            echo "&lt;td&gt;&lt;a href='?act=edit&amp;table=$table&amp;id=$pkVal'&gt;编辑&lt;/a&gt;&lt;/td&gt;";
            echo '&lt;/tr&gt;';
        }
        echo '&lt;/table&gt;';
    }
}

// 3、编辑单条数据表单
elseif($action == 'edit' &amp;&amp; !empty($table) &amp;&amp; $id&gt;0){
    echo "&lt;p&gt;&lt;a href='?act=show&amp;table=$table'&gt;返回表数据&lt;/a&gt;&lt;/p&gt;";
    echo "&lt;h3&gt;编辑ID=$id 的数据&lt;/h3&gt;";

    // 获取表字段
    $fieldStmt = $pdo-&gt;query("DESC `$table`");
    $fields = $fieldStmt-&gt;fetchAll(PDO::FETCH_ASSOC);
    $pk = $fields[0]['Field'];

    // 查询本条数据
    $rowStmt = $pdo-&gt;prepare("SELECT * FROM `$table` WHERE `$pk`=?");
    $rowStmt-&gt;execute([$id]);
    $row = $rowStmt-&gt;fetch(PDO::FETCH_ASSOC);
    if(!$row) die('数据不存在');

    // 提交保存修改
    if($_POST){
        $setArr = [];
        $param = [];
        foreach($fields as $f){
            $fname = $f['Field'];
            if($fname == $pk) continue; // 主键不允许修改
            $val = isset($_POST[$fname]) ? $_POST[$fname] : '';
            $setArr[] = "`$fname`=?";
            $param[] = $val;
        }
        $param[] = $id;
        $sql = "UPDATE `$table` SET ".implode(',',$setArr)." WHERE `$pk`=?";
        $updateStmt = $pdo-&gt;prepare($sql);
        $updateStmt-&gt;execute($param);
        echo '&lt;p style="color:green;"&gt;修改成功！&lt;a href="?act=show&amp;table='.$table.'"&gt;点击返回数据列表&lt;/a&gt;&lt;/p&gt;';
    }

    // 输出编辑表单
    echo '&lt;form method="post"&gt;';
    foreach($fields as $f){
        $fname = $f['Field'];
        $val = htmlspecialchars($row[$fname]);
        if($fname == $pk){
            echo "&lt;p&gt;$fname：$val (主键不可修改)&lt;/p&gt;";
        }else{
            echo "&lt;p&gt;$fname：&lt;input type='text' name='$fname' value='$val' style='width:350px;'&gt;&lt;/p&gt;";
        }
    }
    echo '&lt;p&gt;&lt;button type="submit"&gt;保存修改&lt;/button&gt;&lt;/p&gt;';
    echo '&lt;/form&gt;';
}
?&gt;</code></pre>
<h2>使用说明</h2>
<ol>
<li>修改代码顶部<strong>数据库配置项</strong>：主机、用户名、密码、数据库名</li>
<li>直接放到PHP5.3及以上环境运行（PHP5.3默认开启PDO-MySQL）</li>
<li>流程：
<ul>
<li>首页：列出当前库所有数据表</li>
<li>点表名：查看该表全部数据</li>
<li>每行右侧点【编辑】：打开表单修改除主键ID外所有字段，提交保存</li>
</ul></li>
</ol>
<h2>兼容性说明</h2>
<ol>
<li>PHP5.3 原生支持 PDO，无需额外安装扩展</li>
<li>使用<code>htmlspecialchars</code>防XSS简单安全处理</li>
<li>使用预处理语句防SQL注入</li>
<li>自动把表第一个字段作为主键（一般为id自增主键），主键禁止修改</li>
<li>单文件极简实现，无样式冗余代码，可自行加CSS美化</li>
</ol>
<h2>简易安全提醒</h2>
<p>本代码仅用于本地内网测试，不要直接部署到公网，没有做访问权限验证，公网使用需要加登录验证。</p>
<p>需要我给代码加一段极简CSS美化表格页面吗？</p>]]></description>
    <pubDate>Thu, 25 Jun 2026 17:08:00 +0800</pubDate>
    <dc:creator>Donco</dc:creator>
    <guid>https://heiqw.com/post-303.html</guid>
</item>
<item>
    <title>pbootcms留言验证码加固/刷新解决不过期/删除会话验证码</title>
    <link>https://heiqw.com/post-302.html</link>
    <description><![CDATA[<blockquote>
<p>pbootcms程序有很大的安全问题，比如说系统自带的验证码很长时间不会过期，这样虽然哪怕有了验证码一样的会被刷留言啊，根本无法防护，所以直接在后台加一行代码即可解决，这样验证码就会过期了只能用一次，直接删除会话里的验证码</p>
</blockquote>
<p><img src="https://image.heiqw.com/i/2026/06/24/imk0db.png" alt="" /></p>
<p>打开<code>/apps/home/controller</code>找到<code>MessageController.php</code>大约56行左右，直接加一行下面的代码即可</p>
<pre><code>// 关键：校验通过立刻销毁验证码，一次性使用，防止XHR重放
unset($_SESSION['checkcode']);</code></pre>]]></description>
    <pubDate>Wed, 24 Jun 2026 11:22:00 +0800</pubDate>
    <dc:creator>Donco</dc:creator>
    <guid>https://heiqw.com/post-302.html</guid>
</item>
<item>
    <title>pbootcms后台登录错误缓存清理自动执行代码</title>
    <link>https://heiqw.com/post-301.html</link>
    <description><![CDATA[<p>我给你写<strong>极简、安全、可直接运行</strong>的代码，分两个文件：</p>
<ol>
<li>前端：jQuery AJAX 请求代码（HTML/JS）</li>
<li>后端：原生PHP接口（无框架、防路径遍历/文件漏洞、无数据库所以无需防SQL注入）</li>
<li>逻辑严格按你要求：检查<code>runtime</code>目录创建时间 → 非当天删除 → 全流程返回JSON</li>
</ol>
<hr />
<h2>一、前端 jQuery 代码 (index.html)</h2>
<p><strong>功能</strong>：页面加载自动发送请求，接收PHP返回的JSON结果并提示</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="zh-CN&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;检查Runtime目录&lt;/title&gt;
    &lt;!-- 引入jQuery CDN --&gt;
    &lt;script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id="result"&gt;&lt;/div&gt;

    &lt;script&gt;
        // 页面加载完成后，发送AJAX请求到PHP接口
        $(function () {
            $.ajax({
                url: "check_runtime.php", // PHP接口地址
                type: "POST",
                dataType: "json", // 强制接收JSON
                // 无传递参数，杜绝注入风险
                success: function (res) {
                    // 处理返回结果
                    console.log(res);
                    $("#result").html(`&lt;p&gt;${res.msg}&lt;/p&gt;`);
                    alert(res.msg);
                },
                error: function () {
                    alert("请求失败，请检查接口是否正常");
                }
            });
        });
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr />
<h2>二、后端 原生PHP接口 (check_runtime.php)</h2>
<p><strong>核心安全</strong>：</p>
<ul>
<li>禁止目录遍历（防文件漏洞）</li>
<li>递归删除目录（支持runtime内有子文件/子目录）</li>
<li>严格判断创建时间</li>
<li>统一JSON响应格式</li>
<li>无数据库操作 → 天然无SQL注入风险</li>
</ul>
<pre><code class="language-php">&lt;?php
// 强制返回JSON格式，防止乱码
header('Content-Type: application/json; charset=utf-8');
// 禁止缓存
header('Cache-Control: no-cache, no-store, must-revalidate');

// ===================== 配置 =====================
// 目标目录：当前目录下的 runtime
$targetDir = __DIR__ . '/runtime';
// 今天的日期（年月日）
$today = date('Y-m-d');

// ===================== 安全检查 =====================
// 防止路径遍历攻击，仅允许操作当前目录的runtime
if (strpos(realpath($targetDir), realpath(__DIR__)) !== 0) {
    echo json_encode([
        'code' =&gt; 1,
        'msg' =&gt; '非法目录操作，已拦截'
    ], JSON_UNESCAPED_UNICODE);
    exit;
}

// ===================== 核心逻辑 =====================
// 1. 判断目录是否存在
if (!is_dir($targetDir)) {
    echo json_encode([
        'code' =&gt; 0,
        'msg' =&gt; 'runtime目录不存在，无需处理'
    ], JSON_UNESCAPED_UNICODE);
    exit;
}

// 2. 获取目录创建时间（Windows：创建时间；Linux：inode修改时间，通用标准）
$createTime = filectime($targetDir);
$createDate = date('Y-m-d', $createTime);

// 3. 判断是否为当天创建
if ($createDate === $today) {
    // 是当天：不处理
    echo json_encode([
        'code' =&gt; 0,
        'msg' =&gt; 'runtime目录为当天创建，无需删除'
    ], JSON_UNESCAPED_UNICODE);
    exit;
}

// 4. 非当天：删除目录
$delResult = delDir($targetDir);
if ($delResult) {
    echo json_encode([
        'code' =&gt; 0,
        'msg' =&gt; 'runtime目录非当天创建，已成功删除'
    ], JSON_UNESCAPED_UNICODE);
} else {
    echo json_encode([
        'code' =&gt; 1,
        'msg' =&gt; 'runtime目录删除失败，请检查权限'
    ], JSON_UNESCAPED_UNICODE);
}

// ===================== 工具函数：递归删除目录 =====================
function delDir($dir)
{
    // 不是目录直接返回
    if (!is_dir($dir)) return false;
    // 扫描目录内容
    $files = array_diff(scandir($dir), ['.', '..']);
    foreach ($files as $file) {
        $path = $dir . '/' . $file;
        is_dir($path) ? delDir($path) : unlink($path);
    }
    // 删除空目录
    return rmdir($dir);
}
?&gt;</code></pre>
<hr />
<h2>三、代码说明 &amp; 使用方法</h2>
<h3>1. 文件结构</h3>
<p>把两个文件放在<strong>网站根目录</strong>，结构如下：</p>
<pre><code>你的网站根目录/
├─ index.html       (前端jQuery代码)
├─ check_runtime.php (PHP接口)
└─ runtime/         (需要检查的目录)</code></pre>
<h3>2. 核心逻辑</h3>
<ol>
<li>前端jQuery自动发送POST请求到PHP</li>
<li>PHP检查<code>runtime</code>目录是否存在</li>
<li>获取目录创建日期，和<strong>当天日期</strong>对比</li>
<li>非当天 → 递归删除整个目录；当天 → 不处理</li>
<li>所有状态<strong>返回标准JSON</strong></li>
</ol>
<h3>3. 安全说明</h3>
<ul>
<li>✅ 无数据库操作 → 无SQL注入风险</li>
<li>✅ 限制目录操作范围 → 防路径遍历/文件删除漏洞</li>
<li>✅ 递归删除仅针对目标目录 → 不会误删其他文件</li>
<li>✅ 强制JSON响应、禁止缓存 → 接口更稳定</li>
</ul>
<h3>4. 测试方法</h3>
<ol>
<li>访问 <code>index.html</code></li>
<li>会自动执行检查，弹出结果提示</li>
<li>查看根目录的<code>runtime</code>目录，非当天会被自动删除</li>
</ol>
<hr />
<h2>四、返回JSON格式示例</h2>
<ol>
<li>目录不存在
<pre><code class="language-json">{"code":0,"msg":"runtime目录不存在，无需处理"}</code></pre></li>
<li>当天创建
<pre><code class="language-json">{"code":0,"msg":"runtime目录为当天创建，无需删除"}</code></pre></li>
<li>删除成功
<pre><code class="language-json">{"code":0,"msg":"runtime目录非当天创建，已成功删除"}</code></pre></li>
<li>权限不足删除失败
<pre><code class="language-json">{"code":1,"msg":"runtime目录删除失败，请检查权限"}</code></pre></li>
</ol>
<h2>上面是接口版，下面是静默版</h2>
<pre><code class="language-php">&lt;?php
// 注释JSON响应头，静默不输出返回内容
// header('Content-Type: application/json; charset=utf-8');
// header('Cache-Control: no-cache, no-store, must-revalidate');

// ===================== 配置 =====================
$targetDir = __DIR__ . '/runtime';
$today = date('Y-m-d');

// ===================== 安全检查：防止路径遍历攻击 =====================
if (strpos(realpath($targetDir), realpath(__DIR__)) !== 0) {
    // 不再输出JSON、不exit终止脚本，直接返回不再往下执行
    return;
}

// 目录不存在，直接返回
if (!is_dir($targetDir)) {
    return;
}

// 获取目录创建时间
$createTime = filectime($targetDir);
$createDate = date('Y-m-d', $createTime);

// 当天创建，无需删除，直接返回
if ($createDate === $today) {
    return;
}

// 非当天执行目录删除，删除后直接返回，不输出任何内容
delDir($targetDir);
return;

// ===================== 工具函数：递归删除目录 =====================
function delDir($dir)
{
    if (!is_dir($dir)) return false;
    $files = array_diff(scandir($dir), ['.', '..']);
    foreach ($files as $file) {
        $path = $dir . '/' . $file;
        is_dir($path) ? delDir($path) : unlink($path);
    }
    return rmdir($dir);
}
?&gt;</code></pre>
<h3>修改要点</h3>
<ol>
<li>移除所有 <code>echo json_encode()</code> 输出语句，不再向前端返回任何数据，实现静默执行</li>
<li>将所有 <code>exit</code> 替换为 <code>return</code>，仅终止当前脚本逻辑，不会中断外部引用文件的程序运行</li>
<li>保留原有路径安全校验、目录时间判断、递归删除全部核心逻辑不变</li>
<li>注释掉JSON相关响应头，避免响应头冲突干扰其他业务接口</li>
<li>无数据库操作，天然规避SQL注入风险，路径遍历防护保留</li>
</ol>
<h2>php引用文件</h2>
<pre><code>// 只引入一次，多次写这句也只执行一次文件代码
require_once 'config.php';</code></pre>]]></description>
    <pubDate>Wed, 17 Jun 2026 23:08:00 +0800</pubDate>
    <dc:creator>Donco</dc:creator>
    <guid>https://heiqw.com/post-301.html</guid>
</item>
<item>
    <title>nginx伪静态设置允许指定ip放行禁止ip访问</title>
    <link>https://heiqw.com/post-300.html</link>
    <description><![CDATA[<h3>核心原理</h3>
<p>Nginx 自带 <code>ngx_http_access_module</code> 模块，通过 <code>allow</code>（允许）和 <code>deny</code>（拒绝）指令实现IP黑白名单，<strong>顺序绝对不能颠倒</strong>：必须先写允许的白名单IP，再写拒绝所有其他IP，否则规则会失效。</p>
<pre><code>location / {
    allow 123.123.123.123;
    deny all;
}</code></pre>
<p>关键代码如下，也可以放在已有的nginx伪静态最前面</p>
<pre><code>
    allow 123.123.123.123;
    deny all;</code></pre>
<h2>常见问题排查</h2>
<ol>
<li><strong>配置后所有IP都访问不了</strong>：肯定是 <code>allow</code> 和 <code>deny</code> 顺序写反了，必须先 <code>allow</code> 再 <code>deny all</code>。</li>
<li><strong>配置后所有IP都能访问</strong>：
<ul>
<li>检查规则是不是放在了正确的 <code>location</code> 里，被其他配置覆盖了；</li>
<li>如果用了CDN/代理，是不是没配置真实IP获取规则，也没放行CDN/代理的IP段；</li>
<li>检查IP是不是写错了，有没有多余的空格。</li>
</ul></li>
<li><strong>被拦截后返回404而不是403</strong>：可以自定义错误页面，在 <code>server</code> 块里加：
<pre><code class="language-nginx">error_page 403 /403.html;
location = /403.html {
   root /var/www/error;
   internal;
}</code></pre></li>
</ol>]]></description>
    <pubDate>Wed, 10 Jun 2026 10:47:00 +0800</pubDate>
    <dc:creator>Donco</dc:creator>
    <guid>https://heiqw.com/post-300.html</guid>
</item>
<item>
    <title>word文档docx以及doc格式文档压缩教程</title>
    <link>https://heiqw.com/post-299.html</link>
    <description><![CDATA[<blockquote>
<p>起因是朋友做标书，文档太大了，而限制上传10M的标书，找我问能不能压缩？那必然是可以啊，重点不是压缩，而是不要会员的压缩，免费的压缩，哈哈</p>
</blockquote>
<p>故搜索之，感谢互联网的内容丰富</p>
<h2>引用52pojie @一点浩然气</h2>
<p>告诉你一个独门秘诀哈，我们做标书的因为投标软件上传Word文件有大小限制，可以将Word的文件后缀.docx改为zip,然后将点开zip文件Word-media将里面的图片复制出来，接着用图片压缩软件，这里推荐图片无损压缩大师，将压缩后的图片直接复制覆盖zip文件Word-media的图片，最后将.zip改为docx，完美缩小到10m以内。</p>
<p><a href="https://heiqw.com/content/uploadfile/202606/45bb1780564412.png"><img src="https://heiqw.com/content/uploadfile/202606/thum-45bb1780564412.png" alt="" /></a></p>
<p>我看了下还真是，原理就是word文档的图片都会放在一个目录里，而我们把目录里的图片压缩替换，再把文件名改回去就行</p>
<p>图片无损压缩大师：<a href="https://wwph.lanzout.com/iRkv92rzm9vc">https://wwph.lanzout.com/iRkv92rzm9vc</a></p>]]></description>
    <pubDate>Thu, 04 Jun 2026 17:09:00 +0800</pubDate>
    <dc:creator>Donco</dc:creator>
    <guid>https://heiqw.com/post-299.html</guid>
</item>
<item>
    <title>解决报错EasyWeChat\Kernel\Exceptions\RuntimeException Failed to cache access token.</title>
    <link>https://heiqw.com/post-298.html</link>
    <description><![CDATA[<blockquote>
<p>解决报错：EasyWeChat\Kernel\Exceptions\RuntimeException Failed to cache access token.</p>
</blockquote>
<pre><code>1. in /www/wwwroot/xxx.cn/vendor/overtrue/wechat/src/Kernel/AccessToken.php at line 143
134135136137138139140141142143144145146147148149150151152
     */
    public function setToken(string $token, int $lifetime = 7200): AccessTokenInterface
    {
        $this-&gt;getCache()-&gt;set($this-&gt;getCacheKey(), [
            $this-&gt;tokenKey =&gt; $token,
            'expires_in' =&gt; $lifetime,
        ], $lifetime - $this-&gt;safeSeconds);

        if (!$this-&gt;getCache()-&gt;has($this-&gt;getCacheKey())) {
            throw new RuntimeException('Failed to cache access token.');
        }

        return $this;
    }

    /**
     * @return \EasyWeChat\Kernel\Contracts\AccessTokenInterface
     *
     * @throws \EasyWeChat\Kernel\Exceptions\HttpException
2. in /www/wwwroot/xxx.cn/vendor/overtrue/wechat/src/Kernel/AccessToken.php at line 121 – </code></pre>
<h2>解决办法</h2>
<p>把<code>/tmp/symfony-cache</code>路径的所有者改成www并且权限弄成755，宝塔面板里修改也就是图片默认直接点保存就行</p>
<p><img src="https://image.heiqw.com/i/2026/05/08/sp93xt.png" alt="" /></p>]]></description>
    <pubDate>Fri, 08 May 2026 17:34:00 +0800</pubDate>
    <dc:creator>Donco</dc:creator>
    <guid>https://heiqw.com/post-298.html</guid>
</item></channel>
</rss>