検索
ホームページバックエンド開発PHPチュートリアルPHP で無視されているパフォーマンス最適化ツール: ジェネレーターの詳細な説明

PHP で無視されているパフォーマンス最適化ツール: ジェネレーターの詳細な説明

Python または他の言語で作業している場合は、ジェネレーターについてよく知っている必要があります。しかし、ジェネレーターは PHP 5.5.0 で導入された機能であるため、またはその機能があまり明確ではないため、ジェネレーター機能を知らない PHP 開発者も多いかもしれません。しかし、ジェネレーター機能は本当に便利です。

メリット

コンセプトを直接聞いてもまだ混乱すると思いますので、最初にメリットについて話しましょう。おそらくそれがあなたの興味を引くでしょう。では、ジェネレーターの利点は次のとおりです。

  • ジェネレーターは、PHP アプリケーションのパフォーマンスに大きな影響を与えます
  • PHP コードを実行するときに大量のメモリを節約します。は実行中です
  • 大量のデータの計算に適しています
##では、これらの魔法の機能はどのように実現されるのでしょうか?まず例を挙げてみましょう。

概念の紹介

まず、ジェネレーターの概念の重荷を下ろして、単純な PHP 関数を見てみましょう:

function createRange($number){
    $data = [];
    for($i=0;$i<$number;$i++){
        $data[] = time();
    }
    return $data;
}复制代码

これは非常に一般的な PHP です。私たちが扱っている関数 これは、いくつかの配列を扱うときによく使用されます。ここのコードも非常に単純です:

    関数を作成します。
  1. 関数には
  2. for ループが含まれており、現在の時刻を $data
  3. for ループにループします。完了すると、$data が返されます。
まだ終わっていないので、続けましょう。別の関数を作成し、この関数の戻り値をループで出力しましょう:

$result = createRange(10); // 这里调用上面我们创建的函数
foreach($result as $value){
    sleep(1);//这里停顿1秒,我们后续有用
    echo $value.&#39;<br />&#39;;
}复制代码

ブラウザで実行結果を見てみましょう:

![](https:// picb.zhimg .com/80/v2-3620f3d46bb5b49e53ca47891ea1fd5a_720w.jpg)

ここでは完璧で、何の問題もありません。 (もちろん

sleep(1) 効果はわかりません)

質問について考えてください

関数

createRange## を呼び出したときに次のことに気づきました。 #$number に渡される値は 10 であり、非常に小さな数値です。ここで値 10000000 (1000 万) を渡すとします。 次に、関数

createRange

で、for ループを 1000 回実行する必要があります。そして、1000 百万個の値が $data に配置され、$data 配列がメモリに配置されます。したがって、関数を呼び出すときに多くのメモリが占​​有されます。 ここでジェネレーターがその才能を発揮します。

ジェネレーターを作成します

コードを直接変更します。注意してください:

function createRange($number){
    for($i=0;$i<$number;$i++){
        yield time();
    }
}复制代码

今のコードとよく似ていますが、配列を削除しました

$ data

と何も返されませんが、 time()yieldUsegenerator

の前にキーワードが使用されています。 2 番目のコードをもう一度:

$result = createRange(10); // 这里调用上面我们创建的函数
foreach($result as $value){
    sleep(1);
    echo $value.&#39;<br />&#39;;
}复制代码

![](https://pic2.zhimg.com/80/v2-9c08f2d01f7a68736f45ffa3d3934cc5_720w.jpg)

奇跡的に出力値が異なることがわかりました。初めてジェネレーターを使用せずに。ここでの値(タイムスタンプ)は 1 秒ごとに区切られています。

ここでの 1 秒間隔は、実際には

sleep(1)

の結果です。しかし、なぜ最初はギャップがないのでしょうか?その理由は次のとおりです。

ジェネレーターが使用されていない場合:
    createRange
  • 関数の for ループ結果はすぐに $data## に配置されます。 # そしてすぐに戻ります。したがって、foreach は固定配列をループします。 ジェネレーターを使用する場合: createRange
  • の値は一度にすぐには生成されず、
  • foreach ループに依存します。 foreach は 1 回ループし、for は 1 回実行します。 この時点で、ジェネレーターについてある程度理解できたはずです。
ジェネレーターについての深い理解

コード分析

今コードを分析してみましょう。

function createRange($number){
    for($i=0;$i<$number;$i++){
        yield time();
    }
}

$result = createRange(10); // 这里调用上面我们创建的函数
foreach($result as $value){
    sleep(1);
    echo $value.&#39;<br />&#39;;
}复制代码

コード実行プロセスを復元しましょう。

最初に

createRange
    関数を呼び出し、パラメータ
  1. 10 を渡しますが、for 値は 1 回実行されて停止します。最初のループで使用できる foreachValues を伝えます。 foreach
  2. $result でループを開始し、最初に sleep(1) に来てから、for## の使用を開始します。 # 値が出力を実行します。 foreach は 2 番目のループを準備します。2 番目のループを開始する前に、再度
  3. for
  4. ループを要求します。 forループが再度実行され、生成されたタイムスタンプが
  5. foreach
  6. .foreach に指示されて、 2つの値と出力。
  7. foreach
  8. sleep(1) なので、for ループは 1 秒遅れて現在時刻 を生成します。コード全体 実行中、ループに参加するレコード値は常に 1 つだけであり、メモリ内に存在する情報は 1 つだけです。
  9. 最初に渡される
$number

がどれほど大きくても、すべての結果セットがすぐに生成されるわけではないため、メモリは常に値のループになります。

概念的な理解この時点で、ジェネレーターとは何かについて大まかに理解しているはずです。以下でジェネレーターの原理について説明しましょう。

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

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

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

实际开发应用

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

读取超大文件

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

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

![](https://pic1.zhimg.com/80/v2-2d6fb1058b39008fbe4e5363e485e9a2_720w.jpg)

我们创建一个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.&#39;<br />&#39;;
}复制代码

![](https://pic4.zhimg.com/80/v2-2bbdc40ebf8f1aeedf2aa0c472811c77_720w.jpg)

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

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

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

想了解更多编程学习,敬请关注php培训栏目!

以上がPHP で無視されているパフォーマンス最適化ツール: ジェネレーターの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はjuejinで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
PHP依存性噴射コンテナ:クイックスタートPHP依存性噴射コンテナ:クイックスタートMay 13, 2025 am 12:11 AM

aphpDependencyInjectionContaineriSATOULTAINATINAGECLASSDEPTINCIES、強化測定性、テスト可能性、および維持可能性。

PHPの依存噴射対サービスロケーターPHPの依存噴射対サービスロケーターMay 13, 2025 am 12:10 AM

SELECT DEPENTENCINGINOFCENT(DI)大規模なアプリケーションの場合、ServicElocatorは小さなプロジェクトまたはプロトタイプに適しています。 1)DIは、コンストラクターインジェクションを通じてコードのテスト可能性とモジュール性を改善します。 2)ServiceLocatorは、センター登録を通じてサービスを取得します。これは便利ですが、コードカップリングの増加につながる可能性があります。

PHPパフォーマンス最適化戦略。PHPパフォーマンス最適化戦略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedforspeedandEfficiencyby:1)enabingopcacheinphp.ini、2)PreparedStatementswithpordatabasequeriesを使用して、3)LoopswithArray_filterandarray_mapfordataprocessing、4)の構成ngincasaSearverseproxy、5)

PHPメールの検証:電子メールが正しく送信されるようにしますPHPメールの検証:電子メールが正しく送信されるようにしますMay 13, 2025 am 12:06 AM

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl

PHPアプリケーションをより速くする方法PHPアプリケーションをより速くする方法May 12, 2025 am 12:12 AM

tomakephpapplicationsfaster、followthesesteps:1)useopcodecachinglikeopcacheTostoredscriptbytecode.2)最小化abasequeriesecachingingindexing.3)leveragephp7機能forbettercodeefficiency.4)

PHP依存性インジェクション:コードのテスト可能性を改善しますPHP依存性インジェクション:コードのテスト可能性を改善しますMay 12, 2025 am 12:03 AM

依存性注入(DI)は、明示的に推移的な依存関係によりPHPコードのテスト可能性を大幅に改善します。 1)DI分離クラスと特定の実装により、テストとメンテナンスが柔軟になります。 2)3つのタイプのうち、コンストラクターは、状態を一貫性に保つために明示的な式依存性を注入します。 3)DIコンテナを使用して複雑な依存関係を管理し、コードの品質と開発効率を向上させます。

PHPパフォーマンスの最適化:データベースクエリの最適化PHPパフォーマンスの最適化:データベースクエリの最適化May 12, 2025 am 12:02 AM

DatabaseQueryoptimizationInpholvesseveralstrategESTOEnhancePerformance.1)selectonlynlynlyndorycolumnStoredatedataTransfer.2)useindexingtospeedupdataretrieval.3)revenmecrycachingtostoreres sultsoffrequent queries.4)

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。