PHP - 如何有效地传递本地文件

时间:2018-05-23 11:47:45

标签: php openssl php-openssl

我开发了一个通过安全URL传递文件的脚本,目标是模仿Amazon S3的私有文件托管。用户将向服务器发送请求,该请求生成可用于访问文件的URL。生成的URL在生成后2小时后过期。

这是脚本的解密部分:

$data = decrypt($_GET['data']);
    $data_json = json_decode($data,true);

    // print_r($data_json); die;
    $elapsed = strtotime('now') - $data_json['expire'];
    if ($elapsed > URLEXPIRE) {
        echo json_encode(array(
            'status'=>false,
            'error'=>'URL expired.',
            'debug'=>$data,
            'debug2'=>$_GET['data']
        ));
        die;
    }

    $object = OBJECTSTORE . $data_json['path'];
    header('X-Elapsed: ' . $elapsed);
    // header('Content-Type: '.get_mime_type($object));
    header('Content-Type: application/octet-stream');
    // header('Content-Disposition: attachment; filename=' . basename($object));
    if (strpos($data_json['path'],'?download'))
        header('Content-Disposition: attachment;');

    // echo file_get_contents($object);
    readfile($object);
    die;

在我的登台服务器上测试期间,脚本运行正常。但是,在提供大型视频文件时在生产中发布时似乎很慢。将URL加载为HTML视频标记的源需要一段时间。我不知道这是否有帮助,但decrypt函数使用AES-256-CBC密码使用openssl_decrypt

是否有更有效的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

在readfile()之前验证输出缓冲区是否已关闭:添加ob_end_clean()。 此外,readfile对于大文件可能效率不高。见Readfile() and large files