PHP网站定时任务必须用Linux cron调用独立PHP脚本,不能用sleep()或循环;脚本需脱离Web环境、手动引入自动加载、使用绝对路径和独立配置。

PHP 网站不能靠 sleep() 或循环模拟定时任务
PHP 是请求响应式脚本,每次 HTTP 请求结束后进程就销毁,sleep(3600) 这类写法在 Web 环境下根本不会持续运行,反而会卡住整个请求、拖垮服务器。真实定时任务必须脱离 Web 请求生命周期。
Linux 下用 cron 调用 PHP 脚本才是标准做法
把要定时执行的逻辑写成独立 PHP 脚本(如 /var/www/myapp/cron/backup.php),再通过系统级 cron 定期触发:
# 每天凌晨 2 点执行备份 0 2 * * * /usr/bin/php /var/www/myapp/cron/backup.php > /dev/null 2>&1
- 务必使用绝对路径调用
php(用which php查)和脚本文件 - 脚本开头加
#!/usr/bin/env php并chmod +x也可,但显式调用更可控 -
> /dev/null 2>&1防止邮件堆积;若需日志,改成> /var/log/mycron.log 2>&1 - Web 用户(如
www-data)通常无权写cron,应由 root 或有权限用户添加
PHP 脚本本身要避免依赖 Web 环境
直接在浏览器里能跑的代码,放到 cron 里大概率报错——因为没 $_SERVER、没 session、没自动加载器路径。关键点:
- 手动引入自动加载:在脚本开头加
require '/var/www/myapp/vendor/autoload.php'; - 数据库连接别用
$_ENV或 Web 配置文件,改用独立配置(如config/cron.php) - 路径用
__DIR__或dirname(__FILE__) . '/..',别用相对路径或$_SERVER['DOCUMENT_ROOT'] - 如果用了 Laravel/Lumen,优先走
php artisan schedule:run+cron,而不是直接调 PHP 文件
Web 后台“伪定时”只适合低频轻量操作
有些场景(比如每 15 分钟检查一次订单状态)不想配 cron,可用“请求触发 + 时间戳判断”方式,但限制极多:
一、源码描述这是一款比较简单的企业管理系统源码,界面美观大方,功能简单,特别适合初学者学习研究,系统运行十分流畅,可以作为二次开发,同时也是可以帮助初学者增长知识的优秀代码。二、功能介绍主要功能:企业动态,产品介绍 ,免费下载,定制服务,该源码比较适合新手学习和二次开发使用。三、源码特点1、网站布局:采用目前最先进的布局方式DIV+CSS,符合W3C的标准和Web2.0的风格。2、程序设计模块化,
立即学习“PHP免费学习笔记(深入)”;
- 必须有持续流量,否则任务永远不会执行
- 只能用单机文件锁或数据库锁防重复,例如写入
last_run_at字段并WHERE last_run_at - 不能做耗时操作(超过 30 秒易超时),且无法保证精确时间点
- 适合:
cache cleanup、send pending notifications;不适合:generate monthly report、sync with third-party API
真正需要稳定、准时、可监控的定时任务,cron 是绕不开的基础设施。PHP 只是执行者,不是调度器。










