在macOS与MAMP环境下运行PHP Cron Job的问题求助
咱们先逐个拆解你写的crontab命令问题出在哪,再给你靠谱的解决办法:
先看你那些无效命令的问题点
第一个PHP命令:
*/1 * * * * php http://mylocalsite.com/cron/my_function
PHP CLI(命令行模式)只能直接执行本地文件路径,不能识别HTTP URL,所以这个从逻辑上就跑不通。第二个curl命令:
*/1 * * * * /usr/bin/curl –silent –compressed http://mylocalsite.com/cron/my_function
这里的–silent和–compressed用的是中文破折号,不是英文的--,cron对符号要求严格,系统根本识别不了中文符号,这是很容易踩的小坑!第三个curl命令:
*/1 * * * * /usr/bin/curl --silent --compressed http://mylocalsite.com/cron/my_function
参数是对的,但cron的环境变量和你终端的不一样——比如PATH路径、hosts解析权限,或者MAMP的Apache服务有没有在cron运行时正常启动?而且你没重定向错误输出,就算出错也只会发系统邮件,你可能没看到报错信息。第四个PHP命令:
*/1 * * * * /Applications/MAMP/bin/php/php7.1.12/bin/php http://mylocalsite.com/cron/my_function > /dev/null 2>&1
和第一个PHP命令犯了同样的错:不能用PHP CLI直接调用URL,得用本地文件路径。而且你把所有输出都扔去/dev/null,就算出错也看不到日志,完全没法排查问题。第五个wget命令:
*/1 * * * * wget --no-check-certificate -O- https://mylocalsite.com/cron/my_function >> /dev/null
这个命令和你终端能跑的版本几乎一样,但问题可能出在:cron的默认PATH只有/usr/bin:/bin,如果你的wget是用brew装的(路径在/usr/local/bin),cron根本找不到它;另外你只重定向了标准输出,错误输出没处理,报错信息会发系统邮件,你可能没留意。
正确的crontab写法(选一个适合你的)
方案1:修复wget命令(和你终端可用的版本对齐)
先在终端里跑which wget,拿到wget的完整路径(比如/usr/local/bin/wget),然后把crontab改成:
*/1 * * * * /usr/local/bin/wget --no-check-certificate -O- https://mylocalsite.com/cron/my_function > /dev/null 2>&1
- 用完整路径调用wget,确保cron能找到它;
> /dev/null 2>&1把标准输出和错误输出都重定向,避免收到冗余邮件;如果需要排查问题,可以把/dev/null改成日志文件路径,比如/Users/你的用户名/cron_wget_log.txt,方便看报错。
方案2:用curl的正确命令
同样先确认curl的完整路径(终端跑which curl,一般是/usr/bin/curl),然后写:
*/1 * * * * /usr/bin/curl --silent --compressed https://mylocalsite.com/cron/my_function >> /Users/你的用户名/cron_curl_log.txt 2>&1
- 确保参数是英文的
--,别再用中文破折号; - 把输出写到日志文件里,方便排查问题。
方案3:直接用PHP CLI执行本地文件(更稳定)
如果不想通过HTTP调用,直接执行本地脚本会更可靠。先找到你站点的本地路径,比如MAMP的htdocs目录下的cron/my_function.php,路径就是/Applications/MAMP/htdocs/cron/my_function.php,然后用MAMP的PHP版本执行:
*/1 * * * * /Applications/MAMP/bin/php/php7.1.12/bin/php /Applications/MAMP/htdocs/cron/my_function.php >> /Users/你的用户名/cron_php_log.txt 2>&1
- 这个方法不需要Apache服务运行,直接执行PHP脚本;
- 注意脚本里的相对路径(比如数据库配置文件路径)要改成绝对路径,避免找不到文件。
额外排查小技巧
- 查看cron日志:在终端跑
log show --predicate 'process == "cron"' --info,能看到近期cron的运行日志,找错误提示。 - 确认hosts解析:检查
/etc/hosts里有没有把mylocalsite.com指向127.0.0.1,cron会读取系统hosts,确保解析正确。 - 测试cron环境变量:写个简单的任务输出环境变量,比如
*/1 * * * * env > /Users/你的用户名/cron_env.txt,对比终端的环境变量,看看PATH等参数有没有差异。
内容的提问来源于stack exchange,提问作者Ryan Dorn

