Typecho文章定时发布,计划任务配置
很多人用 Typecho 写博客时会发现:后台只能立即发布或存为草稿,没有像 WordPress 那样的“定时发布”按钮。
这并不代表做不到,借助服务器自带的计划任务(Crontab),配合一个简单的 PHP 脚本,就能让文章到点自动上线。
本文按零基础可照做的顺序,讲清 588. Typecho文章定时发布,计划任务配置 的完整流程。
先判断你的服务器环境
动手前先确认两件事:服务器有没有命令行权限,以及 PHP 能不能被计划任务调用。
用 SSH 登录服务器,执行:
php -v
如果能看到 PHP 版本信息,说明命令行 PHP 可用。
如果提示 command not found,需要先找到 PHP 的实际路径,常见位置是 /www/server/php/74/bin/php 或 /usr/bin/php。
宝塔面板用户可以在“软件商店 → PHP → 设置 → 配置修改”附近找到 PHP 安装路径,也可以用:
which php
find / -name php -type f 2>/dev/null | head
确认 PHP 路径后,记下它,后面写计划任务会用到。
数据库连接信息在 Typecho 根目录的 config.inc.php 里,不需要额外找。
写一个发布用的 PHP 脚本
Typecho 自身没有开放“到点自动发布”的接口,但数据库里文章的发布状态和创建时间是可以被程序修改的。
思路上:把文章先存为草稿,记录一个未来时间,然后让计划任务定时检查,把时间已到且仍是草稿的文章改成已发布。
在网站根目录新建一个文件,例如 cron_publish.php,写入以下内容(请把数据库前缀改成你自己的,默认是 typecho_):
connect_error) {
die('连接失败: ' . $db->connect_error);
}
$now = time();
$prefix = 'typecho_';
$sql = "UPDATE {$prefix}contents SET status = 'publish' WHERE type = 'post' AND status = 'draft' AND created <= ?";
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $now);
$stmt->execute();
echo '已处理 ' . $stmt->affected_rows . " 篇草稿\n";
$stmt->close();
$db->close();
关键点:数据库用户名、密码、库名必须和 config.inc.php 中一致,否则脚本无法连接。
写完先手动跑一次验证:
php /www/wwwroot/你的域名/cron_publish.php
如果输出“已处理 0 篇草稿”,说明脚本本身能跑通,只是暂时没有到点的草稿。
配置计划任务让它自动执行
脚本能手动跑通后,就可以交给计划任务。
推荐每 5 分钟检查一次,既能及时发布,又不会给数据库造成压力。
命令行方式,执行 crontab -e,加入一行:
*/5 * * * * /usr/bin/php /www/wwwroot/你的域名/cron_publish.php >/dev/null 2>&1
保存退出即可。
如果用的是宝塔面板,路径更直观:面板 → 计划任务 → 添加任务,任务类型选“Shell脚本”,执行周期选“每5分钟”,脚本内容填:
/www/server/php/74/bin/php /www/wwwroot/你的域名/cron_publish.php
注意 PHP 路径要换成你服务器上真实存在的那个,宝塔不同版本 PHP 目录名可能不一样。
配置完成后,可以新建一篇草稿,手动把数据库里 created 字段设成一个已经过去的时间,等 5 分钟看它是否自动变成已发布,以此验证计划任务确实生效。
容易踩的坑和排查方向
脚本被公开访问导致数据被改。 cron_publish.php 放在网站根目录时,别人直接访问 URL 也能触发。
建议在 Nginx 里加一条规则禁止外部访问:
location = /cron_publish.php {
deny all;
}
或者把脚本移到网站根目录之外,计划任务里写绝对路径即可。
计划任务没执行。 先看系统日志:grep CRON /var/log/syslog 或 tail -f /var/log/cron。
如果日志里没有记录,多半是 Crontab 没保存成功;
如果有记录但没效果,通常是 PHP 路径写错或脚本里数据库信息不对。
草稿没有按时发布。 检查三点:文章的 created 时间是否真的小于当前时间、status 是否确实是 draft、type 是否为 post。
Typecho 的独立页面 type 是 page,不要混在一起处理。
执行频率别设太密。 每分钟跑一次对小型博客没有必要,反而增加数据库负担。
5 分钟或 10 分钟是更稳妥的选择。
还能不能做得更省心
如果不想自己维护脚本,也可以考虑安装支持定时发布的 Typecho 插件,但插件质量参差不齐,安装前建议先备份数据库。
无论用脚本还是插件,核心逻辑都一样:先存草稿并记录未来时间,再由计划任务把到点草稿改成已发布。
对于大多数个人博客,上面的 Crontab 方案已经够用,配置一次基本不用再管。
真正需要留意的是脚本安全、PHP 路径和数据库连接这三处,出问题时优先从这三处排查。
常见疑问
计划任务能不能用宝塔的“访问URL”类型代替 Shell 脚本?
可以,但前提是脚本允许被访问且你能接受这个访问入口。更安全的做法还是 Shell 脚本加 Nginx 禁止外部访问。
定时发布对已发布文章有影响吗?
没有。脚本只处理 status = 'draft' 的记录,已发布文章不会被改动。
改了数据库前缀怎么办?
把脚本里的 $prefix 改成实际前缀即可,其他逻辑不变。
能不能精确到某个具体时间点发布?
可以。把文章的 created 设为那个时间戳,计划任务每 5 分钟检查一次,误差通常在 5 分钟以内。
如果按本文步骤配置后仍不生效,先回看避坑部分的三处检查点,再对照服务器日志确认计划任务是否真的被触发。