Performance optimization tool in PHP: Detailed explanation of PHP generator

不言
Release: 2023-04-03 15:20:01
Original
1495 people have browsed it

This article introduces you to the performance optimization tool in PHP: a detailed explanation of the PHP generator. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

If you are working in Python or other languages, you should be familiar with generators. But many PHP developers may not know the generator function. It may be because the generator is a function introduced in PHP 5.5.0, or it may be that the function of the generator is not very obvious. However, the generator function is really useful.

Advantages

If I talk about the concept directly, I guess you will still be confused after listening to it, so let’s talk about the advantages first, maybe it can arouse your interest. So what are the advantages of generators, as follows:

  • Generators will have a very large impact on the performance of PHP applications

  • PHP code runtime Save a lot of memory

  • More suitable for calculating large amounts of data

So, how are these magical functions achieved? Let's give an example first.

Concept introduction

First of all, let’s put down the burden of the generator concept and look at a simple PHP function:

function createRange($number){
    $data = [];
    for($i=0;$i<p> This is a very common PHP function, we often use it when processing some arrays. The code here is also very simple: </p><ol class=" list-paddingleft-2">
<li><p>We create a function. </p></li>
<li><p>The function contains a <code>for</code> loop. We loop the current time into <code>$data</code></p></li>
<li><p><code>for</code>After the loop is executed, <code>$data</code> is returned. </p></li>
</ol><p> It’s not over yet, let’s continue. Let’s write another function and print out the return value of this function in a loop: </p><pre class="brush:php;toolbar:false">$result = createRange(10); // 这里调用上面我们创建的函数
foreach($result as $value){
    sleep(1);//这里停顿1秒,我们后续有用
    echo $value.'<br>';
}
Copy after login

Let’s take a look at the running results in the browser:

Performance optimization tool in PHP: Detailed explanation of PHP generator

It's perfect here, no problems whatsoever. (Of coursesleep(1)You can’t see the effect)

Think about a question

We noticed that when calling the functioncreateRange When is passed, the value passed to $number is 10, a very small number. Suppose, now pass a value 10000000 (10 million).

Then, in function createRange, the for loop needs to be executed 1000 times. And 1000 million values ​​are placed in $data, and the $data array is placed in memory. Therefore, a lot of memory will be occupied when calling functions.

Here, the generator can show its talents.

Create generator

We modify the code directly, please pay attention:

function createRange($number){
    for($i=0;$i<p>Look at this code that is very similar to just now, we delete it Array <code>$data</code>, and did not return any content, but used a keyword <code>yield</code><code></code># before </p>time()<p> ##Use the generator<strong></strong></p> Let’s run the second piece of code again: <p></p><pre class="brush:php;toolbar:false">$result = createRange(10); // 这里调用上面我们创建的函数
foreach($result as $value){
    sleep(1);
    echo $value.'<br>';
}
Copy after login

Performance optimization tool in PHP: Detailed explanation of PHP generator

Our miraculous discovery , the output value is different from the first time without using the generator. The values ​​(timestamps) here are separated by 1 second.

The one second interval here is actually the consequence of

sleep(1). But why is there no gap the first time? That's because:

  • When the generator is not used:

    createRangeThe result of the for loop within the createRange function is quickly placed in $ data and returns immediately. Therefore, foreach

    loops through a fixed array.
  • When using a generator: The value of createRange is not generated quickly at one time, but relies on the foreach loop. foreach loops once and for

    executes once.

At this point, you should have some idea about the generator.

In-depth understanding of the generator

Code analysis

Let’s analyze the code just now.

function createRange($number){
    for($i=0;$i';
}
Copy after login
Let’s restore the code execution process.
  1. First call the createRange function, passing in the parameter 10, but the for value is executed once and then stops, And tell foreach

    the values ​​that can be used in the first loop.
  2. foreachStart the loop on $result, come in first sleep(1), and then start using A value given by for

    executes the output.
  3. foreach prepares for the second loop. Before starting the second loop, it requests the for

    loop again.
  4. forThe loop is then executed again, and the generated timestamp is told to foreach

    .###
  5. foreach拿到第二个值,并且输出。由于foreachsleep(1),所以,for循环延迟了1秒生成当前时间

所以,整个代码执行中,始终只有一个记录值参与循环,内存中也只有一条信息。

无论开始传入的$number有多大,由于并不会立即生成所有结果集,所以内存始终是一条循环的值。

概念理解

到这里,你应该已经大概理解什么是生成器了。下面我们来说下生成器原理。

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

那么代码中foreach循环的是什么?其实是PHP在使用生成器的时候,会返回一个Generator类的对象。foreach可以对该对象进行迭代,每一次迭代,PHP会通过Generator实例计算出下一次需要迭代的值。这样foreach就知道下一次需要迭代的值了。

而且,在运行中for循环执行后,会立即停止。等待foreach下次循环时候再次和for索要下次的值的时候,for循环才会再执行一次,然后立即再次停止。直到不满足条件不执行结束。

实际开发应用

很多PHP开发者不了解生成器,其实主要是不了解应用领域。那么,生成器在实际开发中有哪些应用?

读取超大文件

PHP开发很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如5个G。这时,直接一次性把所有的内容读取到内存中计算不太现实。

这里生成器就可以派上用场啦。简单看个例子:读取text文件

Performance optimization tool in PHP: Detailed explanation of PHP generator

我们创建一个text文本文档,并在其中输入几行文字,示范读取。

<?php header("content-type:text/html;charset=utf-8");
function readTxt()
{
    # code...
    $handle = fopen("./test.txt", &#39;rb&#39;);

    while (feof($handle)===false) {
        # code...
        yield fgets($handle);
    }

    fclose($handle);
}

foreach (readTxt() as $key => $value) {
    # code...
    echo $value.'<br>';
}
Copy after login

Performance optimization tool in PHP: Detailed explanation of PHP generator

通过上图的输出结果我们可以看出代码完全正常。

但是,背后的代码执行规则却一点儿也不一样。使用生成器读取文件,第一次读取了第一行,第二次读取了第二行,以此类推,每次被加载到内存中的文字只有一行,大大的减小了内存的使用。

这样,即使读取上G的文本也不用担心,完全可以像读取很小文件一样编写代码。

相关文章推荐:

PHP动态生成内容的数组(生成器)的解析

PHP7中生成器的新特性:生成器委托( yield-from )&返回值(return-value)

PHP生成器Generators的简单解析    

The above is the detailed content of Performance optimization tool in PHP: Detailed explanation of PHP generator. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template