gpt4 book ai didi

php - 是否有比 file_get_contents 占用更少内存或更有效的合并 MP3 的方法?

转载 作者:可可西里 更新时间:2023-10-31 23:17:39 25 4
gpt4 key购买 nike

我需要将几个 mp3 文件合并为一个。

我目前正在这样做:

$combinedFiles = "";
$dir = $_POST['dir'];

if ($handle = opendir($dir)) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
$combinedFiles .= file_get_contents(urldecode($dir."/".$entry));
}
}

closedir($handle);
}


file_put_contents("mp3/".$dir.".mp3", ($combinedFiles));

如果我这样做:

ini_set('memory_limit', -1);

它有效。我已尝试将此限制设置为 4MB,它不会引发内存错误,但不会创建文件。在不设置任何限制并保留默认值的情况下,我会遇到内存分配错误。我不想将它保留在 -1,因为我已经读到这是不好的做法,可能会导致问题。

谢谢(错误不是来自代码中的其他任何地方,我只是在运行它)。

编辑:即使设置为 8GB,这是我的计算机内存,它也不起作用。

最佳答案

这种方法怎么样?

<?php
$dir = $_POST['dir'];

if ($handle = opendir($dir))
{
$outFd = fopen(sprintf("mp3/%s.mp3", $dir), 'wb');

while (false !== ($entry = readdir($handle)))
{
if ($entry != "." && $entry != "..")
{
$path = urldecode(sprintf("%s/%s", $dir, $entry));

$inFd = fopen($path, 'rb');
stream_copy_to_stream($inFd, $outFd);
fclose($inFd);
}
}

fclose($outFd);

closedir($handle);
}

现在,我们有一些安全问题,没有正确验证输入,如果这是一个公共(public)工具,你应该修复它们。但现在我只讨论手头的问题。

我们为什么不先打开输出文件,然后将每个输入文件复制到输出文件的末尾,而不是一次将所有这些文件的数据存储在内存中?我们可以用 stream_copy_to_stream() 来做到这一点.

我们也可以通过 stream_set_chunk_size() 为操作使用较小的 block 大小,但听起来,对于您的应用程序,暂时将一个 MP3 存储在内存中(4-5Mb 顶部)是可以的。您也可以一次只手动读/写一个 block ,而不是使用 stream_copy_to_stream(),但总体思路是相同的。

这应该会导致一次实际存储在内存中的文件少于一个。

关于php - 是否有比 file_get_contents 占用更少内存或更有效的合并 MP3 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35531744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com