首页 > 解决方案 > 如果文件位于子目录中,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

我想(即使目前我不确定)这与代码多次打开同一个文件的事实有关。

但是为什么在当前目录中任何东西都可以正常工作而在子目录中却失败了?

任何帮助表示赞赏。

标签: php

解决方案


在您的样本中;

  1. A() 函数打开并锁定文件
  2. B() 函数打开并锁定文件
  3. C() 函数打开并锁定文件

由 C() 函数锁定的文件,只能由 C() 函数解锁。当 C() 函数更新文件时,A() 和 B() 函数会引发警告。如果您的环境状态为生产,则看不到警告。您可以在此处查看以更改开发过程中的环境。

请查看您的 error_log 文件并在代码中添加一些条件,例如文件是否被锁定。


推荐阅读