検索
ホームページバックエンド開発PHPチュートリアル見落としがちな PHP のパフォーマンス最適化ツール: ジェネレーター関連のコンテンツ

見落としがちな PHP のパフォーマンス最適化ツール: ジェネレーター関連のコンテンツ

Jul 06, 2018 pm 05:51 PM
PHPのパフォーマンスの最適化PHP Webサイトのパフォーマンスの最適化

パフォーマンスの最適化は開発の重要な部分です。次の記事では、見落としがちな PHP のパフォーマンス最適化ツール、ジェネレーターの関連情報を主に紹介します。この記事では、サンプル コードを通じて詳細に紹介しています。必要な場合はそれを参照してください。以下を見てみましょう。

まえがき

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

どのような状況で PHP のパフォーマンスの問題が発生しますか?

1: PHP 構文の不適切な使用。

2: PHP 言語が苦手なことを行うには、PHP 言語を使用します。

3: PHP 言語を使用して接続されるサービスは強力ではありません。

4: PHP 自体の欠点 (PHP 自体ができないこと)。

5: 私たちも知らない問題? (解決策を探索、分析、発見し、開発レベルを向上させるため)。

#利点


  • # 興味をそそる。では、ジェネレーターの利点は次のとおりです。
  • ジェネレーターは、PHP アプリケーションのパフォーマンスに非常に大きな影響を与えます
  • PHP コードランタイム メモリを大量に節約する

大量のデータの計算に適しています

では、これらの魔法の機能はどのように実現されるのでしょうか?まず例を挙げてみましょう。

概念の紹介

まず、ジェネレーターの概念の重荷を脇に置き、単純な PHP 関数を見てみましょう。

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

#これは、配列を処理するときによく使用される非常に一般的な PHP 関数です。ここのコードも非常に単純です:

関数を作成します。

関数には for ループが含まれており、現在の時刻を $data にループします。

for ループが実行された後、$data Go back外。

まだ終わっていないので、続けましょう。別の関数を作成し、この関数の戻り値をループで出力しましょう:

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

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

ここでは完璧です、何の問題もありません。 (もちろん、睡眠(1) の効果は確認できません)


質問について考えてみましょう


私たちは次のことに気づきました。 createRange 関数を呼び出すとき、$number に渡される値は 10 であり、非常に小さな数です。ここで、10000000 (1000 万) の値を渡すとします。
次に、関数 createRange では、for ループを 1,000 万回実行する必要があります。そして、1,000 万個の値が $data に配置され、$data 配列がメモリに配置されます。したがって、関数を呼び出すときに多くのメモリが占​​有されます。

ここでジェネレーターがその才能を発揮します。

    ジェネレーターの作成
  • コードを直接変更します。注意してください:

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

今とよく似たこのコードを見てください。配列 $data を削除しましたが、何も返しませんでした。代わりに、time() の前にキーワード yield を使用しました。

ジェネレーターの使用

#コードの 2 番目の部分をもう一度実行してみましょう:
$result = createRange(10); / / ここで上で作成した関数を呼び出します

foreach($result as $value){

sleep(1);

echo $value.'
';

}

###ジェネレータを使用しないと、出力値が最初と異なることが奇跡的に発見されました。ここでの値(タイムスタンプ)は 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.'
'; }
######### コード実行プロセスを復元しましょう。 ###
  • 首先调用createRange函数,传入参数10,但是for值执行了一次然后停止了,并且告诉foreach第一次循环可以用的值。

  • foreach开始对$result循环,进来首先sleep(1),然后开始使用for给的一个值执行输出。

  • foreach准备第二次循环,开始第二次循环之前,它向for循环又请求了一次。

  • for循环于是又执行了一次,将生成的时间戳告诉foreach.

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

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

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

概念理解

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

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

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

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

实际开发应用

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

读取超大文件

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

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

我们创建一个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;;
}


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

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

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

总结

您可能感兴趣的文章:

Laravel框架中composer自动加载的实现详解

PHP服务端环境搭建的图文教程

php实现希尔排序算法的方法讲解

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

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPの継続的な使用:その持久力の理由PHPの継続的な使用:その持久力の理由Apr 19, 2025 am 12:23 AM

まだ人気があるのは、使いやすさ、柔軟性、強力なエコシステムです。 1)使いやすさとシンプルな構文により、初心者にとって最初の選択肢になります。 2)Web開発、HTTP要求とデータベースとの優れた相互作用と密接に統合されています。 3)巨大なエコシステムは、豊富なツールとライブラリを提供します。 4)アクティブなコミュニティとオープンソースの性質は、それらを新しいニーズとテクノロジーの傾向に適応させます。

PHPおよびPython:類似点と相違点を調査しますPHPおよびPython:類似点と相違点を調査しますApr 19, 2025 am 12:21 AM

PHPとPythonはどちらも、Web開発、データ処理、自動化タスクで広く使用されている高レベルのプログラミング言語です。 1.PHPは、ダイナミックウェブサイトとコンテンツ管理システムの構築によく使用されますが、PythonはWebフレームワークとデータサイエンスの構築に使用されることがよくあります。 2.PHPはエコーを使用してコンテンツを出力し、Pythonは印刷を使用します。 3.両方ともオブジェクト指向プログラミングをサポートしますが、構文とキーワードは異なります。 4。PHPは弱いタイプの変換をサポートしますが、Pythonはより厳しくなります。 5. PHPパフォーマンスの最適化には、Opcacheおよび非同期プログラミングの使用が含まれますが、PythonはCprofileおよび非同期プログラミングを使用します。

PHPおよびPython:さまざまなパラダイムが説明されていますPHPおよびPython:さまざまなパラダイムが説明されていますApr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPython:彼らの歴史を深く掘り下げますPHPとPython:彼らの歴史を深く掘り下げますApr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPとPythonの選択:ガイドPHPとPythonの選択:ガイドApr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPとフレームワーク:言語の近代化PHPとフレームワーク:言語の近代化Apr 18, 2025 am 12:14 AM

PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

PHPの影響:Web開発などPHPの影響:Web開発などApr 18, 2025 am 12:10 AM

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?Apr 17, 2025 am 12:25 AM

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

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

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境