JefCounts 是一个轻量级的网站访问统计系统，帮助您了解网站的访问情况。
这是什么JefCounts 能帮你了解网站的访问情况，包括有多少人访问、从哪里来、用什么设备等基本信息。数据完全存储在您自己的服务器上，保护隐私安全。官方网址：https://jesoo.org/https://www.jefcounts.com/文件下载：{cloud title="网站访问统计系统" type="lz" url="https://wwbwh.lanzouw.com/iql0U3ptw0yj" password=""/}{cloud title="夸克网盘" type="default" url="https://pan.quark.cn/s/272532d41f55" password=""/}
网站的 Favicon 图片文件网站的 logo 图片文件网站目前搭建在虚拟主机上：七枫主机计划任务：1、在现在这个虚拟主机上加一个自动备份的功能，防止虚拟主机挂了2、呃呃呃呃呃。。。
我自己有很多的账号，不知道大家是不是跟我一样，像我喜欢在互联网冲浪，就会有很多平台不同的账号，这也导致了账号太多，如果不是刻意记我可能都忘了我还有个账号为此我专门做了一个可以管理账号的工具，可以记录账号密码链接还可以分类可以备注，算是很齐全了，不过有一个不好的点就是不能同步信息，需要换设备就得手动备份数据然后导入，这样做的好处是所有账号信息只存本地，并不会上传服务器，绝对的安全性，这是我想要的效果我也不是没有想过用做数据同步功能，事实上我不仅想我还做了，只不过考虑到这些都是重要且敏感的信息，放任何服务器都不能保证绝对的安全，思来想去我就想到做成离线的，这样只要管理好自己的数据就不会泄露说了这么多我来正式介绍一下我的这个账号管理器是怎么实现的吧！这是一个单文件 .html 文件，一个纯前端网页工具，这意味着不联网也可以使用，HTML的好处就是在电脑上双击就可以打开使用，不用像安装程序那样担心流氓软件的问题，文件总大小只有几十KB这个工具不止电脑上可以使用，手机上也可以，如果你懂一点文件管理器，你就可以在文件管理器找到这个文件，选择用浏览器打开，这样就可以像电脑端一样流畅的使用了，对了，打开以后收藏这个网页，只要不移动文件，你就可以一直使用了除此之外，还可以部署成一个网页网站，就是把这个HTML文件部署到你的网站上，这样就可以用链接访问了，不限设备，不管电脑、平板还是手机都可以访问我自己已经部署了一个账号管理器的网站，链接放下面了，我平时也是用这个链接直接使用，当然我并不是推荐你使用，只是为了让不知道怎么用的朋友能够快速使用体验到这个工具，也可以作为演示给大家看看因为这是我自己搭建的所以我需要维护，如果我不维护了，链接访问不了了，大家的数据又没有做备份那你的数据可能就丢了，所以不太推荐大家直接用这个链接如果非要用的话，我建议大家记得常备份数据，自己也下载一份HTML原文件保留，这样即使网站关了，大家依旧可以用原文件导入数据使用这里是我搭建的账号管理器网站链接：https://a.aszv.top/zhanghao/就这样吧，我自己从做好这个工具到现在使用了差不多有三个月的时间了，现在这个工具已经算是最终稳定的一个版本了，我用这个工具记录了差不多有100个账号信息了，依旧稳定没有任何问题Bug最后如果你也需要这样一个工具，你也跟我有一样的烦恼，我也在这分享出来，免费提供给大家使用，自己做的，我是放心，分享出来的文件里也能看到所有代码，如果你也懂代码，你可以自己检查是否安全，也欢迎大家互相交流学习，使用时遇到什么问题欢迎在评论区评论，我都会看的最后如果这个工具对你有所帮助，还希望你能打赏一下，0.1也是一份心意，你的打赏是我坚持下去的动力这里放一个打赏链接：访问链接跳转打赏页面，在打赏页面上可以看到打赏的人大家有什么奇奇怪怪的想法也可以在下方留言，我打算收集一下大家的意见，想知道大家平时都会遇到那些烦恼，有什么是可以用网站来实现的
我自己有很多的账号，不知道大家是不是跟我一样，像我喜欢在互联网冲浪，就会有很多平台不同的账号，这也导致了账号太多，如果不是刻意记我可能都忘了我还有个账号为此我专门做了一个可以管理账号的工具，可以记录账号密码链接还可以分类可以备注，算是很齐全了，不过有一个不好的点就是不能同步信息，需要换设备就得手动备份数据然后导入，这样做的好处是所有账号信息只存本地，并不会上传服务器，绝对的安全性，这是我想要的效果我也不是没有想过用做数据同步功能，事实上我不仅想我还做了，只不过考虑到这些都是重要且敏感的信息，放任何服务器都不能保证绝对的安全，思来想去我就想到做成离线的数据只能物理管理，这样只要我管理好我的数据就不会泄露说了这么多我来正式介绍一下我的这个账号管理器是怎么实现的吧！这是一个单文件 .html 文件，一个纯前端网页工具，这意味着不联网也可以使用，HTML的好处就是在电脑上双击就可以打开使用，不用像安装程序那样担心流氓软件的问题，文件总大小只有几十KB这个文件总不能只能在电脑上使用吧！不是的，手机上也可以，如果你懂一点文件管理器，你就可以在文件管理器找到这个文件，选择用浏览器打开，这样就可以像电脑端一样流畅的使用了，对了，打开以后收藏这个网页，只要不移动文件，你就可以一直使用了除此之外，还可以部署成一个网页网站，就是把这个HTML文件部署到你的网站上，这样就可以用连接访问了，不限设备，不管电脑、平板还是手机都可以访问，不过依旧不会数据同步，这只是另一种使用的方式，实际上的效果并没有变化，本地使用是什么样依旧还是一样的就这样吧，我自己从做好这个工具到现在使用了差不多有三个月的时间了，现在这个工具已经算是最终稳定的一个版本了，我用这个工具记录了差不多有100个账号信息了，依旧稳定没有任何问题Bug最后如果你也需要这样一个工具，你也跟我有一样的烦恼，我也在这分享出来，免费提供给大家使用，自己做的，我是放心，分享出来的文件里也能看到所有代码，如果你也懂代码，你可以自己检查是否安全，也欢迎大家互相交流学习，使用时遇到什么问题欢迎在评论区评论，我都会看的
一键备份+跨主机传输！PHP全自动网站备份脚本，零依赖超省心
对于站长和开发者来说，网站数据备份是保障资产安全的最后一道防线。手动备份不仅繁琐耗时，还容易遗漏文件或数据库，一旦服务器故障、误操作删库，数据丢失的损失难以估量。今天给大家分享一款纯PHP编写、零依赖、开箱即用的全自动备份脚本，无需安装任何软件，只需简单配置，就能一键备份网站全部文件+数据库，并自动通过FTP传输到另一台虚拟主机，实现异地容灾备份，彻底告别数据丢失风险。一、脚本核心优势这款备份脚本专为虚拟主机/轻量服务器环境设计，完美解决新手站长备份难、传输难的问题，核心亮点：零依赖纯PHP：无需宝塔、无需系统命令，支持所有PHP运行环境，上传即用；双备份全覆盖：自动备份网站所有文件 + MySQL数据库，一键打包；异地传输安全：备份完成后自动通过FTP上传到另一台主机，本地不留临时文件；容错性强：数据库配置错误、数据库信息为空，自动跳过并提示；自动清理：备份、上传完成后自动删除本地临时文件，不占用服务器空间；简单配置：仅需填写数据库和FTP信息，小白也能快速上手。二、脚本完整代码（可直接复制使用）<?php // ========================================== // 配置区：请根据面板信息填写以下内容 // ========================================== $config = [ // 本地数据库配置（当前A虚拟主机的数据库信息） 'db_host' => 'localhost', // 数据库地址，一般固定为localhost 'db_name' => '', // 填写：数据库名 'db_user' => '', // 填写：数据库用户名 'db_pass' => '', // 填写：数据库密码 // 目标FTP配置（要备份到的B虚拟主机FTP信息） 'ftp_host' => '', // 填写：FTP服务器IP地址 'ftp_port' => 21, // FTP端口，默认21无需修改 'ftp_user' => '', // 填写：FTP用户名 'ftp_pass' => '', // 填写：FTP密码 'ftp_dir' => '/', // FTP上传目录，默认/无需修改 ]; // 运行配置 ini_set('display_errors', 0); error_reporting(0); ini_set('max_execution_time', '600'); ini_set('memory_limit', '1G'); // 路径 $webRoot = __DIR__; $backupDir = $webRoot . '/_backup'; @mkdir($backupDir, 0755, true); $time = date('Ymd_His'); $zipFile = $backupDir . "/backup_$time.zip"; $sqlFile = $backupDir . "/db_$time.sql"; $includeDatabase = false; // --------------------------- // 数据库备份（可失败，不中断） // --------------------------- if (!empty($config['db_name']) && !empty($config['db_user'])) { $mysqli = @new mysqli($config['db_host'], $config['db_user'], $config['db_pass'], $config['db_name']); if ($mysqli->connect_error) { echo "数据库信息错误，跳过数据库备份，仅打包网站文件\n"; } else { $mysqli->set_charset('utf8mb4'); $tables = @$mysqli->query("SHOW TABLES"); if ($tables) { $sqlContent = "SET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS=0;\n\n"; while ($row = $tables->fetch_row()) { $table = $row[0]; $create = $mysqli->query("SHOW CREATE TABLE `$table`")->fetch_row()[1]; $sqlContent .= "DROP TABLE IF EXISTS `$table`;\n$create;\n\n"; $data = $mysqli->query("SELECT * FROM `$table`"); while ($item = $data->fetch_assoc()) { $values = array_map([$mysqli, 'real_escape_string'], $item); $sqlContent .= "INSERT INTO `$table` VALUES ('" . implode("','", $values) . "');\n"; } $sqlContent .= "\n\n"; } file_put_contents($sqlFile, $sqlContent); $includeDatabase = true; } } } else { echo "数据库信息为空，跳过数据库备份，仅打包网站文件\n"; } // --------------------------- // 打包网站文件 // --------------------------- $zip = new ZipArchive(); if ($zip->open($zipFile, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) { die("压缩包创建失败，目录无权限或空间不足"); } if ($includeDatabase && file_exists($sqlFile)) { $zip->addFile($sqlFile, basename($sqlFile)); } function addDirToZip($root, $dir, $zip) { $handle = opendir($dir); while (($file = readdir($handle)) !== false) { if ($file == '.' || $file == '..' || $file == basename(__FILE__) || strpos($dir, '_backup') !== false) continue; $path = $dir . '/' . $file; if (is_dir($path)) { addDirToZip($root, $path, $zip); } else { $zip->addFile($path, str_replace($root . '/', '', $path)); } } closedir($handle); } addDirToZip($webRoot, $webRoot, $zip); $zip->close(); // 删除临时SQL if (file_exists($sqlFile)) { unlink($sqlFile); } // --------------------------- // FTP 上传 // --------------------------- if (empty($config['ftp_host']) || empty($config['ftp_user'])) { delDir($backupDir); die("FTP信息未填写，无法上传"); } $ftpConn = @ftp_connect($config['ftp_host'], $config['ftp_port']); if (!$ftpConn) { delDir($backupDir); die("FTP连接失败，请检查FTP地址和端口"); } if (!@ftp_login($ftpConn, $config['ftp_user'], $config['ftp_pass'])) { ftp_close($ftpConn); delDir($backupDir); die("FTP登录失败，请检查用户名和密码"); } ftp_set_option($ftpConn, FTP_USEPASVADDRESS, false); ftp_pasv($ftpConn, true); if (!@ftp_chdir($ftpConn, $config['ftp_dir'])) { ftp_close($ftpConn); delDir($backupDir); die("FTP目录切换失败，目录不存在"); } if (!@ftp_put($ftpConn, basename($zipFile), $zipFile, FTP_BINARY)) { ftp_close($ftpConn); delDir($backupDir); die("文件上传失败，无写入权限或空间已满"); } ftp_close($ftpConn); // 删除临时目录 function delDir($dir) { if (!is_dir($dir)) return; foreach (scandir($dir) as $file) { if ($file == '.' || $file == '..') continue; $path = $dir . '/' . $file; is_dir($path) ? delDir($path) : unlink($path); } rmdir($dir); } delDir($backupDir); // 成功提示 echo "任务执行完成，文件已上传至目标主机\n"; if ($includeDatabase) { echo "已包含网站文件 + 数据库\n"; } else { echo "仅包含网站文件（数据库未备份）\n"; } ?>三、使用教程（5分钟配置完成）1. 准备工作准备当前网站的数据库信息（主机、库名、用户名、密码，虚拟主机面板可查看）；准备接收备份的主机FTP信息（IP、用户名、密码、端口，默认21）；将脚本保存为backup.php，上传到网站根目录（和index.php同级）。2. 核心配置打开脚本，找到配置区，仅需修改以下参数：// 本地数据库配置 'db_name' => '你的数据库名', 'db_user' => '你的数据库用户名', 'db_pass' => '你的数据库密码', // 目标FTP配置 'ftp_host' => 'FTP服务器IP', 'ftp_user' => 'FTP用户名', 'ftp_pass' => 'FTP密码',其他参数默认即可，无需修改。3. 执行备份浏览器访问：你的域名/backup.php（例如：https://xxx.com/backup.php）；等待脚本执行，页面会显示执行结果；成功后，备份文件会自动上传到目标FTP主机，本地无残留文件。四、脚本执行流程详解环境初始化：设置脚本超时时间、内存限制，创建临时备份目录；数据库备份：自动连接MySQL，导出所有数据表结构和数据，生成SQL文件；文件打包：递归遍历网站所有文件，排除脚本自身和临时目录，打包为ZIP压缩包；FTP传输：自动连接目标FTP服务器，上传压缩包，支持被动模式（兼容绝大多数主机）；自动清理：上传完成后删除本地SQL文件和临时目录，释放服务器空间；结果提示：清晰展示备份结果，告知是否包含数据库、传输是否成功。五、常见问题解决1. 压缩包创建失败原因：网站目录无写入权限，或服务器空间不足；解决：给网站根目录设置755权限，清理服务器冗余文件。2. FTP连接/上传失败原因：FTP信息填写错误、端口被拦截、目标主机空间不足；解决：核对FTP信息，开启被动模式（脚本已默认配置），检查目标主机空间。3. 数据库备份失败原因：数据库信息错误、数据库连接限制；解决：核对数据库账号密码，确认数据库地址为localhost。4. 脚本执行超时解决：脚本已默认设置10分钟超时，大网站可将max_execution_time改为1200。六、进阶使用建议定时自动备份：结合虚拟主机的计划任务（Corn），每天/每周自动执行脚本，实现无人值守备份；多主机备份：配置多组FTP信息，可将备份同时上传到多个主机，双重保障；备份文件管理：在目标FTP主机创建专门的备份目录，按时间分类存储，方便回溯；安全防护：备份完成后可删除脚本，或修改脚本文件名，避免未授权访问。总结数据安全是网站运营的重中之重，这款PHP全自动备份脚本，用最简单的方式解决了站长最核心的备份需求。无需专业技术，无需额外成本，上传配置即可使用，真正实现网站文件+数据库一键备份、异地传输、自动清理。
简单来说，这代码就干一件事：做个密码验证页面。用户输入密码对了就跳转到正文，错了就提示重试。二维码放那儿是引导关注公众号拿密码的，相当于把流量导到公众号去。技术上就是最基础的HTML+CSS+JS，没用什么框架，加载快，手机电脑都能正常显示。说白了就是个带门槛的门帘，想看内容？先关注公众号拿钥匙。代码中的公众号二维码图片引用了网页同目录下的 gongzhonghao.png 图片，密码在代码底部区域可以自由修改。 访问验证 禁止打开F12哦~ 安全访问验证 关注公众号 获取访问密码 立即解锁
以下是您所需的“魔法8号球占卜师”的完整代码。它是一个交互式Web应用，结合PHP后端与HTML/CSS前端，提供随机占卜答案并记录历史。<?php session_start(); // 定义魔法8号球的所有可能答案 (有趣且多样) $answers = [ "✨ 绝对是的！", "🌟 毫无疑问，会成真。", "🔮 是的，命运如此安排。", "💫 可以期待好结果。", "🍀 迹象表明，是的。", "🎲 再问一次，可能更明确。", "🤔 暂时无法预测，专注当下。", "🌙 别指望它。", "💧 前景不太乐观。", "⚠️ 我的回答是否定的。", "❓ 别问这种问题，自己决定！", "⭐ 非常有希望！", "🌈 只要你相信自己，就会实现。", "🍕 答案是肯定的，而且我饿了。", "🎈 再掷一次球吧，思绪混乱。", "🐙 章鱼说：有可能是。", "🃏 笑一笑，答案乐观！", "🎯 集中精力，再问一次。" ]; // 有趣事实库 (每次刷新页面随机展示) $funFacts = [ "🐙 章鱼有三颗心脏，血液是蓝色的。", "🍌 从植物学角度讲，香蕉是一种浆果。", "🦷 人类和长颈颈都有同样数量的颈椎骨，都是7块。", "🐧 企鹅会通过跳舞找到配偶。", "📜 古代玛雅人用可可豆当作货币。", "🎨 梵高一生只卖出了一幅画《红色葡萄园》。", "🌍 每天大约有100吨宇宙尘埃落到地球上。", "🐘 大象是唯一不能跳跃的哺乳动物。", "🍿 爆米花在微波炉发明之前就已存在数百年。", "🎵 听音乐可以让你跑步耐力提高15%。" ]; // ------------------ 处理清除历史 ------------------ if (isset($_GET['clear']) && $_GET['clear'] === 'history') { unset($_SESSION['history']); header("Location: " . strtok($_SERVER["REQUEST_URI"], '?')); exit; } // ------------------ 处理占卜提交 ------------------ $prediction = null; $askedQuestion = null; $errorMsg = null; if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['question'])) { $askedQuestion = trim($_POST['question']); if ($askedQuestion !== '') { // 随机获取答案 $randomKey = array_rand($answers); $chosenAnswer = $answers[$randomKey]; // 保存到历史记录 $historyItem = [ 'question' => $askedQuestion, 'answer' => $chosenAnswer, 'time' => date("H:i:s"), 'date' => date("Y-m-d") ]; if (!isset($_SESSION['history'])) { $_SESSION['history'] = []; } // 限制历史最多10条 array_unshift($_SESSION['history'], $historyItem); if (count($_SESSION['history']) > 10) { array_pop($_SESSION['history']); } $prediction = $chosenAnswer; } else { $errorMsg = "🤨 请输入一个问题给我占卜呀～"; } } // 随机选取一个有趣事实 (刷新页面或提交都会变) $randomFact = $funFacts[array_rand($funFacts)]; ?> ✨ 魔法8号球占卜师 | 超有趣预言神器 🎱 魔法8号球 ✨ ➤ 问一个问题，然后摇晃心灵之球，答案将指引你 ✨ 8 <?php if ($prediction !== null): ?> 📜 你的问题： “<?php echo htmlspecialchars($askedQuestion); ?>” 🔮 魔法球回答： ✨ <?php echo htmlspecialchars($prediction); ?> ✨ <?php elseif ($errorMsg): ?> ⚠️ <?php echo htmlspecialchars($errorMsg); ?> <?php else: ?> 🤫 我在等待你的问题... 问问命运吧！ <?php endif; ?> <input type="text" name="question" placeholder="例如：我今天会遇到好事吗？ 或者 我该尝试新事物吗？" value="<?php echo $askedQuestion ? htmlspecialchars($askedQuestion) : ''; ?>" autocomplete="off"> 🪄 摇动魔法球 · 揭示命运 🎱 🗑️ 清除历史记录 🧠 今天冷知识 🎲 <?php echo htmlspecialchars($randomFact); ?> 📜 占卜历史录 最多10条 <?php if (isset($_SESSION['history']) && count($_SESSION['history']) > 0): ?> <?php foreach ($_SESSION['history'] as $record): ?> ❓ <?php echo htmlspecialchars(mb_substr($record['question'], 0, 60)); ?> 🎱 <?php echo htmlspecialchars($record['answer']); ?> 📅 <?php echo $record['date']; ?> <?php echo $record['time']; ?> <?php endforeach; ?> <?php else: ?> ✨ 暂无占卜记录，问问魔法球吧 ✨ <?php endif; ?> 🌟 魔法8号球仅作娱乐，让生活多一点神秘与乐趣！ | PHP + HTML 趣味交互 🌟
跨平台引流博客分享文件变现方法
用户获取文件方式：先全部引流到博客网站，然后在博客网站里面引导至公众号获取文件，可是公众号容易挂了。引导加微信获取，微信也容易挂了。不引流只在博客网站又容易流失用户，而且用户只访问一次。
虚拟主机数据库与根目录数据备份迁移实现
简单来说，这是一个单PHP文件，通过访问链接实现自动备份网站数据到另一台虚拟主机（FRP）把backup.php文件放在需要备份数据的文件目录（一般是网站根目录），填写数据库信息以及需要备份到的网站FRP信息，然后访问 https://你的域名/backup.php 即可实现自动备份数据完美找到问题了！你是宝塔/梦奈宝塔创建的虚拟主机 → FTP 目录规则和普通主机不一样！✅ 宝塔虚拟主机的 FTP 登录后直接就是网站根目录，根本没有 /public_html 这个文件夹，所以报错！100% 解决：FTP 目录直接填 / 即可我给你最终修正版脚本，只改了目录为 /，完全适配你的宝塔虚拟主机，直接用！<?php // ========================================== // 【只需修改这里】 // ========================================== $config = [ // 数据库（你已经填好，不用动） 'db_host' => 'localhost', 'db_name' => '你的数据库名', 'db_user' => '你的数据库账号', 'db_pass' => '你的数据库密码', // FTP 重点！！！宝塔虚拟主机专用配置 'ftp_host' => 'FTP IP', 'ftp_port' => 21, 'ftp_user' => 'FTP账号', 'ftp_pass' => 'FTP密码', // 宝塔虚拟主机：直接写 / 就是根目录！ 'ftp_dir' => '/', ]; // ========================================== // 强制开启错误提示 // ========================================== error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('max_execution_time', '600'); ini_set('memory_limit', '1G'); // 路径 $webRoot = __DIR__; $backupDir = $webRoot . '/_backup'; @mkdir($backupDir, 0755, true); $date = date('Ymd_His'); $zipFile = $backupDir . "/backup_$date.zip"; $sqlFile = $backupDir . "/db_$date.sql"; // -------------------- // 1. 导出数据库 // -------------------- $mysqli = new mysqli($config['db_host'], $config['db_user'], $config['db_pass'], $config['db_name']); $mysqli->set_charset('utf8mb4'); $tables = $mysqli->query("SHOW TABLES"); $sql = "SET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS=0;\n\n"; while ($row = $tables->fetch_row()) { $table = $row[0]; $sql .= "DROP TABLE IF EXISTS `$table`;\n"; $create = $mysqli->query("SHOW CREATE TABLE `$table`")->fetch_row()[1]; $sql .= $create . ";\n\n"; $result = $mysqli->query("SELECT * FROM `$table`"); while ($data = $result->fetch_assoc()) { $fields = array_map(function ($v) use ($mysqli) { return $mysqli->real_escape_string($v); }, array_values($data)); $sql .= "INSERT INTO `$table` VALUES ('" . implode("','", $fields) . "');\n"; } $sql .= "\n\n"; } file_put_contents($sqlFile, $sql); // -------------------- // 2. 打包文件 // -------------------- $zip = new ZipArchive(); if ($zip->open($zipFile, ZipArchive::CREATE | ZipArchive::OVERWRITE) === true) { $zip->addFile($sqlFile, basename($sqlFile)); addDirToZip($webRoot, $webRoot, $zip); $zip->close(); } unlink($sqlFile); // -------------------- // 3. FTP 上传【调试模式】 // -------------------- echo "👉 开始FTP上传... "; // 连接FTP $ftp = ftp_connect($config['ftp_host'], $config['ftp_port']); if (!$ftp) die("❌ FTP连接失败：IP或端口错误"); echo "✅ FTP连接成功 "; // 登录FTP $login = ftp_login($ftp, $config['ftp_user'], $config['ftp_pass']); if (!$login) die("❌ FTP登录失败：账号或密码错误"); echo "✅ FTP登录成功 "; // 开启被动模式（宝塔必须开！） ftp_set_option($ftp, FTP_USEPASVADDRESS, false); ftp_pasv($ftp, true); echo "✅ 被动模式已开启 "; // 切换目录（宝塔直接用 /） if (!ftp_chdir($ftp, $config['ftp_dir'])) { die("❌ 无法进入目录：" . $config['ftp_dir'] . "（目录不存在/无权限）"); } echo "✅ 已进入上传目录 "; // 上传文件 $upload = ftp_put($ftp, basename($zipFile), $zipFile, FTP_BINARY); if (!$upload) die("❌ 上传失败：目标目录无写入权限"); // 完成 ftp_close($ftp); echo " ✅ 全部成功！文件已上传到另一台宝塔虚拟主机！ "; // 安全打包函数 function addDirToZip($root, $dir, $zip) { $handle = opendir($dir); while (($file = readdir($handle)) !== false) { if ($file == '.' || $file == '..' || $file == 'backup.php' || strpos($dir, '_backup') !== false) continue; $path = $dir . '/' . $file; if (is_dir($path)) addDirToZip($root, $path, $zip); else $zip->addFile($path, str_replace($root . '/', '', $path)); } closedir($handle); } exit; ?>为什么之前报错？宝塔/梦奈宝塔虚拟主机的 FTP 规则：FTP 登录后 → 直接进入网站根目录没有 /public_html 这个路径上传目录只需要填 / 就可以现在你只需要做用上面这个脚本确认 FTP 目录是：'ftp_dir' => '/'访问 https://你的域名/backup.php页面显示 绿色成功提示 → 另一台宝塔虚拟主机 立刻收到备份包总结你的主机是宝塔虚拟主机，FTP 目录必须填 /本地打包完全正常，现在修复路径后 FTP 上传必成功运行后看到绿色成功，就大功告成了！豆包再次修改后的完整代码<?php // ========================================== // 配置区：请根据面板信息填写以下内容 // ========================================== $config = [ // 本地数据库配置（当前A虚拟主机的数据库信息） 'db_host' => 'localhost', // 数据库地址，一般固定为localhost 'db_name' => '', // 填写：数据库名 'db_user' => '', // 填写：数据库用户名 'db_pass' => '', // 填写：数据库密码 // 目标FTP配置（要备份到的B虚拟主机FTP信息） 'ftp_host' => '', // 填写：FTP服务器IP地址 'ftp_port' => 21, // FTP端口，默认21无需修改 'ftp_user' => '', // 填写：FTP用户名 'ftp_pass' => '', // 填写：FTP密码 'ftp_dir' => '/', // FTP上传目录，默认/无需修改 ]; // 运行配置 ini_set('display_errors', 0); error_reporting(0); ini_set('max_execution_time', '600'); ini_set('memory_limit', '1G'); // 路径 $webRoot = __DIR__; $backupDir = $webRoot . '/_backup'; @mkdir($backupDir, 0755, true); $time = date('Ymd_His'); $zipFile = $backupDir . "/backup_$time.zip"; $sqlFile = $backupDir . "/db_$time.sql"; $includeDatabase = false; // --------------------------- // 数据库备份（可失败，不中断） // --------------------------- if (!empty($config['db_name']) && !empty($config['db_user'])) { $mysqli = @new mysqli($config['db_host'], $config['db_user'], $config['db_pass'], $config['db_name']); if ($mysqli->connect_error) { echo "数据库信息错误，跳过数据库备份，仅打包网站文件\n"; } else { $mysqli->set_charset('utf8mb4'); $tables = @$mysqli->query("SHOW TABLES"); if ($tables) { $sqlContent = "SET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS=0;\n\n"; while ($row = $tables->fetch_row()) { $table = $row[0]; $create = $mysqli->query("SHOW CREATE TABLE `$table`")->fetch_row()[1]; $sqlContent .= "DROP TABLE IF EXISTS `$table`;\n$create;\n\n"; $data = $mysqli->query("SELECT * FROM `$table`"); while ($item = $data->fetch_assoc()) { $values = array_map([$mysqli, 'real_escape_string'], $item); $sqlContent .= "INSERT INTO `$table` VALUES ('" . implode("','", $values) . "');\n"; } $sqlContent .= "\n\n"; } file_put_contents($sqlFile, $sqlContent); $includeDatabase = true; } } } else { echo "数据库信息为空，跳过数据库备份，仅打包网站文件\n"; } // --------------------------- // 打包网站文件 // --------------------------- $zip = new ZipArchive(); if ($zip->open($zipFile, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) { die("压缩包创建失败，目录无权限或空间不足"); } if ($includeDatabase && file_exists($sqlFile)) { $zip->addFile($sqlFile, basename($sqlFile)); } function addDirToZip($root, $dir, $zip) { $handle = opendir($dir); while (($file = readdir($handle)) !== false) { if ($file == '.' || $file == '..' || $file == basename(__FILE__) || strpos($dir, '_backup') !== false) continue; $path = $dir . '/' . $file; if (is_dir($path)) { addDirToZip($root, $path, $zip); } else { $zip->addFile($path, str_replace($root . '/', '', $path)); } } closedir($handle); } addDirToZip($webRoot, $webRoot, $zip); $zip->close(); // 删除临时SQL if (file_exists($sqlFile)) { unlink($sqlFile); } // --------------------------- // FTP 上传 // --------------------------- if (empty($config['ftp_host']) || empty($config['ftp_user'])) { delDir($backupDir); die("FTP信息未填写，无法上传"); } $ftpConn = @ftp_connect($config['ftp_host'], $config['ftp_port']); if (!$ftpConn) { delDir($backupDir); die("FTP连接失败，请检查FTP地址和端口"); } if (!@ftp_login($ftpConn, $config['ftp_user'], $config['ftp_pass'])) { ftp_close($ftpConn); delDir($backupDir); die("FTP登录失败，请检查用户名和密码"); } ftp_set_option($ftpConn, FTP_USEPASVADDRESS, false); ftp_pasv($ftpConn, true); if (!@ftp_chdir($ftpConn, $config['ftp_dir'])) { ftp_close($ftpConn); delDir($backupDir); die("FTP目录切换失败，目录不存在"); } if (!@ftp_put($ftpConn, basename($zipFile), $zipFile, FTP_BINARY)) { ftp_close($ftpConn); delDir($backupDir); die("文件上传失败，无写入权限或空间已满"); } ftp_close($ftpConn); // 删除临时目录 function delDir($dir) { if (!is_dir($dir)) return; foreach (scandir($dir) as $file) { if ($file == '.' || $file == '..') continue; $path = $dir . '/' . $file; is_dir($path) ? delDir($path) : unlink($path); } rmdir($dir); } delDir($backupDir); // 成功提示 echo "任务执行完成，文件已上传至目标主机\n"; if ($includeDatabase) { echo "已包含网站文件 + 数据库\n"; } else { echo "仅包含网站文件（数据库未备份）\n"; } ?>{dotted startColor="#ff6c6c" endColor="#1989fa"/}下面是豆包给出的最终版本以及相关说明演示网站一键备份同步工具（纯净无错版）一、工具介绍这是一款专为虚拟主机（梦奈宝塔/普通宝塔通用）打造的一键备份+自动上传同步工具，使用PHP语言编写，无需安装任何软件，只需上传到网站根目录，访问链接即可自动执行：自动打包网站全部文件可选备份数据库（不填/填错也不影响运行）自动通过FTP上传到另一台虚拟主机全程中文提示，无冗余代码、无报错、无格式干扰核心优势：数据库信息可填可不填，填错也不会中断，只备份网站文件继续上传，完全满足你双机备份、故障冗余的需求。二、完整纯净代码（无错可用版）<?php // ========================================== // 配置区：请根据面板信息填写以下内容 // ========================================== $config = [ // 本地数据库配置（当前A虚拟主机的数据库信息） 'db_host' => 'localhost', // 数据库地址，一般固定为localhost 'db_name' => '', // 填写：数据库名（可选，不填则跳过数据库备份） 'db_user' => '', // 填写：数据库用户名（可选，不填则跳过数据库备份） 'db_pass' => '', // 填写：数据库密码（可选，不填则跳过数据库备份） // 目标FTP配置（要备份到的B虚拟主机FTP信息） 'ftp_host' => '', // 填写：FTP服务器IP地址（必须填写，用引号包裹） 'ftp_port' => 21, // FTP端口，默认21无需修改 'ftp_user' => '', // 填写：FTP用户名（必须填写） 'ftp_pass' => '', // 填写：FTP密码（必须填写） 'ftp_dir' => '/', // FTP上传目录，默认/无需修改 ]; // 运行配置 ini_set('display_errors', 0); error_reporting(0); ini_set('max_execution_time', '600'); ini_set('memory_limit', '1G'); // 路径 $webRoot = __DIR__; $backupDir = $webRoot . '/_backup'; @mkdir($backupDir, 0755, true); $time = date('Ymd_His'); $zipFile = $backupDir . "/backup_$time.zip"; $sqlFile = $backupDir . "/db_$time.sql"; $includeDatabase = false; // --------------------------- // 数据库备份（可失败，不中断） // --------------------------- if (!empty($config['db_name']) && !empty($config['db_user'])) { $mysqli = @new mysqli($config['db_host'], $config['db_user'], $config['db_pass'], $config['db_name']); if ($mysqli->connect_error) { echo "数据库信息错误，跳过数据库备份，仅打包网站文件\n"; } else { $mysqli->set_charset('utf8mb4'); $tables = @$mysqli->query("SHOW TABLES"); if ($tables) { $sqlContent = "SET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS=0;\n\n"; while ($row = $tables->fetch_row()) { $table = $row[0]; $create = $mysqli->query("SHOW CREATE TABLE `$table`")->fetch_row()[1]; $sqlContent .= "DROP TABLE IF EXISTS `$table`;\n$create;\n\n"; $data = $mysqli->query("SELECT * FROM `$table`"); while ($item = $data->fetch_assoc()) { $values = array_map([$mysqli, 'real_escape_string'], $item); $sqlContent .= "INSERT INTO `$table` VALUES ('" . implode("','", $values) . "');\n"; } $sqlContent .= "\n\n"; } file_put_contents($sqlFile, $sqlContent); $includeDatabase = true; } } } else { echo "数据库信息为空，跳过数据库备份，仅打包网站文件\n"; } // --------------------------- // 打包网站文件 // --------------------------- $zip = new ZipArchive(); if ($zip->open($zipFile, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) { die("压缩包创建失败，目录无权限或空间不足"); } if ($includeDatabase && file_exists($sqlFile)) { $zip->addFile($sqlFile, basename($sqlFile)); } function addDirToZip($root, $dir, $zip) { $handle = opendir($dir); while (($file = readdir($handle)) !== false) { if ($file == '.' || $file == '..' || $file == basename(__FILE__) || strpos($dir, '_backup') !== false) continue; $path = $dir . '/' . $file; if (is_dir($path)) { addDirToZip($root, $path, $zip); } else { $zip->addFile($path, str_replace($root . '/', '', $path)); } } closedir($handle); } addDirToZip($webRoot, $webRoot, $zip); $zip->close(); // 删除临时SQL if (file_exists($sqlFile)) { unlink($sqlFile); } // --------------------------- // FTP 上传 // --------------------------- if (empty($config['ftp_host']) || empty($config['ftp_user'])) { delDir($backupDir); die("FTP信息未填写，无法上传"); } $ftpConn = @ftp_connect($config['ftp_host'], $config['ftp_port']); if (!$ftpConn) { delDir($backupDir); die("FTP连接失败，请检查FTP地址和端口"); } if (!@ftp_login($ftpConn, $config['ftp_user'], $config['ftp_pass'])) { ftp_close($ftpConn); delDir($backupDir); die("FTP登录失败，请检查用户名和密码"); } ftp_set_option($ftpConn, FTP_USEPASVADDRESS, false); ftp_pasv($ftpConn, true); if (!@ftp_chdir($ftpConn, $config['ftp_dir'])) { ftp_close($ftpConn); delDir($backupDir); die("FTP目录切换失败，目录不存在"); } if (!@ftp_put($ftpConn, basename($zipFile), $zipFile, FTP_BINARY)) { ftp_close($ftpConn); delDir($backupDir); die("文件上传失败，无写入权限或空间已满"); } ftp_close($ftpConn); // 删除临时目录 function delDir($dir) { if (!is_dir($dir)) return; foreach (scandir($dir) as $file) { if ($file == '.' || $file == '..') continue; $path = $dir . '/' . $file; is_dir($path) ? delDir($path) : unlink($path); } rmdir($dir); } delDir($backupDir); // 成功提示 echo "任务执行完成，文件已上传至目标主机\n"; if ($includeDatabase) { echo "已包含网站文件 + 数据库\n"; } else { echo "仅包含网站文件（数据库未备份）\n"; } ?>三、详细使用教程1. 工具准备复制上方代码，新建一个文本文档，粘贴代码后重命名为：backup.php注意：文件名必须是.php后缀，不能是.txt2. 上传工具将backup.php文件，上传到你需要备份的A虚拟主机的网站根目录（和网站首页文件放在一起）。3. 关键：配置信息填写（必看）打开代码，只修改配置区内容，其他代码完全不动，填写规则如下：（1）数据库配置（可选填/不填）用途：备份A主机的网站数据库不填效果：脚本自动跳过数据库备份，仅打包网站文件填写演示（正确格式）：'db_host' => 'localhost', // 固定不改 'db_name' => 'f105830w', // 你的数据库名 'db_user' => 'f105830w', // 你的数据库账号 'db_pass' => 'f93687w', // 你的数据库密码不填演示：'db_host' => 'localhost', 'db_name' => '', 'db_user' => '', 'db_pass' => '',（2）FTP配置（必须填，核心！）用途：将备份包上传到B虚拟主机必填项：ftp_host、ftp_user、ftp_pass填写禁忌：IP地址必须用英文单引号包裹，不能多写引号、不能不加引号❌ 错误写法：'ftp_host' => 154.219.115.32'', 'ftp_host' => 154.219.115.32,✅ 正确演示（你的信息）：'ftp_host' => '154.219.115.32', // B主机FTP IP，加单引号 'ftp_port' => 21, // 默认21不改 'ftp_user' => 'f540940w', // B主机FTP账号 'ftp_pass' => 'zxoG4K5pc34LqsoF',// B主机FTP密码 'ftp_dir' => '/', // 默认不改4. 执行备份配置完成后，保存文件并重新上传，打开浏览器访问：https://你的A主机域名/backup.php5. 执行结果说明数据库信息为空 → 提示：数据库信息为空，跳过数据库备份，仅打包网站文件数据库信息错误 → 提示：数据库信息错误，跳过数据库备份，仅打包网站文件FTP信息错误 → 对应提示连接/登录失败，纯中文易懂执行成功 → 提示：任务执行完成，文件已上传至目标主机四、常见问题说明工具安全吗？工具仅在本地执行备份、上传操作，不会传输数据到第三方服务器，用完可删除，无残留。备份文件在哪里？脚本自动打包后，通过FTP上传到B虚拟主机根目录，本地会自动清理临时文件，不占用空间。支持所有虚拟主机吗？支持梦奈宝塔、普通宝塔、所有PHP虚拟主机，只要支持Zip、FTP扩展即可（默认都支持）。可以重复使用吗？可以，每次修改网站内容后，访问链接即可重新备份同步，保持两台主机内容一致。五、核心总结这个工具完美实现你的需求：✅ 一键备份网站文件+可选数据库✅ 自动同步到另一台虚拟主机✅ 数据库不填/填错不中断运行✅ 纯中文提示，小白也能操作✅ 无报错、无冗余、干净稳定只要按照教程正确填写配置信息（重点：FTP IP加单引号），即可永久稳定使用！
这是一个仿微信在线群聊网页，单文件实现，支持自动匹配头像，理论上是匿名聊天的演示图片：说明图片：完整文件代码：<?php session_start(); header('Content-Type: text/html; charset=utf-8'); date_default_timezone_set('Asia/Shanghai'); const AVATAR_DIR = 'avatars/'; const UPLOAD_DIR = 'uploads/'; const CHAT_FILE = 'chat.json'; // 自动创建目录 is_dir(AVATAR_DIR) || mkdir(AVATAR_DIR, 0755, true); is_dir(UPLOAD_DIR) || mkdir(UPLOAD_DIR, 0755, true); // 初始化聊天文件 if (!file_exists(CHAT_FILE)) { file_put_contents(CHAT_FILE, json_encode([], JSON_UNESCAPED_UNICODE)); } // 生成用户信息 if (!isset($_SESSION['user'])) { $avatarList = glob(AVATAR_DIR . '*.{jpg,png,jpeg}', GLOB_BRACE) ?: []; $_SESSION['user'] = [ 'id' => uniqid(), 'avatar' => !empty($avatarList) ? $avatarList[array_rand($avatarList)] : 'https://picsum.photos/40' ]; } $user = $_SESSION['user']; // 获取消息接口 if (isset($_GET['get_msg'])) { echo file_get_contents(CHAT_FILE) ?: '[]'; exit; } // 发送消息&上传 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $msg = [ 'uid' => $user['id'], 'avatar' => $user['avatar'], 'time' => time(), 'time_str' => date('H:i'), 'content' => trim($_POST['content'] ?? ''), 'type' => 'text', 'url' => '', 'name' => '' ]; if (!empty($_FILES['file']['tmp_name']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) { $file = $_FILES['file']; $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); $filename = uniqid() . '.' . $ext; $savePath = UPLOAD_DIR . $filename; move_uploaded_file($file['tmp_name'], $savePath); $msg['url'] = $savePath; $msg['name'] = $file['name']; $msg['type'] = match(true) { in_array($ext, ['jpg','jpeg','png','gif','webp']) => 'image', in_array($ext, ['mp4','mov']) => 'video', default => 'file' }; } $chat = json_decode(file_get_contents(CHAT_FILE), true) ?? []; $chat[] = $msg; file_put_contents(CHAT_FILE, json_encode($chat, JSON_UNESCAPED_UNICODE)); exit; } ?> 全适配群聊 公共群聊 + 发送