Javascript PHP和AJAX下载几MB文件冻结网站
你好,我到处寻找答案,但是我尝试的解决方案都没有帮助 我正在建立一个连接到Youtube的网站,允许用户搜索和下载MP3文件格式的视频。我已经建立了搜索等网站,但我有一个下载部分的问题(我已经解决了如何获得youtube音频文件)。音频格式最初是audio/mp4,因此我需要将其转换为mp3,但首先我需要在服务器上获取文件 因此,在下载页面上,我编写了一个脚本,向服务器发送一个ajax请求,开始下载文件。然后,它每隔几秒钟向不同的页面发送一个请求,以了解进度并在用户正在查看的页面上进行更新 然而,问题是,当视频下载时,整个网站都会冻结(在文件完全下载之前,所有页面都不会加载),因此,当脚本试图找出进度时,它无法在完全下载之前找到进度 下载的文件:Javascript PHP和AJAX下载几MB文件冻结网站,javascript,php,jquery,ajax,youtube,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.";
}
}
}
?>
我过去也遇到过这个问题,它不起作用的原因是会话只能打开一次以供编写。 您需要做的是修改下载脚本,并在每次写入会话后直接使用
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);
}