27

Mys サイトの動作が非常に遅い (その理由がまったくわかりませんでした)。これは Zend アプリケーションに基づいており、私はそのようなサイトを数十ほど作成していたので、私のコードは問題ないと確信しています。

サーバーに xdebugger をインストールし、プロファイリングを試みて、何を推測しましたか? php::session_start() には 48.675 秒かかりました。48.5秒!信じられない!この理由は何でしょうか?これは一般的な操作ですが、なぜそんなに長く実行できるのでしょうか? このような動作を修正するには、どの構成を編集すればよいですか? Googleで検索しましたが、良い答えが見つかりませんでした(ほとんどどこにでも質問がありますが、答えはありません). 前にありがとう!

xdebugger プロファイリング結果

4

9 に答える 9

24

session_start(セッションがファイルに保存されている場合)PHPでブロックされているため、同じブラウザセッション(AJAXまたは複数のブラウザタブ/ウィンドウ)に対して複数のサーバーセッションを開始しようとすると、この問題が発生します。それぞれsession_startが他のセッションが閉じられるまで待機します。

ここを参照してください:http://konrness.com/php5/how-to-prevent-blocking-php-requests/

セッションのファイルからデータベースストレージに変更してみてください。

于 2013-03-07T07:39:27.390 に答える
19

session_start()私の推測では、ネイティブ関数内で実行されるガベージコレクションルーチンです。最大寿命を変更するなど、多くの古いセッションファイルを保持する何かをしたことがありますか?または、データベースに保存するのは良い考えだと思ったのに、適切なインデックスを作成するのを忘れたのではないでしょうか。ネイティブGCルーチンstat()は、有効期限をチェックするためのすべてのセッションファイルです。大量のファイルが作成されている場合、これには時間がかかります。

編集:デバッグのみに役立つように、 session.gc-probabilityを一時的に設定してガベージコレクションを無効にします。

session.gc-probability = 0

設定が固定されていることを確認してください。ここでzendフレームワークが何をしているのかわかりません。

PS原因を知らずに修正を提案することは困難です。私の答えは、原因を特定するためのガイドとなることを目的としています。

于 2012-12-07T22:38:22.643 に答える
7

私はこの問題を抱えていましたが、誰もこの特定の応答を投稿していないことに驚いています. そうではないかもしれませんが、チェックする価値はあります。

PHP は、ページの処理中にセッション ファイルをロックするため、そのページはそのページに排他的にアクセスできます。sess_184c9aciqoc ファイルはデータベースではないため、同じセッション内の 2 つの呼び出しで同時にアクセスすることはできません。そのため、ajax 呼び出しが多いと、「渋滞」が発生する可能性があります。高度なスクリプト作成を開始すると、これは注意が必要です。ちなみに、これはタイムスタンプの配列を格納する関数です。これを使用して、セッションの開始が原因であることがわかりました。

//time function for benchmarking
if( function_exists('gmicrotime')){
    function gmicrotime($n=''){
        #version 1.1, 2007-05-09
        //store array of all calls
        global $mT;
        list($usec, $sec) = explode(' ',microtime());
        if(!isset($mT['_base_']))$mT['_base_']=$sec;
    $t=round((float)$usec + (float)(substr($sec,-4)),6);
    $mT['all'][]=$t;
    if($n){
        if(isset($mT['indexed'][$n])){
            //store repeated calls with same index.  If in a loop, add a $i if needed
            if(is_array($mT['indexed'][$n])){
                $mT['indexed'][$n][]=$t;
            }else{
                $mT['indexed'][$n]=array($mT['indexed'][$n],$t);
            }
        }else $mT['indexed'][$n]=$t;    
    }
    //return elapsed since last call (in the local array)
    $u=$mT['all'];
    if(count($u)>1){
        $mT['_total_']=$u[count($u)-1] - $u[0];
        return round(1000*($u[count($u)-1]-$u[count($u)-2]),6);
    }
}
gmicrotime('pageStart');
}

次に、次のように呼び出します。

gmicrotime('beforeSessionStart');
session_start();
gmicrotime('afterSessionStart');

do_something_slow();
gmicrotime('afterSlowProcess');
//etc..
echo '<pre>';
print_r($mT);  

これが役に立てば幸いです!

于 2014-08-31T03:27:19.647 に答える
2

memory_limit別の方法として、PHP.iniで大きな値を設定している可能性があります。

巨大な mysql ダンプを PHPMyAdmin にアップロードすると、ロード時間が急上昇しました。おそらく (上記のように)、PHP に余裕ができたため、多くのセッション ファイルが積み重なってしまいました。デフォルトは128Mだと思います。私はそれを4倍にしていました。

于 2014-04-09T19:22:03.067 に答える
0

私の場合、memcache サーバーの設定が正しくありませんでした。memcache のプロパティに関する情報と、memcacheでストレージをセットアップする方法を次に/etc/php.d/memcached.ini 示します。

于 2016-10-05T10:56:49.167 に答える
0

私のページは、多数の <img src="download_image.php"> タグ内で同時セッションを開きます。ここで、download_image.php は session_start() を実行し、イメージをダウンロードします。

download_image.php に session_write_close() を挿入すると、問題が解決しました。

session_start();

session_write_close(); 

download_image();

memcached と session_start(['read_and_close'=>true]) を試しました。しかし、私にとっては session_write_close() だけが機能します。

于 2021-01-21T07:21:47.047 に答える
0

同じページに複数の同時 ajax 呼び出しがある場合、この状況が問題を引き起こす可能性があります。

于 2016-04-05T18:39:03.017 に答える