你好我到处寻找答案,但是我试过的解决方案都没有帮助
我正在构建的是一个连接到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.";
}
}
}
?>
答案 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);
}