当前位置: 首页 > 后端技术 > PHP

深入了解PHP的生成器

时间:2023-03-29 21:04:05 PHP

在驾驶方面,速度并不是一切。但在网络上,速度很重要。您的应用程序越快,用户体验就越好。那么,此时有人想知道,这篇文章是关于PHP生成器的,那么我们为什么要谈论速度呢?您很快就会看到,生成器在速度和内存管理方面产生了巨大差异。什么是PHP生成器?生成器是在PHP5.5版本中添加的,这些生成器提供了一种简单的方法来迭代数据,而无需在内存中构建数组。还是有点困惑?这是通过示例展示生成器的好方法。首先,让我们快速创建一个我们将在本教程中使用的generator.php文件。创建文件后,我们添加一小段代码。";}我们可以在创建generator.php文件的目录中快速启动内置PHP服务器:php-Slocalhost:8000因此,如果我们访问http://localhost:8000/generator.php,我们应该得到类似这样的信息。该代码几乎是不言自明的,而且看起来确实不多。但是,如果我们返回代码并进行一些更改,例如";}现在,上限(最大值)生成的数字是PHP_INT_MAX,这是您的PHP版本可以达到的最大数字。完成此操作后,转到浏览器并刷新。但这一次,你会注意到一些不同的东西。生成器脚本引发警告错误。嗯,很遗憾,PHP内存不足。想到的解决方案可能包括进入php.ini并增加memory_limit上限。让我们问自己这些问题,这真的有效吗?我们想要一个占用服务器所有内存的脚本吗?答案是否定的。这是无效的,我们不希望单个脚本耗尽我们所有的内存。使用生成器可以让我们定义上面相同的函数,使用相同的PHP_INT_MAX值调用它,然后再次运行它。然而,这一次,我们将创建一个生成器函数。";}剖析getRange函数,这一次,我们只是迭代值并产生输出。yield与return类似,它也从函数返回一个值,但唯一的区别是yield只在需要时返回一个值,并不试图将整个数据集保存在内存中。如果您转到浏览器,您应该会看到页面上显示的数据。在适当的时间,浏览器最终会显示数据。注意:生成器只能通过函数使用。你为什么要这么做?有时,我们可能想要解析大型数据集(可能是日志文件),或者对大型数据库结果进行计算等。我们不希望这样的操作占用所有内存。我们应该尽量节省内存。数据不必很大——无论数据集多小,生成器都是有效的。别忘了,我们的目标是使用更少的内存来提高速度。返回键有时我们的数据只有基于键值对才有意义。使用生成器时,我们可以像这样生成键值对。$value;然后,我们可以像使用任何此类数组一样继续使用该键值对。$value){echo"Dataset{$range}has{$value}value
";}Sendvaluetogenerator生成器也可以接受值。这意味着生成器允许我们向其中注入值,可能作为命令或其他方式。例如,我们可以向生成器发送一个值,告诉它停止执行或更改输出。使用上面的getRange函数,我们可以做到这一点。send('stop');}}echo"Dataset{$range}
";}注意:在生成器中使用return会破坏生成器函数。不要滥用生成器使用PHP_INT_MAX有点麻烦。对我来说,PHP_INT_MAX是2147483647,即:2147483647生成器应该是内存高效的。这并不意味着如果使用不当,它们不会导致它们试图解决的相同问题。结论生成器为我们提供了难以忽视的性能提升。大多数时候,我们不需要强大的服务器来处理我们的代码。我们只需要做一些重构。发电机是有用的,我们应该多用。原文地址:https://scotch.io/tutorials/understanding-php-generators今天分享到这里。如果您有任何问题或建议,请留言交流。更多学习内容,请访问码农到架构师的培养之路