Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.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
Javascript PHP和AJAX下载几MB文件冻结网站_Javascript_Php_Jquery_Ajax_Youtube - Fatal编程技术网

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

Javascript PHP和AJAX下载几MB文件冻结网站,javascript,php,jquery,ajax,youtube,Javascript,Php,Jquery,Ajax,Youtube,你好,我到处寻找答案,但是我尝试的解决方案都没有帮助 我正在建立一个连接到Youtube的网站,允许用户搜索和下载MP3文件格式的视频。我已经建立了搜索等网站,但我有一个下载部分的问题(我已经解决了如何获得youtube音频文件)。音频格式最初是audio/mp4,因此我需要将其转换为mp3,但首先我需要在服务器上获取文件 因此,在下载页面上,我编写了一个脚本,向服务器发送一个ajax请求,开始下载文件。然后,它每隔几秒钟向不同的页面发送一个请求,以了解进度并在用户正在查看的页面上进行更新 然而

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

我正在建立一个连接到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.";
        }
    }
}
?>

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

比如:

同时

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);
}

由于您正在使用会话,因此您不能随意转到另一个使用会话的页面。您需要实现
session\u write\u close()如果您希望导航离开已启动的页面和使用会话的AJAX调用。它没有冻结,它的行为正是它设计的行为。session\u write\u close在ajax调用的文件中运行多长时间之前,您使用的是PHPs标准会话处理程序吗?你可能正在经历会话锁定是的,我在互联网上找到了,当然8 |我自学PHP才两年左右,所以我不是这方面的专家。我什么都学不到你为什么这么说?在你发表其他评论之前,我就开始写这个答案了,你也这么说吗?一个猴子宙斯你对其他人没有任何尊重感谢所有帮助过我的人:P我想这会是一件很愚蠢的事:红脸:没问题,通常是一些小而烦人的事情让你头疼:)@MonkeyZeus要么解释这个解决方案到底出了什么问题,要么保持你自己的坏态度。“你根本不知道你在做什么”是完全没有建设性和毫无帮助的。
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);
}