2

我目前正在尝试使用file_put_contents更新我的 JSON 文件。这是我的 PHP 目前的样子:

$result = file_put_contents('Resources/logs/file.json', $newJsonString);
if($result === true) {
    echo "true";
} else {
    echo "false";
}

但是,它总是返回false。尽管如此,我已将目录权限设置为 777Resourceslogs. 我还将文件权限设置为 777 file.json

该路径也是正确的,file_get_contents与来自同一文件的相同路径一起使用。

为了进一步证明我的观点,我还跑来sudo chown -R www-data:www-data /var/www/html/core/Resources/授予用户Resources写入目录(以及其中的所有内容)的权限www-data(我假设这将允许通过在线运行 PHP 脚本来写入 JSON 文件) .

我不知道这是否有帮助,但我也在运行这个 PHP 脚本,POST方法是通过 JavaScript 从不同的服务器/网站向它发送数据。

为什么在世界上file_put_contents 仍然返回 false 并且不写入文件?它总是在运行后使 JSON 文件为空。

补充代码:

这是整个代码块,包括以下file_put_contents部分:

$jsonString = file_get_contents('Resources/logs/file.json');
$data = json_decode($jsonString);
$data->coins = $data->coins + $coins;
$data->uses = $data->uses + 1;
print_r($data);
$newJsonString = json_encode($data);
$result = file_put_contents('Resources/logs/file.json', $newJsonString);
if($result === true) {
    echo "true";
} else {
    echo "false";
}

...这是 JSON 文件:

{"coins":"0","uses":"0"}

任何帮助将不胜感激,我已经尝试解决这个问题一整天了。

编辑1:

我忘了提及这一点,但这段代码昨天运行得非常好,大约一个小时。然后突然间它停止工作并开始将 JSON 文件设为空白。

编辑2:

我刚刚清除了 Apache 错误日志,并且脚本再次运行(这很好)。然而,file_put_contents还在回归false。到底是怎么回事...

编辑3:

感谢 Laurent Wartel,我更新了我的 if 语句file_put_contents,它似乎不再返回 false。

if($result === false) {
    echo "Error";
} else {
    echo "All good, $result bytes written";
}
4

3 回答 3

1

尝试将字符串写入您的文件。通过这种方式,您可以确定您的问题是出在文件写入还是内容生成上:

file_put_contents('Resources/logs/file.json', 'Hello, file');

另外,我会在文件写入调用中添加一个 LOCK_EX 标志,以确保您没有遇到并发问题。

于 2014-07-22T10:24:50.947 回答
0

http://php.net/manual/en/function.file-put-contents.php

This function returns the number of bytes that were written to the file, or FALSE on failure.

You can't user the identical comparison operator to check for success. Both of this alternatives are valid:

if($result) {
    echo "true";
} else {
    echo "false";
}

or

if($result === false) {
    echo "false";
} else {
    echo "true";
}
于 2014-07-22T10:20:21.680 回答
0

来自文档PHP:file_put_contents - Manual

此函数返回写入文件的字节数,失败时返回 FALSE。警告

此函数可能返回布尔值 FALSE,但也可能返回计算结果为 FALSE 的非布尔值。请阅读有关布尔值的部分以获取更多信息。使用 === 运算符测试此函数的返回值。

修改你的代码...

if($result === false) {
    echo "Error";
} else {
    echo "All good, $result bytes written";
}
于 2014-07-22T10:09:47.340 回答