ホームページ バックエンド開発 PHPチュートリアル PHPアプリケーションの最適化実践_PHPチュートリアル

PHPアプリケーションの最適化実践_PHPチュートリアル

Jul 13, 2016 pm 05:53 PM
php 最適化 練習する 使用 まだ 合格

最近、以前に行った最適化手法を見直したところ、いくつかの一般的な最適化手法が依然として再利用できることがわかりました。システムを長期間稼働させると、常に何らかの問題やボトルネックが発生します。問題が発生するのは怖いことではありません。問題を特定することに他なりません。 ;問題の分析 -> 解決策の提案 -> 実践 -> 結果のフィードバック -> 要約して最適化します。
問題の内容: PHP5 + Zend フレームワークを使用してシステムを開発したため、データ規模とアクセス量が増加(数千万件)した後、バックグラウンドの Apache サーバーの負荷が高くなりすぎました。毎日午後 10 時以降(特に金曜日)、マシンの CPU 負荷が 170 以上に急増します。CPU 負荷が高いと、それに応じてリクエストの処理が遅くなるため、この問題を早急に解決する必要があります。
問題の分析: 数日間の観察と分析の結果、CPU 使用率が 100% に達すると、システムの CPU 使用率が大きな割合を占め、ユーザーの CPU 使用率はそれほど高くありません。また、フロントエンドの haproxy とイカのキャッシュもそれほど高くありません。 CPU 負荷は非常に低く、memcached と Squid のヒット率は通常約 60% に達します。
バックエンドのアクセス ログを分析すると、リクエストされたユーザー エージェントの大部分が検索クローラーであることがわかりました。
同時に、xdebug が Apache 上で構成され、アイドル期間中にメイン ページで一連のパフォーマンス データが測定されました。測定されたデータは kcachegrind (xdebug の構成方法。soso で検索できます) を使用して分析され、次のことがわかりました。
パフォーマンス データは十分に安定しておらず、テスト データは同じリクエスト間で大きく異なります
遅いポイントほど点在しています
ほとんどの場合、memcached へのアクセスは比較的遅い (100 ミリ秒以上)
解決策 上記の予備分析を通じて、既存の手順に一連の調整が徐々に加えられました。
最初に考慮すべきことは、フロントエンドの Squid キャッシュのヒット率を高め、それによって Squid を通過してバックエンドの Apache に到達するリクエストの数を減らす方法を見つけることができるかどうかです。
かなりの数のリクエストが Crawler から発信されていることを考慮して、以前は Squid キャッシュは言語 Cookie が設定されたリクエストのみをキャッシュし、Crawler からのリクエストには Cookie 情報がありませんでした。そこで、Crawler からのすべてのリクエストを zh_CN の言語にデフォルト設定してから、haproxy の設定を変更して、User-Agent を使用した共通の Crawler からのすべてのリクエストを Squid キャッシュに転送することを考えました。
PHPコードを変更し、一部のページのキャッシュ時間を長く設定します
上記の 2 つの手順の後、Apache に到着するリクエストの数は確かに減少しましたが、過剰な CPU 負荷の問題はほとんど解決されないため、別の方法を探しました。
次に、xdebug プロファイリングを使用した結果によると、memcached との対話には長い時間がかかるため、memcached がリクエストに速く応答できるようにして、各リクエストをより速く完了して同時実行性を減らす方法を見つけられないかと思います。
コード分​​析の結果、オンラインの memcached は poll() を使用しており、混雑時でも memcached の接続数は約 1,000 のままであり、memcached の CPU 使用率は約 30% であることがわかりました。明らかに、多数の同時接続を処理する場合、poll() メソッドは非常に非効率的です。そこで、epoll() を使用してリクエストを処理するように memcached を再コンパイルしました。epoll に置き換えた後、memcached の CPU 使用率は約 30% から約 10 倍の約 3% に減少しました。
また、memcached のヒット率はそれほど高くなく、スワップアウトされるアイテムの数も比較的多いため、当初は手動でキャッシュの内容をパーティション分割する予定でしたが、後で判明しました。 PHP の最新の memcache 拡張機能は、キャッシュベースのパーティショニングをサポートしており、キーは自動的にパーティショニングされ、プログラム コードを変更せずに新しい memcached インスタンスを追加できます (構成ファイルを変更する必要があります:-))。そこで、各 Apache の php memcache 拡張機能をアップグレードし、新しい memcached を設定ファイルに追加しました。これで memcached のコンテンツ パーティションが完成しました。変更後の効果はより顕著で、ページの読み込み時間は変更前に比べて大幅に短くなります。
この 2 段階の調整の後、memcached の効率は以前よりも向上しましたが、Apache の負荷は依然として高いため、他の解決策を考えるしかありません。 さらに詳細な分析では、メイン システムの CPU 使用率が非常に高いと述べました。その理由を見つけるには、カーネルを深く掘り下げるしかありません:) ここから、strace の旅が始まります。ナイキの広告スローガンを言い換えると: Just strace it!
Strace は、次の方法を使用してピーク時間中に httpd プロセスで実行されました
strace -p PID -c で概要が得られます
strace -p PID -o Output.log ファイルに書き込んでゆっくり勉強してください
strace -p PID -e trace=file ファイルシステム操作に関連する syscall のみを確認します
strace -p PID -elstat64,stat64,open,getcwd はこれらの syscall のみをトレースします

上記の strace 分析から、次の結論が導き出されます:
lstat64、stat64、openなど、たくさんのシステムコールがあります
上記のシステムコールにはかなりの時間がかかります。 6割以上の時間は彼らに奪われますorz
システムコールの大部分は失敗しますが、実際には失敗が繰り返されるケースです
上記のデータにより、これらの無意味なシステム コールがどこから来たのかを突き止めるという問題の方向性がわかりました。
分析後、PHP は特定のクラスをロードしたいときに、include_path で定義された一連のディレクトリ内でそのクラスに対応するファイルを検索し、見つかるまで各ディレクトリを試します。この方法は明らかに非効率的ですが、これを達成するためのより良い方法はあるでしょうか?答えは「はい、あります!」です。そして、方法は複数あります!
require_once() を呼び出すときは、パラメータとして絶対パスを記述します (Zend Framework を作成する人は最初これを理解していませんでした。後で更新されました))
__autoload() を使用してクラスを遅延ロードします。これは、使用されるすべてのクラス ファイルを require_once するのではなく、本当に必要な場合にのみロードされることを意味します。
問題は見つかりましたが、解決すべき問題はまだあります。開発中にコード内での絶対パスの使用に注意してください。改善できる唯一のことは、これを遅延読み込みに変更することです。ただし、Zend Framework の多数の require_once は相対パスを使用しており、これが問題の原因です。この記事で取り上げているのは、過剰な問題の根本的な原因です。
さて、問題が見つかったので、解決しましょう。クラス -> ファイル パスの対応を自動的に生成するスクリプトを作成し、コード内のすべてのクラスと Zend Framework のすべてのクラスの間の対応ファイルを生成します。コードおよび Zend Framework ライブラリ内のすべての require_once をコメント アウトします。その後、本番稼働前に詳細なテストを実施します。結果は驚くべきもので、負荷は 3 以内に減少しました。 !問題が解決しました。
概要:
コードを書く人なら誰でも、問題が発生する可能性のある場所には常に問題が存在することを知っています (たとえそれがまだ見つかっていなくても) 根本から解決することが最善の方法です。どのような問題が解決されるのか、このアイデアとツールの上手な使い方を皆さんに学んでいただければと思います。はい、この件についてはこれで終わりです。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478024.html技術記事最近、以前に行った最適化手法を見直したところ、いくつかの一般的な最適化手法が依然として再利用できることがわかりました。システムを長期間実行すると、必ず何らかの問題やボトルネックが発生します...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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 にアップグレードする方法について説明します。

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 は、

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles