php - 如果文件位于子目录中,PHP 无法多次写入同一个文件
问题描述
我有三个函数,基本上做同样的事情(我知道我可以轻松地将它们转换为一个函数,但目前它们必须保持三个)。
功能与此类似:
function setFlag($user_id, $flag)
{
$file = $user_id . '_general_info.json';
$recoveredData = file_get_contents($file);
$recoveredArray = json_decode($recoveredData, true);
$recoveredArray['isActive'] = $flag;
$serializedData = json_encode($recoveredArray);
file_put_contents($file, $serializedData, LOCK_EX);
}
因此,他们打开 SAME 文件,获取/解码其内容 (JSON),添加/更新其中一个 JSON 密钥,再次保存文件。
函数之间的唯一区别是它们添加或更新的 JSON 键。
有时我必须一个接一个地调用函数:任何东西都可以正常工作。
但是,如果在函数的第一行中,我将文件路径更改为子目录,这样:
__DIR__ ."/". $user_id ."/". $user_id."_general_info.json"
由于某种原因,只有最新的密钥被添加或更新到文件中。因此,例如,如果我打电话:
A();
B();
C();
就像我只打电话一样C()
。如果我注释掉C()
,文件不会写入保存的密钥,而是A
写入保存的密钥B
。
我想(即使目前我不确定)这与代码多次打开同一个文件的事实有关。
但是为什么在当前目录中任何东西都可以正常工作而在子目录中却失败了?
任何帮助表示赞赏。
解决方案
在您的样本中;
- A() 函数打开并锁定文件
- B() 函数打开并锁定文件
- C() 函数打开并锁定文件
由 C() 函数锁定的文件,只能由 C() 函数解锁。当 C() 函数更新文件时,A() 和 B() 函数会引发警告。如果您的环境状态为生产,则看不到警告。您可以在此处查看以更改开发过程中的环境。
请查看您的 error_log 文件并在代码中添加一些条件,例如文件是否被锁定。
推荐阅读
- pandas - Pandas:关于使用 pandas 比较和(重新)计算字段的新手问题
- installation - 如何使用 Hyperledger Fabric 2.0 设置开发环境?
- batch-file - System.AsyncException:无法从批处理启动、批处理执行或未来方法调用 Database.executeBatch
- css - 如何在滚动时更改导航栏的样式?
- javascript - amp 交叉口观察器与标准交叉口观察器
- postman - 对 Postman 监视器请求的测试数据
- flutter - Flutter项目的Ios构建失败
- java - 创建类路径资源中定义的名称为“dataSource”的 bean 时出错
- angular - 角 - npm 安装
- javascript - React - 如何使嵌入式多步谷歌表单(iframe)仅在单击“下一步”或“提交”按钮时滚动到顶部