You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:36:01