首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安全PHP日志记录

安全PHP日志记录
EN

Stack Overflow用户
提问于 2015-12-10 01:38:33
回答 2查看 736关注 0票数 0

我使用JSON作为数据存储,随着时间的推移,我预见到有几个方面可能希望在短时间内像聊天日志一样写入我的JSON文件。

代码语言:javascript
复制
<?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));
?>

所以上面的代码可以工作,但是我担心如果文件在写出来之前被读取了,或者在某些情况下他们同时写出来,导致了一些数据丢失,会发生什么呢?

什么是更好或更安全的设计,最好使用平面文件存储(即不使用数据库)?

至于奖金,我真的不想回到我的客户,谁提出了这个要求,这是一些“锁定”。理想情况下,请求是等待直到安全返回。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-10 02:21:14

您可以为此使用flock()函数。它所做的是锁定除当前进程之外的所有进程的文件。

http://php.net/manual/en/function.flock.php

基本用法:

代码语言:javascript
复制
<?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()正在阻塞。这意味着进程正在等待,直到获得访问锁的权限。了解一下关于如何实现非阻塞版本的文档。

票数 1
EN

Stack Overflow用户

发布于 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只是一种文本格式。因此,我认为这是一个很好的解决办法。

代码语言:javascript
复制
<?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));
?>

正如您提到的,它是一个日志,所以您可能不需要加载来查看它的所有时间。所以我们将重点放在写作上。阅读过程似乎很长。读

代码语言:javascript
复制
<?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);

?>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34192262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档