ホームページ バックエンド開発 PHPチュートリアル PHPのジェネレーターの詳しい説明

PHPのジェネレーターの詳しい説明

May 11, 2020 am 10:35 AM
php ビルダー

運転に関しては、スピードがすべてではありません。しかし、ウェブでは速度がすべての違いを生みます。アプリケーションが高速であればあるほど、ユーザー エクスペリエンスは向上します。この記事は PHP ジェネレーターに関するものですが、なぜ速度について話しているのでしょうか?ジェネレータが速度とメモリ管理に大きな役割を果たしていることがすぐにわかります。

PHP ジェネレーターとは何ですか?

ジェネレーターは PHP 5.5 で追加され、メモリ内に配列を構築せずにデータを反復処理する簡単な方法を提供します。少し混乱していますか?次に、ジェネレーターの使用が良い方法であることを示す例を挙げます。

まず、この例全体で使用するgenerator.php ファイルを作成します。ファイルを作成した後、コードを追加します。

<?php
function getRange ($max = 10) {
    $array = [];
    for ($i = 1; $i < $max; $i++) {
        $array[] = $i;
    }
    return $array;
}
foreach (getRange(15) as $range) {
    echo "Dataset {$range} <br>";
}
ログイン後にコピー

generator.php ファイルが作成されたディレクトリで組み込み PHP サーバーをすぐに起動できます:

php -S localhost:8000
ログイン後にコピー

ブラウザを使用して http://localhost:8000 を開く場合/generator.php、次のような結果が表示されるはずです。

PHPのジェネレーターの詳しい説明

#このコードは、あまり自明ではありません。コードを少し変更しましょう

<?php
foreach (getRange(PHP_INT_MAX) as $range) {
    echo "Dataset {$range} <br>";
}
ログイン後にコピー

さて、上記のコードが生成できる最大値は PHP_INT_MAX (つまり、PHP が生成できる最大値) です。この変更後にブラウザを更新すると、次のようになります。今回は何かが違います。このジェネレータ スクリプトは警告メッセージをスローします。

PHPのジェネレーターの詳しい説明

#PHP がメモリ不足になるのは残念です。考えられる解決策としては、php.ini ファイルのmemory_limit の上限を増やすことが考えられます。しかし、公平を期すために言うと、このスクリプトは非効率的であり、メモリも消費します。必要なのは、効率的でメモリの消費量が少ないスクリプトです。

ジェネレーターの使用

上記と同じ関数を定義し、同じ値の PHP_INT_MAX で呼び出して、もう一度実行してみましょう。ただし、今回はジェネレーター関数を作成します。

<?php
function getRange ($max = 10) {
    for ($i = 1; $i < $max; $i++) {
        yield $i;
    }
}
foreach (getRange(PHP_INT_MAX) as $range) {
    echo "Dataset {$range} <br>";
}
ログイン後にコピー

getRange 関数を解析します。今回は値のみをループして出力を生成します。 yield は関数から値を返すという点で戻り値と似ていますが、唯一の違いは、yield は必要な場合にのみ値を返し、データセット全体をメモリに保持しようとしないことです。

ブラウザにアクセスすると、ページにデータが表示されるはずです。適切な時間が与えられると、ブラウザーは最終的にデータを表示します。

注: ジェネレーターは関数内でのみ使用できます。

ジェネレーターを使用する理由

巨大なデータ セット (おそらくログ ファイル) を解析したい状況に遭遇することがあります。大規模なデータベースの結果セットなどに対して計算を実行することが可能です。このすべてのデータをメモリにロードする必要はありません。対応するメモリ状態を可能な限り保存する必要があります。データが大きい必要はありません。データがどれほど小さくても、ジェネレーターは効率的です。忘れないでください。私たちの目標は、メモリの使用量を減らしてできるだけ早くデータを処理することです。

キーと値のペアを返す

データがキーと値に基づいている場合、データの説得力が高まる場合があります。ジェネレーターを使用する場合、次のようなキーと値のペアを生成することがあります。

<?php
function getRange ($max = 10) {
    for ($i = 1; $i < $max; $i++) {
        $value = $i * mt_rand();
        yield $i => $value;
    }
}
ログイン後にコピー

その後、このキーと値のペアを他の配列と同じように使用できます。

<?php
foreach (getRange(PHP_INT_MAX) as $range => $value) {
    echo "Dataset {$range} has {$value} value<br>";
}
ログイン後にコピー

パラメーターをジェネレーターに渡す

ジェネレーターはパラメーターを受け取ることもできます。これは、ジェネレーターを使用すると、パラメーターをコマンドまたは他の関数としてジェネレーターに挿入できることを意味します。たとえば、ジェネレーターに値を送信して、ジェネレーターの実行を停止したり、出力を変更したりします。上記の getRange 関数を使用すると、これを実現できます。

<?php
function getRange ($max = 10) {
    for ($i = 1; $i < $max; $i++) {
        $injected = yield $i;
        if ($injected === &#39;stop&#39;) return;
    }
}
ログイン後にコピー

注入されたこの値を送信するには、次のようにします。

<?php
$generator = getRange(PHP_INT_MAX);
foreach ($generator as $range) {
    if ($range === 10000) {
        $generator->send(&#39;stop&#39;);
    }
    echo "Dataset {$range} <br>";
}
ログイン後にコピー

注: ジェネレーター内で return を使用すると、ジェネレーターから飛び出します。

ジェネレーターを乱用しないでください

ただし、PHP_INT_MAX を使用するのは少しやりすぎです。しかし、私にとって、PHP_INT_MAX は 2147483647 で、これは次のとおりです。

20 億 4,714 万 83,647

#ジェネレーターはメモリ使用量を計算します。もっと効率的。しかし、乱用すると、記憶関連の問題を引き起こす可能性もあります。

概要

ジェネレーターは、無視できない大幅なパフォーマンスの向上をもたらします。ほとんどの場合、コードを実行するために高度な構成のサーバーは必要ありません。少しリファクタリングを行うだけで済みます。ジェネレーターは非常に便利なので、もっと使用する必要があります。

推奨チュートリアル: 「Laravel チュートリアル」「PHP チュートリアル」「PHP7

以上がPHPのジェネレーターの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

CakePHP のロギング CakePHP のロギング Sep 10, 2024 pm 05:26 PM

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

See all articles