为何通过包装脚本调用时file_put_contents无法真正更新文件?
解决包装脚本调用文件写入脚本的问题
看起来你遇到的核心问题是:通过file_writer_wrapper.php用curl调用file_writer.php时,output.js没有被修改,但直接运行file_writer.php却能正常生效。下面我来分析原因并给出针对性的解决方案:
问题根源
当你用curl_get_contents请求远程地址时,file_writer.php是在目标服务器的环境下执行的,所以它修改的是该服务器上的output.js文件,而非你运行file_writer_wrapper.php所在环境的文件。如果两个脚本在同一服务器,也可能是路径或权限问题导致写入失败。另外你提供的wrapper代码里还存在curl_g...的拼写错误,这也会直接导致curl请求失效。
解决方案
方案1:同一服务器下直接执行脚本(推荐)
如果两个脚本部署在同一服务器上,完全不需要用curl,直接通过PHP的include或require来执行file_writer.php的逻辑,这样会在本地环境修改output.js:
修改file_writer_wrapper.php为:
<?php // 直接包含目标脚本,共享当前环境的文件系统 require 'file_writer.php'; ?>
这样执行wrapper脚本时,就会像直接运行file_writer.php一样,修改本地的output.js文件。
方案2:跨服务器场景下的调整
如果file_writer.php必须部署在远程服务器,你需要做好两点调整:
- 确保远程服务器的Web进程(比如Apache、Nginx的运行用户)拥有写入
output.js所在目录的权限 - 在
file_writer.php中使用绝对路径指定$file_name,避免因脚本执行的工作目录不同导致找不到文件,同时添加错误排查逻辑:
<?php // 使用绝对路径确保文件位置正确 $file_name = $_SERVER['DOCUMENT_ROOT'] . '/output.js'; $bytes_writen = file_put_contents($file_name, 'test'); // 添加错误检查,方便排查问题 if ($bytes_writen === false) { echo "写入失败!请检查$file_name所在目录的权限。"; exit; } $filemtime = date('d/m/Y H:i:s', filemtime($file_name)); echo "$file_name updated at $filemtime. $bytes_writen bytes has been written."; ?>
方案3:修正wrapper的curl拼写错误
如果坚持要用curl调用,先把wrapper里的函数拼写错误修正:
<?php $response = curl_get_contents('https://example.com/file_writer.php'); die($response); ?>
内容的提问来源于stack exchange,提问作者Ilan Roberman
相关产品推荐
相关产品推荐

