Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中强制下载和计数下载_Php - Fatal编程技术网

如何在PHP中强制下载和计数下载

如何在PHP中强制下载和计数下载,php,Php,我的服务器上有一个.zip、.msi等文件,我们会尽可能多地保护它。我知道会话和推荐人都可能被欺骗。我们要求您从我们的下载页面开始会话,或从一个特定的合作伙伴。所有这些我都能用。我想插入谷歌分析,但我读到插入js/html会破坏下载。我只想创建一个txt文件,并捕获每次下载的日期,创建一个总下载的运行计数。以下是我强制下载的代码-这是一个直接调用的文件,不会让用户离开合作伙伴网站: <?php session_start(); $ref = $_SERVER['HTTP_R

我的服务器上有一个.zip、.msi等文件,我们会尽可能多地保护它。我知道会话和推荐人都可能被欺骗。我们要求您从我们的下载页面开始会话,或从一个特定的合作伙伴。所有这些我都能用。我想插入谷歌分析,但我读到插入js/html会破坏下载。我只想创建一个txt文件,并捕获每次下载的日期,创建一个总下载的运行计数。以下是我强制下载的代码-这是一个直接调用的文件,不会让用户离开合作伙伴网站:

<?php
    session_start();
    $ref = $_SERVER['HTTP_REFERER'];
    $refData = parse_url($ref);
    if(time() - $_SESSION['time'] < 2000 || ($refData['host'] == 'partnersite.com'))  {
        $path = '/var/www/vhosts/example.org/dir/dir/dir/App.Install.de-de.msi';
        $mm_type="Content-type: application/x-ole-storage";
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-Type: " . $mm_type);
        header("Content-Length: " .(string)(filesize($path)) );
        header('Content-Disposition: attachment; filename="'.basename($path).'"');
        header("Content-Transfer-Encoding: binary\n");
        readfile($path);

        //try and write to file and count downloads
        $current_count = file_get_contents('count');
        $f = fopen('count', 'w+');
        fwrite($f, $current_count + 1);
        fclose($f);

        exit();
    } else { ?>
        <?php header("Location: https://example.org/404.php");
        die(); ?>
    <?php }
?>
再次强调,这与我希望它在强制和“软”保护下载不受热链接影响时的工作方式完全相同。在那里的某个地方,我需要创建count.php,在不写的情况下写入它,然后关闭它

一旦调用readfile,您就放弃了控制权

在调用它之前先做日志记录,它就会工作


您可以保留计数器或写入日志文件。因为您已经知道如何写入文件,所以详细信息由您决定

您不必跟踪count,因为您可以简单地计算文件的行数,以查看有多少下载

以问题作者的名义发布


写日志很简单,可以通过答案中提供的链接完成。我最终需要一个更强大的解决方案,一个与我们现有的谷歌分析设置一起工作的解决方案。所以我用谷歌的和他们的来测试。这是一封来自SO的信。

在你调用“readfile”之前,是什么阻止了你计数?我不明白这里有什么问题。请注意,您可以在服务器端从PHP将点击推送到Google Analytics。请参阅.file\u put\u contents'somefile.txt'、$count、lock\u constant\u look.up.real.syntax.for.this@阿列克肖万斯基——这看起来很有希望。我在Hit Builder工具中构建了一个字符串,但不确定如何实现。有什么例子吗?你是在问在哪里以及如何写入日志文件吗?谢谢。我会弄清楚如何创建文件并更新下载总数。正如您和@Yivi所指出的,我需要在下载和读取文件之前完成这项工作。
if(time() - $_SESSION['time'] < 2000 || ($refData['host'] == 'partnersite.com'))  { 
    // Sudo code - see real example here - https://stackoverflow.com/a/19898993/296555
    // Write to log file before initiating the download.
    $log = current date time
    file_put_contents('./log_file.log', $log, FILE_APPEND);

    // Now, do the download part
    ...