php子字符串,无内存消耗


php substr without memory consumpsion

我需要将短字符串插入到长字符串中。我的问题是,字符串的子字符串占用内存。。。不管怎样,把长长的绳子一分为二都不会吃掉新的记忆。

 $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

我的问题是脚本以致命错误结尾:内存不足但不要不会也不能为这个添加额外的内存

我无法使用substra_replace。。。因为没有任何东西被取代。。。插入文本

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

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手动

可以这样做:

$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];
}

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

编辑

Perl处理字符串操作的效率要高得多。一旦将文件输出到服务器上的某个位置,就需要执行脚本。

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

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