記事「PHPアプリケーションの最適な最適化」に対するコメント

こんにちは



HabrahabrがこのメッセージをPHP最適化に関するmocksoulトピックに関するコメントとして許可していないのは奇妙です: www.habrahabr.ru/blog/webdev/19129.html おそらく長すぎる。 :)







私が望んだことすべてを、私はあなたに手紙を書きましたが、コミュニティはそれを興味深く有用だと思うかもしれません、そして私は自分自身のいくつかの間違いを見つけ、おそらく存在する知識のギャップを埋めます。



1.「一般に、私が新しいプロジェクトを行っていたとき-目標がありました-怪しげなCeleron 2.6GHzで毎秒少なくとも50クエリ」。 :)目標は、ビジネス要件の実装です。 1秒あたりのリクエスト数はシステム要件の問題ですが、最も重要なものとはほど遠いものです。 企業は、このような奇跡を起こすことができるプログラマーを毎月1〜2千人探して(1か月に1〜2千)支払うよりも、数台のサーバーに5〜1万ドルを費やす方がはるかに簡単です。 :)ごめんなさい。



2.「LigHTTPd。 Linuxの下。 sys-epollをオンにします。」equeueには、kqueueの前に重大な欠陥があります。 このプロセスの欠如、AIOおよびタイマー監視、およびアトミックイベントのみのサポート。 私が理解しているように、Linuxは「それが起こった」という事実に基づいて選ばれましたか?



3.「PHP5。 FastCGIを介して。 ab -n 100000 -c(PHP_FCGI_CHILDREN + 1) localhostを実行することで確認できます。 そのような影響を受けない実装があることを認めます。 あなたが知っているなら、私は感謝します。



4.「 '--with-gdbm'」。 他の--withなしと比較すると、gdbmを含むことは、アイデアというよりは間違いのようです。 または使用しますか? これは、古いデータをshmに保存するための非常に優れたソリューションです。



5.「 '--without-mysqli'」。 >:oしかし、プリペアドステートメント、マルチクエリはどうでしょうか?



6.“ PHP_FCGI_CHILDREN” =>“ 32”私は長い間、レガシーシステムの経験があり、コードがひどく、10台の並列クライアントでかなり高価なサーバーが構築されました。 追加のメモリスティックをすばやく購入することで保存されました:)、PHP_FCGI_CHILDRENをそこで許容される最大値(256)に増やしました。その後、システムが再設計され、書き直され、プールが32に削減されました。



7.「ストリームを強制終了し、n番目のリクエストで新しいストリームを作成してください」-この値の計算は非常に簡単です。 FCGI(ポーリングを使用)でアフィニティが発生すると考える場合、最も成功するオプションは、キープアライブ内で1つのクライアントに完全にサービスを提供してから再起動することです。 ヒット数をphpで取得し、ホスト数で割ってphpの開始/訪問の平均値を取得し、「マジック」回数だけ増やします。最初の偏差を吸収するには1.618を使用します。 通常、600-1100のオーダーのものが取得されます。



8.「すぐに何かをより合理的かつ迅速に行う方法についての考えを書き、頭の中でひねります。」いいえ、いいえ、いいえ! 作成し、何が機能するかを確認し、APD / Xdebugを実行して、治療が必要なものだけを処理します! テーブル内の同様に割り当てられたインデックス、キャッシュなど



9.「おそらくrequireとincludeを使用する必要はほとんどないでしょう。 主にrequire_onceとinclude_once。”これらは約3〜11倍遅くなります。 最適なオプションは、十分に文書化された接続マップです。 後で、もちろん、オペコードキャッシュはすべてのファイルを1つに収集しますが、最初の実行では悪くありません。



10.「phpでarray_ *関数を使用することを学ぶ。 特にラムダ関数»ラムダ関数の短所:可読性の低下、グローバル名前空間での各インスタンスの保存(例はカウント($ arr)インスタンスが作成された瞬間です)、コンパイル時のエラーをキャッチすることは不可能です。 これでもう十分です。



11.「foreach($キーとしてのarr =>&$ val){...}。」 これはもはや関係ありません。 memory_get_usage()を各反復に挿入することで確認できます。



12.「is_null()-ばかによって発明されました。」 また、 www.php.net / manual / en / types.comparisons.phpは PHP開発者によって考案されました。



13.「すべてが単純です-サーバーを所有している場合、永続的な接続を使用してください!」ignore_user_abort()/ register_shutdown_function()を使用しますか? 永続的な接続は非常に危険です! ロックアウトを取得するのは非常に簡単です。 代わりに、SQL Relay / pgpoll、または他のサードパーティの接続プールマネージャーを使用することをお勧めします。



14.「スクリプトは完全に不安定で、1つのプロジェクトでシャープになっています。」すべての依存関係を引き出し、スイッチに基づいてすべてを1つのファイルにノックし、エンコーダーに渡してプロダクションに保存するビルドマネージャーを実装しようとしました。 楽しかった。 これを再び使用するというアイデアを促してくれてありがとう。 :)



15.「my.cnfで、query_cache_size = 100Mと書き込みます。」 はい、ドックを読みます。 特にwww.mysqlperformanceblog.com/2007/03/23/beware-large-query_cache-sizes 。 原則として、100Mの平均負荷では比較的正常なキャッチが行われますが、32〜48Mに減らすと最終的なオーバーヘッドが減り、より重要な設定のメモリを節約できます。



16.「可能な限りすべてを保管してください。」 はい、楽しみのために、そこにttl 1秒で時間()を保存しました-要求密度が1秒あたり600を超えると、ゲインが得られます。 :)



17.「このためにファイルシステムでIOを使用しないでください。メモリの方が良いです。」システムの制限はメモリであることが非常に多くあります。 可能なすべてがすでに最適化されている場合、コードは単にプロセスの数に実行を開始します。 次に、メモリをめぐって戦い始めると、良いNASが状況を救うことができます-これは〜2000 Mbps(1秒あたり250M)であり、もちろん、メモリとは比べものになりませんが、悪くはありません。通常、メモリはここで必要です。



18.それでも、PHPの他の多くのarray_ *関数は、一般にforeachをスキルなしで実装するのが困難です。 例えば、ソート。「組み込みソート()-PHPで記述された関数の速度を追い越すための先例があります! :) sort()は、最も一般的なソリューションとしてクイックソートを実装しますが、特別な場合には、より高速なソートがあります。 たとえば、数値をソートする必要がある場合、または自然な場合。



面白い答えを期待しています。

記事をありがとう! :)






All Articles