对于CodeIgniter应用程序中的一小段代码,我有一个非常奇怪的问题。基本上,有一个页面链接到各种PDF文件。当用户点击链接时,PHP会解析请求,通知观察者,在数据库中写入click事件(活动日志),然后使用readfile()
输出文件。
到目前为止,这么好。测试它,它就像一个魅力。输出PDF以供下载,并将事件写入数据库中。
问题出现在用户点击此类链接,然后取消下载并在不迟于9-10秒内点击其他链接时。发生这种情况时,事件将在数据库中注册两次。
我对记录事件的观察者进行了三次检查,但看起来没问题。此外,视频链接也有类似功能,只有重定向到另一个页面而不是直接输出文件,而且工作正常。
经过几个小时的挠头之后,我发现readfile()
函数存在问题,因为如果我在下载之前放了一个var_dump();die();
或任何输出一些文本的内容并强制它以文字形式出现,下载事件仅记录 。
以下是相关代码:
public function downloadPDF($id = NULL)
{
if (($id == NULL) OR (!$this->validateId($id))) {
// redirect with error
}
$item = // code for fetching the PDF properties from the DB
$this->notify('ActivityObserver'); // writes the download event in the DB
$file = '.' . urldecode($item['link']);
$size = filesize($file);
$name = urldecode(basename($file));
header('Content-Description: File Transfer');
header('Content-Type: application/pdf');
header("Content-Disposition: attachment; filename=\"$name\"");
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit();
}
尝试用不同的浏览器测试它,行为是一样的。所有检查工具仅显示1个点击请求。
在这张丑陋的画面中,我错过了什么?为什么它有时会写两次而不是一次?
感谢您抽出时间阅读这一文字墙。