Crontab执行PHP脚本时file_put_contents无法写入文件问题
解决建议
指定文件保存的绝对路径
crontab默认工作目录是执行用户的家目录(比如/home/username),脚本里用相对路径会把文件写到家目录而非脚本所在目录。修改脚本,先获取脚本所在的绝对路径再拼接文件名:$url = 'https://www.example.cz/example.xml'; $file_name = basename($url); // 获取脚本所在目录的绝对路径 $script_dir = dirname(__FILE__); $save_path = $script_dir . '/' . $file_name; if (file_put_contents($save_path, file_get_contents($url))) { echo "File downloaded successfully"; } else { echo "File downloading failed."; }在crontab中使用PHP的绝对路径
crontab的PATH环境变量和终端不同,直接写php script.php可能找不到正确的PHP版本。先在终端执行which php得到绝对路径(比如/usr/bin/php),再写进crontab:*/5 * * * * /usr/bin/php /path/to/your/script.php排查HTTPS证书/网络问题
crontab环境缺少部分变量可能导致HTTPS请求失败(比如证书验证不通过)。可以给file_get_contents添加上下文选项临时禁用证书验证(仅测试用,生产环境建议配置正确证书):$url = 'https://www.example.cz/example.xml'; $file_name = basename($url); $script_dir = dirname(__FILE__); $save_path = $script_dir . '/' . $file_name; // 设置上下文禁用HTTPS证书验证 $context = stream_context_create([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, ] ]); $content = file_get_contents($url, false, $context); if ($content && file_put_contents($save_path, $content)) { echo "File downloaded successfully"; } else { echo "File downloading failed."; }记录crontab执行日志
在crontab命令后添加日志重定向,方便查看错误详情:*/5 * * * * /usr/bin/php /path/to/your/script.php >> /var/log/xml_download.log 2>&1之后查看
/var/log/xml_download.log,就能明确是获取URL失败还是保存文件失败,定位具体问题。
内容的提问来源于stack exchange,提问作者vavex
相关产品推荐
相关产品推荐

