加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 与file_get_contents相比,是否有更少的内存扩展或更有效

发布时间:2020-12-13 16:59:41 所属栏目:PHP教程 来源:网络整理
导读:我需要将几个mp3文件合并为一个. 我目前正在这样做: $combinedFiles = "";$dir = $_POST['dir'];if ($handle = opendir($dir)) { while (false !== ($entry = readdir($handle))) { if ($entry != "." $entry != "..") { $combinedFiles .= file_get_conten
我需要将几个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);
}

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读