PHP和AJAX下载几个MB文件冻结网站

时间:2015-10-27 15:05:04

标签: javascript php jquery ajax youtube

你好我到处寻找答案,但是我试过的解决方案都没有帮助

我正在构建的是一个连接到Youtube的网站,允许用户搜索和下载视频作为MP3文件。我用搜索等建立了网站但是我遇到了下载部分的问题(我已经找到了如何获取youtube音频文件)。音频的格式最初是audio / mp4所以我需要将其转换为mp3但是首先我需要在服务器上获取该文件

所以在下载页面上我发了一个脚本,它向服务器发送ajax请求以开始下载文件。然后,它每隔几秒钟向一个不同的页面发送一个请求,以找出进度并在用户正在查看的页面上更新它。

然而问题是视频正在下载整个网站冻结(所有页面都没有加载,直到文件完全下载),所以当脚本试图找出进度时它不能完全完成。

下载的文件:

<?php
session_start();
if (isset($_GET['yt_vid']) && isset($_GET['yrt'])) {
    set_time_limit(0); // to prevent the script from stopping execution
    include "assets/functions.php";
    define('CHUNK', (1024 * 8 * 1024));
    if ($_GET['yrt'] == "gphj") {
        $vid = $_GET['yt_vid'];
        $mdvid = md5($vid);
        if (!file_exists("assets/videos/" . $mdvid . ".mp4")) { // check if the file already exists, if not proceed to downloading it
            $url = urlScraper($vid); // urlScraper function is a function to get the audio file, it sends a simple curl request and takes less than a second to complete
            if (!isset($_SESSION[$mdvid])) {
                $_SESSION[$mdvid] = array(time(), 0, retrieve_remote_file_size($url));
            }
            $file = fopen($url, "rb");
            $localfile_name = "assets/videos/" . $mdvid . ".mp4"; // The file is stored on the server so it doesnt have to be downloaded every time
            $localfile = fopen($localfile_name, "w");
            $time = time();
            while (!feof($file)) {
                $_SESSION[$mdvid][1] = (int)$_SESSION[$mdvid][1] + 1;
                file_put_contents($localfile_name, fread($file, CHUNK), FILE_APPEND);
            }
            echo "Execution time: " . (time() - $time);
            fclose($file);
            fclose($localfile);
            $result = curl_result($url, "body");
        } else {
            echo "Failed.";
        }
    }
}
?>

1 个答案:

答案 0 :(得分:1)

我过去也遇到过这个问题,因为它不起作用的原因是因为会话只能一次打开才能写入。 您需要做的是修改下载脚本,并在每次写入会话后直接使用session_write_close()

像:

session_start();
if (!isset($_SESSION[$mdvid])) {
    $_SESSION[$mdvid] = array(time(), 0, retrieve_remote_file_size($url));
}
session_write_close();

也在while

while (!feof($file)) {
    session_start();
    $_SESSION[$mdvid][1] = (int)$_SESSION[$mdvid][1] + 1;
    session_write_close();
    file_put_contents($localfile_name, fread($file, CHUNK), FILE_APPEND);
}