PHP:在长字符串中插入短字符串而不分配太多内存?

PHP:在长字符串中插入短字符串而不分配太多内存?,php,memory,memory-management,Php,Memory,Memory Management,考虑以下代码: $position = ... $data = substr($data, 0, $position) . $insertion . substr($data, $position); 在讨论脚本的情况下,$data通常不大于2-3 MB。但碰巧有一个想使用该脚本的用户试图将其用于大小约为17MB的$data,结果却失败了 PHP致命错误:第179行的//index.PHP中允许的内存大小为33554432字节(尝试分配17687776字节) 其中第179行是上面显示的第二行(

考虑以下代码:

$position = ...
$data = substr($data, 0, $position) . $insertion . substr($data, $position);
在讨论脚本的情况下,
$data
通常不大于2-3 MB。但碰巧有一个想使用该脚本的用户试图将其用于大小约为17MB的
$data
,结果却失败了

PHP致命错误:第179行的//index.PHP中允许的内存大小为33554432字节(尝试分配17687776字节)

其中第179行是上面显示的第二行(
$data=…
),33554432字节=32 MB,17687776>16 MB。现在我假设问题是内存分配给
$data
substr($data,0,$position)
substr($data,$position)
。我知道,并建议他们尝试增加。但是,我想知道我是否可以优化它,这样我们就不需要内存限制超过
$data
的两倍


所以我的问题是:是否有一些聪明的方法来插入
$insertion
,以最小化内存使用?(不要在内存中存储两次
$data
)substr($data,$position)相对较小的情况如何?

您当前的实现取决于目标位置。如果位置靠近数据末尾,则内存效率最高。最坏的情况是插入数据的开头

例如,迷你基准:

$data=str_repeat('abcde',500000);
$INSERTING='abc';
$position=0;
$data=substr($data,0,$position)$插入。substr($数据,$位置);
回显内存\u获取\u峰值\u使用率(),“\n”;
上面的脚本显示峰值使用量为7868728字节(在我的机器上)。如果我设置
$position=strlen($data)/2
,那么它将打印6619424。如果将字符串附加到数据的末尾(
$position=strlen($data)
),则它将打印5365720

更新:上述代码在PHP版本上的内存消耗)

但是PHP已经有了替换字符串部分中文本的有效功能:

$data=substr\u replace($data,$insertion,$position,0);

在所有情况下,这需要与上述实现一样多的内存(通过在最佳情况下串联
substr()
结果)。

谢谢,这确实非常有用,尤其是测试方法(使用
memory\u get\u peak\u usage()
),但我得到了一些有争议的测试结果,因此,当我确信所有这些都是正确的时候,我会接受这个答案(实际上,我正在寻找原因,并且必须得到更详细的图片)。绝对是上等票。哦,你说得对看起来这种情况下的内存消耗也取决于PHP的版本(可能是最新版本有一些相关的优化?)。谢谢,我已经编辑了答案。