我正在尝试使用此代码将令牌保存到php文件中,但是在2kb之后,文件神秘地清空了,我丢失了所有数据。为什么会这样?我该如何预防?
$fh = fopen('token.txt', 'a+');
fwrite($fh, $access_token . "n");
fclose($fh);
根据其他地方的评论,使用文件存储来自多个并发进程的数据是失败的秘诀。您可以通过确保在尝试读取或写入文件之前在文件上获得有效的 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);
如果您只是记录,请使用系统日志工具。如果要执行完整的 CRUD 操作集,请使用 DBMS。
一些想法:
- 对 PHP 页面的多次调用相互影响。 如果两个进程/线程同时打开同一个文件进行追加,如果结果是空文件,我不会感到惊讶。
- 将打开模式从
a+
更改为a
。 从您的代码来看,您似乎只需要编写,而不需要读/写。 - 检查文件系统可用空间 (
df -h
) 和用户的磁盘配额 (quota -h
)。 你空间不足吗?