4

すべての重要な関数を 1 つの PHP ファイルに入れるようにコードを設計しました。このファイルは現在 1800 行の長さです。

他の PHP ファイル (たとえば、AJAX プロセッサ) では、単純な "require_once("codeBank.php")" を使用して呼び出します。

いくつかのグローバル配列と関連する他の関数の束しか持っていないにもかかわらず、これらすべての関数をロードするのに約 10 秒かかることがわかっています。たとえば、メインの AJAX プロセッサ コードは、単純な構文検証を実行するだけで 8 秒かかります (その操作関数は codeBank.php に格納されています)。

require_once をコメントアウトすると、AJAX の応答時間が 10 秒から 40 ミリ秒に短縮されます。PHP が 1800 行の関数を使用して何かを実行しようとしていることは明らかです。それは驚くべきことに、APC をインストールした状態でも同じです。

コード速度を 100 ミリ秒未満のレベルに戻すにはどうすればよいですか? どういうわけかキャッシュの利点を得ることができていませんか? その単一の機能バンク ファイルを別の部分に分割する必要がありますか? 応答時間を台無しにするために私ができる他の微妙なことはありますか?

または、それ以外に、どの PHP 操作がスピード バンプにぶつかっているのかをさらに掘り下げるツールは何ですか?

==========================

【追記】解決しました。

==========================

多くの親切な人々が指摘しているように、1800 行の php 関数ライブラリを使用するだけで速度が低下する論理的な理由はありません。実際に起こっていたのは、長い API 呼び出し関数の 1 つを呼び出すデバッグ行があったことです。PHP ファイルをインクルードするときはいつでも、リモートのクエリ データからデータ構造全体を構築していました。

その行を削除すると、すべてが 30 ミリ秒の素早い応答に戻りました。私にとって奇妙なのは、AJAX スクリプトが呼び出されるたびに require_once() が php ファイルを開くことです。しかし、それは私が体調を崩していて、AJAXスクリプトが終了するたびに閉じて、毎回再度開いて再コンパイルしていることを忘れている.

4

6 に答える 6

6

100,000 行のコードを含むファイルを作成しても、読み込みに 10 秒もかからないはずです。

おそらく、実行されていることに気付いていない初期化コードがいくつかあります。プロファイラー (xdebug または Zend Studio のプロファイラー) を見て、最適化の道をたどる前に速度低下の原因を正確に突き止めてください。単純にファイルが 1800 行あるからだと思うなら、あなたは間違った方向に進んでいます。

于 2010-05-05T01:24:11.950 に答える
1

そこに sleep() 関数がないことを確認してください:)また、apcがファイルをキャッシュしているときにまだ遅い場合は、apcを使用してファイルをキャッシュします。問題は別の場所にあります。20,000 行のファイルを問題なく含めました。

于 2010-05-05T01:26:42.387 に答える
0

関数を小さなファイルにグループ化し、オンデマンドでロードできますか?

それらはグローバル関数またはクラスですか、おそらく静的メソッドを使用していますか?

もしそうなら、PHP のオートローディングの恩恵を受けることができます。__autoload()を調べるか、より柔軟なソリューションについては、 を参照してくださいspl_autoload_register()

于 2010-05-05T01:22:13.963 に答える
0

とにかく、そのファイルを確実に分割します。コードベースをより整理することで得られる生産性の向上は、それだけの価値があります。

于 2010-05-05T01:22:37.010 に答える
0

インクルード (1800 行でさえ) がそれほど遅くなる可能性があることは非常に驚くべきことです。まず、コードを調べて、不要な処理が実行されていないことを確認する必要があります。実際にファイルを解析することは、そのようなボトルネックになるべきではありません。

そうは言っても、インクルードは多くの PHP プログラムの主要なボトルネックの 1 つです。コードをいくつかの小さなファイルにリファクタリングするか (必要なものだけを含める)、または (おそらくはるかに簡単に) PHP の__autoload関数を使用することを検討できます。これは、存在しないクラスを参照するたびに自動的に呼び出される関数であるため、関数を静的クラスに配置する必要があります。例えば:

// include/ajaxlib.php
class AjaxLib {
    public static function renderResponse($data) {
        // whatever
    }
}

// a common include file:
function __autoload($class) {
    require 'include/' . strtolower($class) . '.php';
}

// your code:
AjaxLib::renderResponse($foo);
于 2010-05-05T01:26:17.707 に答える
0

1800 行のファイルが問題になるとは考えられません。すべてのページに含める多くのクラスの 1 つだけで、1870 行しかありません。問題が発生することはありません。含めているファイルにファイルまたはネットワークアクセスがありますか?

于 2010-05-05T01:27:49.110 に答える