readfile()和数据库插入问题

时间:2014-02-05 08:25:43

标签: php

对于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个点击请求。

在这张丑陋的画面中,我错过了什么?为什么它有时会写两次而不是一次?

感谢您抽出时间阅读这一文字墙。

0 个答案:

没有答案