2015-07-10 43 views
1

访问者登录我的一个网站刚刚失去了所有访客。它已经工作了一年半,但所有参赛作品都在一夜之间失去了。日志页面在这里(如果您访问其中一个网站页面,您的信息将被添加到日志中): http://mykindred.com/dalton/hoax/viewlog.php极限数组长度 - 失败?

日志保存在文本文件($ filename)中,该文本文件应该限制为$ maxloglines = $ logline包含要添加到日志中的新访问者。生成日志的代码:

$lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 
$logline .= implode("\n", array_slice($lines, 0, $maxloglines)); 
file_put_contents($filename, $logline); 

有关为什么我的日志会丢失其条目的任何建议?我有编码错误吗?

+0

您记录的内容可能是否有额外的换行符?文件是完全清空还是有300个空行? – davids3

+0

你有可能在写作时尝试阅读吗?您应该锁定文件以防止出现这种情况。查看关于'c'模式的注释: http://php.net/manual/en/function.fopen.php –

+0

@ davids3显示的代码删除空行,并且日志已满昨天(即有300个条目) 。 – tcloud

回答

0

当使用file_put_contents写入文件,你基本上是利用将文件打开与文件模式w一系列fopen()fwrite()fclose()

写入方式打开;将文件指针放在 文件的开头,并将文件截断为零。如果文件不存在, 会尝试创建它。

由于对文件没有排它锁,因此可以在文件已被截断并且文件指针位于开始位置的位置读取该文件。在这种情况下,您的file()命令的内容将为空。

相反,你应该使用选项LOCK_EX,以确保文件的独占锁,而写:

file_put_contents($filename, $logline, LOCK_EX); 

您可以在flock()文档中阅读更多关于这一点。