我使用JSON作为数据存储,随着时间的推移,我预见到有几个方面可能希望在短时间内像聊天日志一样写入我的JSON文件。
<?php
$foo = json_decode(file_get_contents("foo.json"), true);
if (! is_array($foo["bar"])) { $foo["bar"] = array(); }
array_push($foo["bar"], array("time" => time(), "who" => $_SERVER['REMOTE_ADDR'], msg => $_GET['m']));
file_put_contents("foo.json", json_encode($foo, JSON_PRETTY_PRINT));
?>所以上面的代码可以工作,但是我担心如果文件在写出来之前被读取了,或者在某些情况下他们同时写出来,导致了一些数据丢失,会发生什么呢?
什么是更好或更安全的设计,最好使用平面文件存储(即不使用数据库)?
至于奖金,我真的不想回到我的客户,谁提出了这个要求,这是一些“锁定”。理想情况下,请求是等待直到安全返回。
发布于 2015-12-10 02:21:14
您可以为此使用flock()函数。它所做的是锁定除当前进程之外的所有进程的文件。
http://php.net/manual/en/function.flock.php
基本用法:
<?php
$fp = fopen('path/to/data.json', 'r+');
if (flock($fp, LOCK_EX)) // locks the file
{
// write to the file
flock($fp, LOCK_UN); // remove the lock
}
fclose($fp);默认情况下,flock()正在阻塞。这意味着进程正在等待,直到获得访问锁的权限。了解一下关于如何实现非阻塞版本的文档。
发布于 2015-12-10 02:35:24
不如为每一行创建一个单独的JSON,这样就不需要每次加载Json了。只需将JSON附加到文件中即可。每个约森都会排在一条线上。
加载它时,您将读取文本文件中的每一行,然后在PHP中将其转换为Json。
我之所以推荐这种方式,是因为我们希望找到更好的方法来使用//http://php.net/manual/en/function.file-put-contents.php file_put_contents("foo.json",json_encode($foo,JSON_PRETTY_PRINT) )进行文件读写。JSON只是一种文本格式。因此,我认为这是一个很好的解决办法。
写
<?php
$_SERVER['REMOTE_ADDR'], msg => $_GET['m']));
$foo = array("time" => time(), "who" => $_SERVER['REMOTE_ADDR'], msg => $_GET['m']);
//http://php.net/manual/en/function.file-put-contents.php
file_put_contents("foo.json", json_encode($foo, JSON_PRETTY_PRINT), FILE_APPEND | LOCK_EX));
?>正如您提到的,它是一个日志,所以您可能不需要加载来查看它的所有时间。所以我们将重点放在写作上。阅读过程似乎很长。读
<?php
$log_array = array();
$handle = @fopen("foo.json", "r");
if ($handle) {
while (($buffer = fgets($handle, 4096)) !== false) {
$foo = json_decode($buffer, true);
$log_array[] = $foo;
}
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
}
fclose($handle);
}
print_r($log_array);
?>https://stackoverflow.com/questions/34192262
复制相似问题