5

session_start()プライマリサーバーで問題が発生しました。初めてページを読み込んだとき、リクエストが完了するまでに1秒もかかりません。約12〜15秒待ってからページをリロードすると、ロード時間は同じになります。しかし、たとえば、最初の読み込みから3秒または5秒後にページを更新しようとすると、サーバーの応答時間は10秒になります。

スクリプトのボトルネックを定義するためにいくつかのテストを行ったところ、その関数session_start()が9.8秒間実行されることがわかりました。PEARパッケージHTTP_Session2を使用しています。コードスニペットは次のとおりです。

HTTP_Session2::useCookies(SESSION_USE_COOKIE);
/* Next line was added to make logging of execution time possible. */
self::writeToFile('HTTP_useCookies(1) -> '.self::getWorkTime()); 
HTTP_Session2::start("SID");
self::writeToFile('HTTP_start(2) -> '.self::getWorkTime());
HTTP_Session2::setExpire(time() + SESSION_EXPIRE);
self::writeToFile('HTTP_setExpire(3) -> '.self::getWorkTime());

ログのテキスト:

//First loading (13:34:35)
HTTP_useCookies(1) -> 0.00038
HTTP_start(2) -> 0.00077
HTTP_setExpire(3) -> 0.00090

// Second loading (13:34:39)(4 seconds later)
HTTP_useCookies(1) -> 0.00029
HTTP_start(2) -> <<<<<< 10.80752 >>>>>
HTTP_setExpire(3) -> <<<<<< 10.80780 >>>>>

//Third loading (13:34:56)
HTTP_useCookies(1) -> 0.00041
HTTP_start(2) -> 0.00071
HTTP_setExpire(3) -> 0.00083

だから私は、その問題はHTTP_Session2::start()関数にあることを発見しました。関数のコードHTTP_Session2::start()

public function start($name = 'SessionID', $id = null)
{
  self::name($name);
  if (is_null(self::detectID())) {
    if ($id) {
      self::id($id);
    } else {
      self::id(uniqid(dechex(rand())));
    }
  }
  session_start();
  if (!isset($_SESSION['__HTTP_Session2_Info'])) {
    $_SESSION['__HTTP_Session2_Info'] = self::STARTED;
  } else {
    $_SESSION['__HTTP_Session2_Info'] = self::CONTINUED;
  }
}

時間遅延の原因がわかりません。おそらく、サーバーに間違ったApache設定があります。または、セッション情報を含むファイルにいくつかの「ロック」がある可能性があります。

たぶん、誰かがすでにそのような問題に遭遇していて、それを解決するのを手伝うことができます。

4

1 に答える 1

14

PHPがリクエストを処理している間、セッションの情報を含むファイルはロックされます。

したがって、現在実行中のPHPスクリプトが1つあり(セッションを使用)、同じユーザーが別のリクエストを送信した場合、2番目のリクエストは最初のリクエストが終了するまで待機します。

于 2009-12-16T12:04:57.557 に答える