根本原因是环境变量和路径问题,需用绝对路径调用php及文件操作,并配置日志调试;sleep伪定时不靠谱,应使用cron或进程管理工具;windows需在任务计划程序中正确设置php路径、工作目录和运行权限。

Linux下用crontab跑PHP脚本,为什么死活不执行?
根本原因通常是环境变量和路径问题——cron 启动时用的是最小化 shell 环境,php 命令可能找不到,require 的相对路径也会失效。
- 必须写绝对路径:
/usr/bin/php /var/www/html/task.php,别用php task.php - 脚本开头加
#!/usr/bin/env php没用,cron不读 shebang - 所有文件操作(如
file_put_contents)要写绝对路径,否则默认在/root或/下写,权限还可能被拒 - 调试方法:在 crontab 里加日志重定向,比如
* * * * * /usr/bin/php /path/to/script.php >> /tmp/cron.log 2>&1
PHP里用sleep()模拟定时任务,靠谱吗?
不靠谱。这种“伪定时”只适合开发调试,线上一挂就停,且无法保证精度、无法并行、还会卡住整个进程。
-
sleep(300)5分钟一循环,但脚本超时(max_execution_time)、内存泄漏、意外中断都会让任务永久丢失 - Web服务器(如 Nginx + PHP-FPM)根本不会让你跑这么长时间,通常 30–60 秒就 kill 掉
- 想“常驻”,得配
systemd或supervisord管进程,但不如直接用cron简单可靠
PHP代码里调用shell_exec('php xxx.php')能替代cron吗?
不能。这是把调度逻辑混进业务代码,反而更难维护、更难监控、更容易引发递归或并发冲突。
无论做任何事情,都要有一定的方式方法与处理步骤。计算机程序设计比日常生活中的事务处理更具有严谨性、规范性、可行性。为了使计算机有效地解决某些问题,须将处理步骤编排好,用计算机语言组成“序列”,让计算机自动识别并执行这个用计算机语言组成的“序列”,完成预定的任务。将处理问题的步骤编排好,用计算机语言组成序列,也就是常说的编写程序。在Pascal语言中,执行每条语句都是由计算机完成相应的操作。编写Pascal程序,是利用Pasca
-
shell_exec启动的新进程不受当前脚本超时限制,但会绕过cron的日志、错误捕获、失败重试机制 - 如果被调用的脚本也调自己,容易触发雪崩;多个请求同时触发,可能并发写同一文件或数据库
- 权限更混乱:Web 用户(如
www-data)执行 shell 命令,常因无权访问某些目录或命令被拒绝
Windows上怎么让PHP定时运行?
用任务计划程序(Task Scheduler),但要注意 PHP 解释器路径和工作目录。
立即学习“PHP免费学习笔记(深入)”;
- 操作 → “创建基本任务”,触发器选“每天”或“重复任务”,操作选“启动程序”
- 程序/脚本填:
C:\php\php.exe(不是php.exe,必须绝对路径) - 添加参数填:
C:\project\task.php,起始于填:C:\project\(否则__DIR__和 include 会错) - 务必勾选“不管用户是否登录都要运行”,并设“不存储密码”或提供有效凭据,否则任务静默失败
真正麻烦的从来不是“怎么加一行 cron”,而是路径写错、权限没开、日志没留、错误被吞掉——这些地方一漏,任务就变成黑盒,出问题只能靠猜。










