PHP如何处理substr中的字符串?

PHP如何处理substr中的字符串?,php,string,memory-management,Php,String,Memory Management,我在$str中存储了一个很长的字符串。现在我执行$sub=substr($str,$pos),并且只对两个字符串执行读取操作 长字符串仍然只存储在内存中一次,还是在调用substr时被拆分?有没有办法在PHP级别测试它?一个例子: <?php $originalstr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse et nisl in diam fermentum conva

我在
$str
中存储了一个很长的字符串。现在我执行
$sub=substr($str,$pos)
,并且只对两个字符串执行读取操作

长字符串仍然只存储在内存中一次,还是在调用
substr
时被拆分?有没有办法在PHP级别测试它?

一个例子:

<?php
    $originalstr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse et nisl in diam fermentum convallis et sit amet nulla. In at massa ipsum. Vestibulum tempus egestas elit, sollicitudin ullamcorper mauris dictum in. Etiam non mollis velit. Vestibulum tincidunt urna ut posuere placerat. Ut cursus ipsum non ipsum auctor, vitae accumsan sem pretium. Praesent porta vestibulum nisl, a malesuada nisi finibus at. Morbi aliquet vitae ante et porttitor. Donec laoreet nisi ut neque luctus vulputate. Donec sollicitudin massa at turpis lobortis laoreet. Etiam porta lacinia placerat. Aenean venenatis dui quis elit facilisis porta. Donec vel semper odio. Vivamus mauris neque, egestas ac mi ac, rutrum dignissim dui. Fusce consectetur eleifend luctus. Vestibulum accumsan rutrum magna iaculis tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eget arcu sodales, porttitor magna nec, scelerisque purus.";  // the string
    $substr = substr($originalstr, 0, 50);
    echo $substr. "<br><hr><br>". $originalstr;  //prints the first 50 characters; and then prints the actual string
?>

输出:

Lorem ipsum dolor sit amet,Concertetur Adipising


Lorem ipsum dolor sit amet,是一位杰出的献身者。发酵过程中的悬浮液和酒精浓度。在马萨伊普苏姆。前庭的时间是最短的,是最短的。我不是莫利斯·维利特。前庭前庭,前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭。但是,同侧非同侧拍卖人,accumsan生活sem pretium。前庭门前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前庭前。Morbi,我的生命在前和后。不要让你的老鼠会变成恶棍。在turpis lobortis laoreet的Donec sollicitudin massa。lacinia placerat门酒店。埃尼亚威尼斯人在港口的精英设施。千万别这样。毛里斯·奈克万岁,埃吉斯塔·ac·米·ac,尊贵的芸香酒后驾车。乌贼。大果芸香前庭。Lorem ipsum dolor sit amet,是一位杰出的献身者。多奈克·埃吉特·阿尔库·索达莱斯,波特提托·麦格纳·内克,斯克利里斯·普鲁斯

:

substr

(PHP4、PHP5、PHP7、PHP8)

substr-返回字符串的一部分 说明» substr(string$string,int$offset,int | null$length=null):string

返回由偏移量和长度参数指定的字符串部分。 参数»

输入字符串。 抵消

如果偏移量为非负,则返回的字符串将从字符串中偏移量的th>位置开始,从零开始计数。例如,在字符串“abcdef”中,位置0处的>字符是“a”,位置2处的字符是“c”,以此类推

如果偏移量为负,则返回的字符串将从字符串末尾的偏移量的第个>字符开始

若字符串长度小于偏移量字符,则返回false

示例#1使用负偏移

   <?php
   $rest = substr("abcdef", -1);    // returns "f"
   $rest = substr("abcdef", -2);    // returns "ef"
   $rest = substr("abcdef", -3, 1); // returns "d"
   ?>

长度

如果给定长度且为正数,则返回的字符串将最多包含从偏移量开始的>长度字符(取决于字符串的长度)

如果给定长度且长度为负数,则将从字符串结尾处忽略>多个字符(当>偏移量为负数时,在计算开始位置之后)。如果offset表示此截断的位置或超出此位置,则返回>false

如果给定的长度为0、false或null,则将返回空字符串

如果省略了length,则将返回从offset开始到>字符串结尾的子字符串

示例#2使用负长度

   <?php
   $rest = substr("abcdef", 0, -1);  // returns "abcde"
   $rest = substr("abcdef", 2, -1);  // returns "cde"
   $rest = substr("abcdef", 4, -4);  // returns false
   $rest = substr("abcdef", -3, -1); // returns "de"
   ?>

返回值»

返回字符串的提取部分;或失败时为false,或为空>字符串

我认为他们根本没有提到任何关于记忆的事情。因此,您需要在运行PHP应用程序时测试内存使用峰值

他们提到: 如果给定长度且为正数,则返回的字符串将最多包含从偏移量开始的>长度字符(取决于字符串的长度)

但根据常识,他们可能已经将其设计为仅从该变量中获取第一个字符,然后在到达
$pos
时停止执行


玩得开心

对于PHP级别:下面是一个示例,您可以在任何在线PHP编译器上测试它

该示例将向您显示该字符串将保持不变,并且只有子字符串是新字符串(0:开始索引,5:结束索引)

如果您有其他问题或疑问,请随时再问我

  <?php
      $txt = "test_string_in_php_demo";  //string
      $sub = substr($txt, 0, 5);
      echo $sub;  //prints the sub string from start to index 5 
      echo "<br>"; 
      echo "<br>";
      echo $txt;  // prints the full txt;
    ?>

输出:

试验_

在php演示中测试字符串

额外资源:

我刚找到函数:

echo memory_get_usage()."<br>";       // 391544
$str = file_get_contents("data.bin"); // 500 kb
echo memory_get_usage()."<br>";       // 961000
$sub = substr($str, 100000);
echo memory_get_usage()."<br>";       // 1432040
unset($sub);
echo memory_get_usage()."<br>";       // 961000
unset($str);
echo memory_get_usage()."<br>";       // 391656
echo memory_get_usage()。“
”;//391544 $str=file_get_contents(“data.bin”);//500 kb 回显内存获取用法()。“
”;//961000 $sub=substr($str,100000); 回显内存获取用法()。“
”;//1432040 未结算(次级); 回显内存获取用法()。“
”;//961000 未结算($str); 回显内存获取用法()。“
”;//391656

从测试中可以看出,PHP根本没有优化内存管理!非常悲哀。

问题是关于内存:如果
$sub
地址是
$txt
地址加上5,那么内存是共享的。在C语言中很容易找到这一点,但我不知道PHP在幕后做了什么。看看,我相信这篇文章也有同样的意图。它还提供了一个关于如何使用strpos为只读子字符串提供一个内存效率更高的解决方案的答案。