php – 与file_get_contents相比,是否有更少的内存扩展或更有效
我需要将几个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); } 现在,我们有一些安全问题,没有正确验证输入,如果这是一个公共工具,你应该修复它们.但是现在我只是讨论手头的问题. 为什么我们不首先打开输出文件,然后将每个输入文件复制到输出文件的末尾,而不是将所有这些文件中的数据一次存储在内存中?我们可以用 我们可以通过 这应该导致一次实际存储在内存中的文件少于一个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |