0

我正在尝试使用此代码将令牌保存到 php 文件中,但是在 2kb 之后,文件神秘地清空并且我丢失了所有数据。为什么会这样?我该如何预防?

   $fh = fopen('token.txt', 'a+');
    fwrite($fh, $access_token . "\n");
    fclose($fh);
4

2 回答 2

2

根据其他地方的评论,使用文件存储来自多个并发进程的数据是失败的秘诀。您可以通过确保在尝试读取或写入文件之前在文件上获得有效的 flock() 来最大程度地减少损坏(有引入死锁和竞争条件的风险)。

$fh = fopen('token.txt', 'a');
if (flock($fh, LOCK_EX)) {
    fwrite($fh, $access_token . "\n");
    fflush($fh);
    flock($fh, LOCK_UN);
} else {
    trigger_error("failed to lock file");
}
fclose($fh);

如果您只是在记录,请使用 syslog 工具。如果您正在执行全套 CRUD 操作,请使用 DBMS。

于 2012-10-10T22:36:41.947 回答
1

一些想法:

  1. 您的 PHP 页面的多次调用相互重叠。如果两个进程/线程同时打开同一个文件进行追加,如果结果是一个空文件,我不会感到惊讶。
  2. 将打开模式从 更改a+a。从您的代码看来,您只需要编写,而不是读/写。
  3. 检查您的文件系统可用空间 ( df -h) 和您的用户的磁盘配额 ( quota -h)。你空间不够了?
于 2012-10-10T22:18:40.333 回答