<?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://www.alexer.cc/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[大道行思，取则行远]]></description>
<link>https://www.alexer.cc/</link>
<language>zh-cn</language>

<item>
    <title>PHP压缩打包文件思路</title>
    <link>https://www.alexer.cc/post/212</link>
    <description><![CDATA[<p>PHP 打包压缩最省事的就是内置的 ZipArchive 类，不用装第三方库，前提是 php.ini 里 zip 扩展开着。</p>
<p>思路就四步：建包、往里塞文件、关包、该下载下载该保存保存。目录要递归扫，包内路径必须自己拼，不然后面解压出来一片绝对路径。</p>
<pre><code class="language-php">$zip = new ZipArchive();
$file = 'pack.zip';
// CREATE 没有就建，OVERWRITE 有就覆盖
if ($zip-&gt;open($file, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) {
    exit('打开失败');
}

// 递归把一个目录里的东西全塞进包
function addDir($zip, $dir, $base = '') {
    foreach (scandir($dir) as $f) {
        if ($f == '.' || $f == '..') continue;
        $path  = $dir . '/' . $f;
        $local = $base . $f;              // 压缩包里的相对路径
        if (is_dir($path)) {
            $zip-&gt;addEmptyDir($local);
            addDir($zip, $path, $local . '/');
        } else {
            $zip-&gt;addFile($path, $local); // 第二个参数不能省
        }
    }
}

addDir($zip, './upload');
$zip-&gt;close(); // 不关包文件是坏的</code></pre>
<p>几个坑：addFile 第二个参数是包内路径，别省；文件多的时候先 set_time_limit(0)；打包完一定要 close。</p>
<p>标签：PHP,ZipArchive,文件打包</p>]]></description>
    <pubDate>Mon, 09 Nov 2026 17:56:52 +0800</pubDate>
    <dc:creator>Alexer</dc:creator>
    <guid>https://www.alexer.cc/post/212</guid>
</item>
<item>
    <title>PHP错误日志查看位置</title>
    <link>https://www.alexer.cc/post/208</link>
    <description><![CDATA[<p>找PHP报错日志，先盯两个配置：php.ini 里的 log_errors 和 error_log。</p><p>不知道日志写到哪了，直接在命令行敲一句就能查出来：</p><pre><code>php -i | grep error_log
# 输出就是当前生效的日志路径</code></pre><p>或者建个 test.php 跑 phpinfo，搜 error_log 一样能看。</p><p>常见默认位置记一下：</p><ul><li>Linux 装 php-fpm：/var/log/php-fpm/www-error.log</li><li>源码编译的 PHP：/usr/local/php/var/log/ 下面</li><li>小皮面板 Windows：phpstudy_pro/Extensions/php/php7.x/logs/ 里的 php_error.log</li><li>Apache 环境：Apache/logs/error.log，PHP 报错也会往这写</li><li>宝塔：/www/wwwlogs/ 里对应站点的 .log</li></ul><p>不想改全局配置，就在入口文件里临时指一个位置：</p><pre><code>ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/php_err.log'); // 自己指定日志文件
error_reporting(E_ALL); // 报错全开，方便排查</code></pre><p>另外 Nginx 报 502，别只翻 PHP 日志，nginx 的 error.log 和 php-fpm 日志一起看，问题基本都在那边。</p>]]></description>
    <pubDate>Mon, 09 Nov 2026 09:54:25 +0800</pubDate>
    <dc:creator>Alexer</dc:creator>
    <guid>https://www.alexer.cc/post/208</guid>
</item>
<item>
    <title>服务器文件上传方法</title>
    <link>https://www.alexer.cc/post/207</link>
    <description><![CDATA[<p>往服务器上传文件，常见的方式有三种：用面板、用FTP、用代码。</p>
<p>小皮面板最省事：登录面板 → 网站 → 找到对应站点 → 点开根目录 → 文件管理 → 上传，大文件直接拖进去就行。Linux 下记得给网站目录 www 可写权限，不然传上去照样报错。</p>
<p>FTP 用 FileZilla：主机填 IP，端口 21，SFTP 就填 22，再填账号密码，左边是本地、右边是服务器，选好文件往右边拖。传完核对一下文件大小，别断在半路。</p>
<p>想在网页上直接传，用 PHP 写个上传页：</p>
<pre><code>&lt;form method="post" enctype="multipart/form-data"&gt;
  &lt;input type="file" name="f"&gt;
  &lt;input type="submit" value="上传"&gt;
&lt;/form&gt;
&lt;?php
if (!empty($_FILES['f']['name'])) {
    $dir  = __DIR__ . '/upload/';          // 目标目录，必须可写
    $name = basename($_FILES['f']['name']); // 只取文件名，去掉路径
    move_uploaded_file($_FILES['f']['tmp_name'], $dir . $name);
    echo '上传成功：' . $name;
}
?&gt;</code></pre>
<p>命令行更干脆：<code>scp -r ./dist root@1.2.3.4:/www/wwwroot/site/</code>，本地整个目录一口气推上去，改完再跑一次就同步了。</p>
<p>标签：服务器,文件上传,PHP</p>]]></description>
    <pubDate>Mon, 09 Nov 2026 05:34:27 +0800</pubDate>
    <dc:creator>Alexer</dc:creator>
    <guid>https://www.alexer.cc/post/207</guid>
</item>
<item>
    <title>PHP获取表单提交内容</title>
    <link>https://www.alexer.cc/post/206</link>
    <description><![CDATA[<p>表单靠 method 决定怎么传数据，post 提交就用 <code>$_POST</code> 接，get 提交就用 <code>$_GET</code> 接。<code>$_POST</code> 里的键名，就是 input 的 name 值，一个对一个。</p><p>如果直接取一个还没提交的值，就会报 Undefined index 警告，所以先用 isset 判断一下，稳一点。</p><pre><code class="language-html">&lt;!-- 表单页面 form.html --&gt;
&lt;form action="get.php" method="post"&gt;
    昵称：&lt;input type="text" name="nick"&gt;
    密码：&lt;input type="password" name="pwd"&gt;
    爱好：&lt;input type="checkbox" name="hobby[]" value="游戏"&gt;游戏
    &lt;input type="submit" value="提交"&gt;
&lt;/form&gt;</code></pre><pre><code class="language-php">&lt;?php
// get.php 接收端
if (isset($_POST['nick'])) {
    $nick = trim($_POST['nick']);   // 去掉前后空格
    $pwd  = $_POST['pwd'];

    // 输出前转义，防止内容被当成 HTML 标签执行
    echo '昵称：' . htmlspecialchars($nick) . '&lt;br&gt;';
    echo '密码长度：' . strlen($pwd);

    // 同名复选框带 [] 的，收到的是数组
    if (isset($_POST['hobby'])) {
        print_r($_POST['hobby']);
    }
} else {
    echo '没收到数据，别直接访问这个页面';
}
?&gt;</code></pre><p>GET 就是从网址后面拿参数，<code>$_GET['id']</code> 对应 <code>index.php?id=5</code>；POST 的数据藏在请求体里，网址上看不到。<code>$_REQUEST</code> 是 GET、POST、Cookie 全收，图省事能用，但出了问题不好查，知道有这么个东西就行。</p>]]></description>
    <pubDate>Mon, 09 Nov 2026 01:33:24 +0800</pubDate>
    <dc:creator>Alexer</dc:creator>
    <guid>https://www.alexer.cc/post/206</guid>
</item>
<item>
    <title>MySQL数据表备份</title>
    <link>https://www.alexer.cc/post/205</link>
    <description><![CDATA[<p>备份说白了就是把表导成一个 SQL 文件，哪天删错了、改崩了，直接导回去。最常用的是 mysqldump，MySQL 自带，不用另外装东西。</p>
<pre><code># 备份单张表，导成 sql 文件
mysqldump -uroot -p123456 shop goods &gt; /backup/goods.sql

# 一次备多张表，表名后面空格隔开
mysqldump -uroot -p123456 shop goods orders &gt; /backup/two.sql

# 只要表结构不要数据，加 -d
mysqldump -uroot -p123456 -d shop goods &gt; /backup/goods_struct.sql

# 恢复数据，前面是 mysql 不是 mysqldump
mysql -uroot -p123456 shop &lt; /backup/goods.sql
</code></pre>
<p>踩过的坑记一下：大表备份会锁表，业务忙的时候加 --single-transaction，这参数只对 InnoDB 管用；-p 后面直接跟密码会留在命令历史里，正式环境就敲 -p 回车再输；备份目录必须给写权限，权限不够会报错，别以为文件生成了就是备成功了。</p>
<p>备完不算完，隔三差五拿个测试库导一次，能导回去才叫备份。要天天备就扔进 crontab，凌晨跑一条省心。</p>]]></description>
    <pubDate>Sun, 08 Nov 2026 21:30:18 +0800</pubDate>
    <dc:creator>Alexer</dc:creator>
    <guid>https://www.alexer.cc/post/205</guid>
</item>
<item>
    <title>PHP输出内容语句</title>
    <link>https://www.alexer.cc/post/204</link>
    <description><![CDATA[<p>PHP 输出内容翻来覆去就几个：echo、print、print_r、var_dump，再加格式化用的 printf 和 sprintf。</p><p>echo 是语句不是函数，能一次甩出多个值，用逗号隔开，比点号拼接省点性能，没有返回值。print 只能输出一个值，返回 1，所以能塞进表达式里，实际写代码基本还是 echo 顺手。</p><p>看数组和对象结构用 print_r，要连类型和长度一起看就用 var_dump，调 bug 全靠它俩。注意浏览器里直接输出数组会挤成一行，外面套个 pre 标签才排得开。</p><p>需要拼格式化字符串时，printf 直接输出，sprintf 只返回字符串不打印，可以先存起来后面接着用。</p><pre><code class="language-php">&lt;?php
echo "你好", "世界";              // 逗号连输出多个，比点号快
print "hello";                    // 只能一个值，返回1
$arr = ['a' =&gt; 1, 'b' =&gt; 2];
print_r($arr);                     // 看数组结构，调试常用
var_dump($arr);                    // 连类型和长度一起打出来
printf("%s今年%d岁", "小明", 18);   // 按格式输出
$s = sprintf("%.2f", 3.14159);     // 只返回字符串，不输出
echo $s;
?&gt;</code></pre><p>标签：PHP,echo,输出语句</p>]]></description>
    <pubDate>Sun, 08 Nov 2026 05:16:45 +0800</pubDate>
    <dc:creator>Alexer</dc:creator>
    <guid>https://www.alexer.cc/post/204</guid>
</item>
<item>
    <title>操作系统基础认识</title>
    <link>https://www.alexer.cc/post/203</link>
    <description><![CDATA[<p>操作系统说白了就是电脑的大管家，上面接软件，下面管硬件。CPU、内存、硬盘、键鼠这些零件全靠它调度，没它硬件就是一盘散沙，啥也干不成。</p>
<p>平时用的 Windows、macOS 属于桌面系统，服务器上跑的多半是 Linux，常见的有 CentOS、Ubuntu，也有 Windows Server。最大的区别是 Linux 基本靠命令行干活，图形界面能省就省，远程连上去就是黑框框。</p>
<p>搭环境之前先摸清自家系统版本，别上来就瞎装。查版本两条命令搞定：</p>
<pre><code class="language-bash"># Windows 下看系统信息
systeminfo

# Linux 下看系统版本
cat /etc/os-release</code></pre>
<p>还有个新手常踩的坑是路径写法：Windows 用反斜杠，比如 <code>C:\phpstudy_pro\WWW</code>；Linux 用正斜杠，比如 <code>/www/wwwroot</code>，而且 Linux 区分大小写，<code>Index.php</code> 和 <code>index.php</code> 是两个文件，写脚本时别搞混。</p>
<p>另外操作系统管进程，一个程序跑起来就是一个进程，卡死了直接杀掉就行。Windows 用任务管理器，Linux 用 <code>ps aux</code> 看、<code>kill -9 进程号</code> 杀。搞服务器维护，这两下子必须会。</p>
<p>标签：操作系统,电脑基础,Linux入门</p>]]></description>
    <pubDate>Sun, 08 Nov 2026 02:15:34 +0800</pubDate>
    <dc:creator>Alexer</dc:creator>
    <guid>https://www.alexer.cc/post/203</guid>
</item>
<item>
    <title>网站静态资源加载慢</title>
    <link>https://www.alexer.cc/post/202</link>
    <description><![CDATA[<p>静态资源就是图片、CSS、JS、字体这些不常变的东西。加载慢多半就三个原因：服务器没开压缩、没设浏览器缓存、文件本身太肥。</p>
<p>先说压缩。小皮面板里进站点→设置→配置文件，在 server 块里塞下面几行，重启 Nginx 生效。</p>
<pre><code>gzip on;                    # 总开关
 gzip_min_length 1k;        # 小于1k别压，越压越慢
 gzip_comp_level 5;         # 压缩级别1-9，5够用不费CPU
 gzip_types text/css application/javascript image/svg+xml;  # 要压的类型</code></pre>
<p>再设缓存，让浏览器把图片和脚本存本地，第二次打开就不用再找服务器要。</p>
<pre><code>location ~* \.(jpg|jpeg|png|gif|css|js|woff2)$ {
    expires 30d;                              # 30天过期
    add_header Cache-Control "public";        # 允许中间缓存
}</code></pre>
<p>用的是 Apache 就在 .htaccess 里开 mod_deflate 和 mod_expires，思路一样。</p>
<p>最后收拾文件本身：图片转 webp 能小一大截，CSS、JS 能合就合，用不上的插件样式直接删。传奇三端那种网页登录器、充值页也吃这套配置，静态图多，压完打开明显快。</p>]]></description>
    <pubDate>Sat, 07 Nov 2026 23:15:09 +0800</pubDate>
    <dc:creator>Alexer</dc:creator>
    <guid>https://www.alexer.cc/post/202</guid>
</item>
<item>
    <title>网站根目录是什么</title>
    <link>https://www.alexer.cc/post/201</link>
    <description><![CDATA[<p>网站根目录说白了就是网站文件放的最外层那个文件夹。浏览器访问 http://你的域名/1.php，服务器就去根目录里翻 1.php。</p>
<p>小皮面板 Windows 版默认站点在 C:\phpstudy_pro\WWW\ 下面，建一个文件夹就是一个站，那个文件夹就是根目录。Apache 改 httpd.conf 里的 DocumentRoot，Nginx 改站点配置里的 root，指到哪，哪就是根目录。默认首页一般认 index.php 或 index.html，两个都没有就给你报 403。</p>
<p>搞传奇三端的时候，根目录里一般扔登录器配置、补丁下载包，玩家点下载就是从这个目录读文件，路径写错了下载就 404。</p>
<pre><code>server {
    listen 80;
    server_name localhost;
    root   D:/phpstudy_pro/WWW/blog;   # 这一行就是网站根目录
    index  index.php index.html;       # 默认首页
}</code></pre>]]></description>
    <pubDate>Sat, 07 Nov 2026 20:15:02 +0800</pubDate>
    <dc:creator>Alexer</dc:creator>
    <guid>https://www.alexer.cc/post/201</guid>
</item>
<item>
    <title>小皮面板切换Apache和Nginx</title>
    <link>https://www.alexer.cc/post/200</link>
    <description><![CDATA[<p>小皮面板切换 Apache 和 Nginx，入口就在首页“套件”那一栏，点下按钮就切，但有几个坑得先记住。</p><p>第一，切换前先把当前服务停掉，不然 80 端口占着，切过去起不来。第二，切完重启服务，再刷新浏览器。</p><p>第三，伪静态规则不通用。Apache 认网站根目录下的 .htaccess，Nginx 不认，得在站点设置里重新挑伪静态规则，或者直接往 Nginx 配置里写 rewrite。</p><pre><code># Apache：.htaccess 放网站根目录
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

# Nginx：站点配置里加
location / {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?s=$1 last;
    }
}</code></pre><p>第四，切换后网站打不开，先看端口是不是被 IIS、迅雷之类占了，面板首页有端口检测。第五，数据库和 PHP 版本不受影响，不用重装，站点根目录也不变。</p><p>标签：小皮面板,Apache,Nginx</p>]]></description>
    <pubDate>Sat, 07 Nov 2026 17:14:18 +0800</pubDate>
    <dc:creator>Alexer</dc:creator>
    <guid>https://www.alexer.cc/post/200</guid>
</item>
</channel>
</rss>