宝哥软件园

性能优化工具你可能会忽略在PHP: generator

编辑:宝哥软件园 来源:互联网 时间:2021-09-02

如果您是Python或其他语言的合作伙伴,您应该熟悉生成器。但是很多PHP开发人员可能不知道生成器的功能,要么是因为它是PHP 5.5.0引入的,要么是生成器的功能不明显。但是,生成器函数真的很有用。

在什么情况下会遇到PHP性能问题?

1.1:PHP语法使用不当。

2.用PHP语言做一些它不擅长的事情。

PHP语言连接的服务无效。

4.PHP本身的缺点(PHP本身做不到的事情)。

5:我们也不知道的问题?(探索、分析、寻找解决方案,提升发展境界)。

优势

估计你直接听完概念还是很困惑,先说优点,可能会引起你的兴趣。那么发电机有什么优点,如下:

生成器将对PHP应用程序的性能产生很大的影响。PHP代码运行时节省了大量内存,更适合计算大量数据。那么,这些神奇的功能是如何工作的呢?让我们从一个例子开始。

概念介绍

首先,放下生成器的概念,看看一个简单的PHP函数:

函数create range($ number){ $ data=[];for($ I=0;$ i $数字;$ I){ $ data[]=time();}返回$ data}这是一个非常常见的PHP函数,我们在处理一些数组时经常用到。这里的代码也很简单:

我们创建一个函数。该函数包含一个for循环。我们将当前时间循环输入$data。执行for循环后,返回$data。下面还没有结束,我们继续。我们再写一个函数,循环打印这个函数的返回值:

$ result=create range(10);//调用上面创建的函数foreach($ result as $ value){ sleep(1);//在这里暂停1秒钟,我们将使用echo $value。br/'稍后;}让我们看看浏览器中的运行结果:

这里很完美,没有任何问题。(当然,你看不到睡眠的效果(1))

思考一个问题

我们注意到,当调用createRange函数时,传递给$number的值是10,这是一个非常小的数字。假设现在传递了一个值1000000(1000万)。

然后,在createRange函数中,for循环需要执行1000万次。1000万个值放在$data中,现在$data数组放在内存中。因此,调用函数时会占用大量内存。

在这里,发电机可以展示它的才能。

创建生成器

我们直接修改代码,大家注意观察:

函数create range($ number){ for($ I=0;$ i $数字;$i ){屈服时间();}}看看这段与刚才非常相似的代码。我们删除了array $数据,并且没有返回任何内容。相反,我们在time()之前使用了关键字yield

使用发电机

让我们再次运行第二个代码:

$ result=create range(10);//调用上面创建的函数foreach($ result as $ value){ sleep(1);echo $值。br/';}

神奇的是,我们第一次发现输出值和没有发电机的不一样。这里的值(时间戳)以1秒为间隔。

这里的一秒间隔实际上是睡眠的结果(1)。但是为什么第一次没有间隔呢?那是因为:

当不使用生成器时:createRange函数中for循环的结果被快速放入$data中并立即返回。因此,foreach循环一个固定数组。使用生成器时:createRange的值不会一次快速生成,而是取决于foreach循环。Foreach循环一次,for执行一次。在这一点上,你应该对发电机有所了解。

对发电机的深刻理解

代码解析

让我们分析一下刚才的代码。

函数create range($ number){ for($ I=0;$ i $数字;$i ){屈服时间();} } $ result=create range(10);//调用上面创建的函数foreach($ result as $ value){ sleep(1);echo $值。br/';}让我们恢复代码执行过程。

首先调用createRange函数,传入参数10,但是for值执行一次,然后停止,foreach被告知可以在第一个循环中使用的值。Foreach开始循环$result,首先进入睡眠状态(1),然后使用for给出的值开始输出。Foreach为第二个循环做准备,在开始第二个循环之前,它再次请求for循环。然后再次执行for循环,告诉foreach生成的时间戳。foreach获取第二个值并输出。由于foreach中的sleep(1),for循环被延迟1秒以生成当前时间。因此,在整个代码执行过程中,总是只有一个记录值参与循环,内存中只有一条消息。

不管开头传入的$number有多大,内存始终是一个循环值,因为不会立即生成所有结果集。

概念理解

现在,你应该对什么是发电机有了一个大致的了解。先说发电机原理。

首先明确一个概念:生成器yield关键字不是返回值,他的专业术语叫做output value,只生成一个值

那么代码中的foreach循环是什么呢?实际上,当PHP使用生成器时,它会返回一个生成器类的对象。Foreach可以迭代这个对象,每次迭代,PHP都会通过Generator实例计算下一次迭代的值。这样,foreach就知道下次要迭代的值。

此外,当for循环在操作中执行时,它将立即停止。当foreach在下一个循环中再次请求下一个值时,for循环将再次执行,然后立即再次停止。如果条件不满足,则直到非执行结束。

实际开发和应用

很多PHP开发人员不知道生成器,主要是不知道应用领域。那么,发电机在实际开发中有哪些应用呢?

读取非常大的文件

PHP开发经常需要读取大文件,比如csv文件、文本文件或者一些日志文件。如果这些文件很大,比如说5 g。此时,一次将所有内容读入内存是不现实的。

发电机在这里可以派上用场。举个简单的例子:阅读文本文件

我们创建一个文本文档,输入几行文本来演示阅读。

?phpheader(' content-type : text/html;charset=utf-8 ');函数readTxt(){ # code.$handle=fopen('。/test.txt ',' Rb ');while(feof($ handle)==false){ # code.yield fgets($ handle);} fc lose($ handle);}foreach (readTxt()作为$key=$value) { # code.echo $值。br/';}

从上图的输出结果可以看出,代码完全正常。

然而,它背后的代码执行规则完全不同。使用生成器读取文件,第一次读取第一行,第二次读取第二行,以此类推,每次只将一行文本加载到内存中,大大减少了内存的使用。

这样,即使你读了G的文本也不用担心,你可以像读一个很小的文件一样写代码。

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

更多资讯
游戏推荐
更多+