dede定时自动发布

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 DEDE建站 正文

使用服务器计划任务(最推荐、最稳定)

这是最专业、最可靠的方法,它不依赖于网站的访问,由服务器在指定时间主动执行一个脚本文件,无论你的网站有没有人访问,任务都会被触发。

dede定时自动发布
(图片来源网络,侵删)

核心原理: 创建一个 PHP 脚本,这个脚本的功能是查询数据库中标记为“待发布”的文章,并修改它们的状态为“已发布”,设置服务器在每天固定时间(比如凌晨1点)自动访问并执行这个脚本。

详细步骤:

第一步:创建执行脚本 auto_publish.php

在你的网站根目录(与 index.php 同级)下,创建一个新的 PHP 文件,例如命名为 auto_publish.php,并将以下代码粘贴进去。

<?php
/**
 * DedeCMS 定时自动发布脚本
 * 将此文件放置在网站根目录,然后通过服务器计划任务定时访问
 * http://www.yourdomain.com/auto_publish.php
 */
// 1. 引入 DedeCMS 的核心配置文件
// 如果你的网站在子目录,请相应调整路径,require_once('dede/config.php');
require_once('include/common.inc.php');
// 2. 设置时区(如果需要)
// date_default_timezone_set('PRC'); // PRC 代表中国时区,如果你的服务器时区已经是UTC+8,可以省略
// 3. 查询状态为 -1(待发布)且发布时间小于等于当前时间的文章
$arcrow = $dsql->GetOne("SELECT COUNT(*) AS dd FROM `#@__archives` WHERE senddate <= UNIX_TIMESTAMP() AND arcrank = -1");
if ($arcrow['dd'] > 0) {
    // 4. 执行更新操作,将这些文章的状态改为 1(正常)
    $dsql->ExecuteNoneQuery("UPDATE `#@__archives` SET arcrank = '1' WHERE senddate <= UNIX_TIMESTAMP() AND arcrank = -1");
    // 可选:记录日志,方便排查问题
    $logMessage = date('Y-m-d H:i:s') . " - 成功自动发布了 " . $arcrow['dd'] . " 篇文章,\n";
    file_put_contents(__DIR__ . '/auto_publish.log', $logMessage, FILE_APPEND);
    echo "执行成功:已发布 " . $arcrow['dd'] . " 篇待发布文章。";
} else {
    // 可选:记录日志
    $logMessage = date('Y-m-d H:i:s') . " - 没有找到需要发布的文章,\n";
    file_put_contents(__DIR__ . '/auto_publish.log', $logMessage, FILE_APPEND);
    echo "执行成功:当前没有待发布的文章。";
}
// 5. 关闭数据库连接
$dsql->Close();
?>

代码解释:

dede定时自动发布
(图片来源网络,侵删)
  • require_once('include/common.inc.php');:这是关键,它引入了 DedeCMS 的数据库连接和全局变量,让我们的脚本可以安全地操作数据库。
  • UNIX_TIMESTAMP():MySQL 函数,获取当前 Unix 时间戳。
  • senddate <= UNIX_TIMESTAMP()senddate 字段存储的是文章设定的发布时间(Unix 时间戳),这句 SQL 的意思是“查找所有发布时间小于等于当前时间的文章”。
  • arcrank = -1arcrank 是文章状态字段,-1 代表“待发布”。
  • UPDATE ... SET arcrank = '1':将查询到的文章状态从 -1(待发布)修改为 1(正常发布)。
  • 日志功能:强烈建议保留,这样你可以在 auto_publish.log 文件中查看脚本是否正常运行以及发布了多少文章。

第二步:上传脚本并测试

  1. auto_publish.php 文件通过 FTP 或其他方式上传到你的网站根目录。
  2. 在浏览器中访问这个文件,http://www.yourdomain.com/auto_publish.php
  3. 如果一切正常,你应该会看到类似“执行成功:当前没有待发布的文章。”或“执行成功:已发布 X 篇待发布文章。”的提示,你的网站根目录下会生成一个 auto_publish.log 文件。

第三步:设置服务器计划任务

这一步的操作因服务器环境而异,这里以最常见的 Linux + cPanel 和 Linux + 宝塔面板为例。


情况 A:使用 cPanel 控制面板

  1. 登录你的 cPanel。
  2. 在“高级”区域找到并点击 “Cron jobs” (计划任务)
  3. “Add New Cron Job” (添加新计划任务) 部分。
  4. “Common Settings” (常用设置):选择 0 1 * * *,这代表“每天凌晨1点执行一次”,你也可以自定义,格式为 分 时 日 月 星期
  5. “Command” (命令):在这里输入你的脚本 URL。
    /usr/bin/wget -O - -q http://www.yourdomain.com/auto_publish.php
    • /usr/bin/wget:使用 wget 命令来访问 URL,这是最常用的方式。
    • -O -:将输出重定向到标准输出(即不保存为文件)。
    • -q:静默模式,不显示任何输出。
  6. 点击 “Add New Cron Job” 保存。

情况 B:使用宝塔面板

  1. 登录你的宝塔面板。
  2. 点击左侧菜单的 “计划任务”
  3. 点击右上角的 “添加任务”
  4. 任务类型:选择 “访问URL”
  5. 执行周期:选择 “每天”,并设置具体时间,01:00
  6. URL地址:输入你的脚本 URL。
    http://www.yourdomain.com/auto_publish.php
  7. Header参数:留空。
  8. 启用任务:确保勾选。
  9. 点击 “确定” 保存。

情况 C:使用 SSH (Linux 命令行)

如果你有服务器的 SSH 权限,可以直接编辑 crontab。

  1. 连接到你的服务器 via SSH。
  2. 输入命令 crontab -e 来编辑计划任务列表。
  3. 在文件末尾添加以下一行(同样代表每天凌晨1点执行):
    0 1 * * * /usr/bin/wget -q -O /dev/null http://www.yourdomain.com/auto_publish.php
    • /dev/null:将所有输出丢弃,避免邮件发送。
  4. 保存并退出文件(在 Vim 中是 wq)。

完成! 你的服务器已经设置好了,每天到了设定的时间,它就会自动访问 auto_publish.php,脚本会自动将数据库中所有“到期”的文章状态修改为“已发布”。


利用 DedeCMS 的“发布文章”钩子(较复杂,不推荐)

DedeCMS 在发布文章时有钩子机制,理论上可以写一个插件,在文章被“保存”时判断其发布时间,如果未来再存入一个任务队列,但这非常复杂,需要修改核心文件,且 DedeCMS 没有内置的任务队列系统,实现起来难度大、不稳定,不推荐普通用户尝试


利用第三方插件或模块(存在风险)

网上可能存在一些第三方开发的“定时发布”模块或插件。使用这些方法需要非常谨慎!

  • 风险
    1. 安全性:第三方代码可能包含后门或恶意代码,威胁你的网站安全。
    2. 兼容性:可能与你的 DedeCMS 版本不兼容,导致网站出错。
    3. 稳定性:代码质量参差不齐,可能运行一段时间后就失效。
    4. 维护:插件作者可能不再更新,出现问题时无人支持。

如果你决定要使用,请务必选择信誉良好的来源,并仔细检查代码。


总结与最佳实践

方法 优点 缺点 推荐度
服务器计划任务 稳定、可靠、不依赖网站访问、性能最佳 需要服务器操作权限,对新手稍有门槛 ★★★★★ (强烈推荐)
DedeCMS 钩子 理论上集成度高 实现复杂,需修改核心,稳定性差 ★☆☆☆☆ (不推荐)
第三方插件 可能安装简单 安全风险高,兼容性差,不稳定 ★☆☆☆☆ (风险高,不推荐)

最佳实践建议:

  1. 首选方法一:它是最专业、最可靠的解决方案。
  2. 测试脚本:在设置计划任务前,务必手动访问 auto_publish.php 确保脚本能正常工作。
  3. 检查日志:定期查看 auto_publish.log 文件,确认任务是否按预期执行。
  4. 保持脚本安全auto_publish.php 文件可能被任何人访问,虽然它只是执行数据库更新,但为了安全,可以考虑在脚本中加入一个简单的校验,比如检查一个特定的 GET 参数。

修改 auto_publish.php 的访问 URL:

// 在脚本开头添加
if (empty($_GET['secret_key']) || $_GET['secret_key'] != 'your_secret_key_123') {
    die('Access Denied');
}

这样,只有访问 http://www.yourdomain.com/auto_publish.php?secret_key=your_secret_key_123 时才会执行,然后在计划任务的命令中使用这个带参数的 URL。

-- 展开阅读全文 --
头像
织梦调用缩略图路径
« 上一篇 04-21
C语言boxblur算法如何高效实现?
下一篇 » 04-21

相关文章

取消
微信二维码
支付宝二维码

目录[+]