php substr没有内存消耗

时间:2013-12-08 08:05:13

标签: php memory substr

我需要在长字符串中插入短字符串。我的问题是,字符串成本记忆的子字符串......无论如何在没有占用新内存的情况下将字符串长成两行。

 $str = "xxx...yyy"; // 10 MB

 $insert_str = "insert here";

 // now split long string and insert short string

 echo substr($str, 0, 5000000); // eats next 5 MB
 echo $insert_str;
 echo substr($str, 5000000); // eats next 5 MB

我的问题是脚本以致命错误结束:内存不足 但不会,也不能为此

添加额外的内存

我不能使用substr_replace ...因为没有替换...插入文本

我无法使用任何文件操作,因为文本是动态生成的(不在文件中)

3 个答案:

答案 0 :(得分:0)

你可以尝试substr-replace,但我不确定它的内存使用情况。 http://php.net/manual/en/function.substr-replace.php

修改

Perl更有效地处理字符串操作。将文件输出到服务器上的某个位置后,您需要执行脚本。

$perl = new Perl();
$perl->require("inserter.pl");

如果您使用PHP,另一个好的解决方案是使用preg_replace

答案 1 :(得分:0)

事实上,php网站上有人发布了一个类似场景的例子。

$token_symbols = " \t\n";
$str = file_get_contents('10MB.txt'); // 9.75410079956 MB
tokenize($str, $token_symbols); // 9.75426483154 MB
unset($str);
strtok('', ''); // 0.0543975830078 MB


function tokenize($str, $token_symbols, $token_reset = true) {
    $word = strtok($str, $token_symbols);
    while (false !== $word) {
        // do something here...
        $word = strtok($token_symbols);
    }

    if($token_reset)
        strtok('', '');
}

以下是一个后续释放内存的示例函数。

- strtok() PHP manual

答案 2 :(得分:0)

可能是这样的:

$str = "xxx...yyy"; // 10 MB

$insert_str = "insert here";

// now split long string and insert short string

for($i=0;$i<5000000;$i++){
    echo $str[$i];
}
echo $insert_str;
$len = strlen($str);
for($i=5000000;$i<len;$i++){
    echo $str[$i];
}