php – 与file_get_contents相比,是否有更少的内存扩展或更有效的合并MP3方式?

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 与file_get_contents相比,是否有更少的内存扩展或更有效的合并MP3方式?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要将几个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 != "." &amp;& $entry != "..")
        {
            $path = urldecode(sprintf("%s/%s",$dir,$entry));

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

    fclose($outFd);

    closedir($handle);
}

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

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

我们可以通过stream_set_chunk_size()使用较小的块大小进行操作,但对于您的应用来说,听起来可以暂时将一个MP3存储在内存中(4-5Mb顶部).您也可以手动一次读取/写入一个块而不是使用stream_copy_to_stream(),但总体思路是一样的.

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

脚本宝典总结

以上是脚本宝典为你收集整理的php – 与file_get_contents相比,是否有更少的内存扩展或更有效的合并MP3方式?全部内容,希望文章能够帮你解决php – 与file_get_contents相比,是否有更少的内存扩展或更有效的合并MP3方式?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。