1

MySQL のプロセス/接続がどのように機能するかを理解しようとする必要があります。私はグーグルで検索しましたが、素人の言葉で何も表示されないので、ここで質問しています。これが状況です。

私たちのホストは、「MySQL プロセスが多すぎる」と嘆いています。私たちは共有サーバーにいます。サーバーの mySQL プロセスの .2 が許可されており、これは 50 接続であると彼らは主張していますが、.56 を使用していると彼らは言います。

技術サポート担当者から:

「MySQL proc の数 (平均) - 0.59 は、共有サーバーで利用可能な MySQL 接続の合計の 0.59% を使用していたことを意味します。許容値は 0.20、つまり 50 接続です。」

実行しているものは次のとおりです。

Zen Cart:           1.5.1  35K products. Auto updating of 1-20
                           products every 10 hours via cron.  
PHP version         5.3.16  
MySQL version       5.1.62-cll  
Architecture        i686  
Operating system    linux 

通常、サイトには 1 日あたり約 5000 のヒットがあり、Google ウェブマスター ツールでクロール レートを最小に設定しているにもかかわらず、Google ボットは頻繁にアクセスします。

このホストが話していることに関して、誰かが MySQL プロセスを説明してくれることを願っています。彼らに尋ねるたびに、あいまいで不明確な難読化された答えが返ってきます。訪問者がサイトにアクセスするたびに、新しい MySQL プロセスが作成されますか? それは正しくないようです。

技術によると、その時点で 150 の接続を使用していました。

編集:これがzencartの接続機能です

  function connect($zf_host, $zf_user, $zf_password, $zf_database, $zf_pconnect = 'false', $zp_real = false) {
$this->database = $zf_database;
$this->user = $zf_user;
$this->host = $zf_host;
$this->password = $zf_password;
$this->pConnect = $zf_pconnect;
$this->real = $zp_real;
if (!function_exists('mysql_connect')) die ('Call to undefined function: mysql_connect().  Please install the MySQL Connector for PHP');
$connectionRetry = 10;
while (!isset($this->link) || ($this->link == FALSE && $connectionRetry !=0) )
{
  $this->link = @mysql_connect($zf_host, $zf_user, $zf_password, true);
  $connectionRetry--;
}
if ($this->link) {
  if (@mysql_select_db($zf_database, $this->link)) {
    if (defined('DB_CHARSET') && version_compare(@mysql_get_server_info(), '4.1.0', '>=')) {
      @mysql_query("SET NAMES '" . DB_CHARSET . "'", $this->link);
      if (function_exists('mysql_set_charset')) {
        @mysql_set_charset(DB_CHARSET, $this->link);
      } else {
        @mysql_query("SET CHARACTER SET '" . DB_CHARSET . "'", $this->link);
      }
    }
    $this->db_connected = true;
    if (getenv('TZ') && !defined('DISABLE_MYSQL_TZ_SET')) @mysql_query("SET time_zone = '" . substr_replace(date("O"),":",-2,0) . "'", $this->link);
    return true;
  } else {
    $this->set_error(mysql_errno(),mysql_error(), $zp_real);
    return false;
  }
} else {
  $this->set_error(mysql_errno(),mysql_error(), $zp_real);
  return false;
}
4

1 に答える 1

1

接続プールに問題があるのではないかと思います。この行を変更してみてください:

$this->link = @mysql_connect($zf_host, $zf_user, $zf_password, true);

これに:

$this->link = @mysql_connect($zf_host, $zf_user, $zf_password);

マニュアルはここで役立ちます-4番目のパラメータはデフォルトでfalseですが、コードはそれをtrueに強制します。これにより、既存の接続がすでに開いている場合でも新しい接続が作成されます(これは接続プールと呼ばれ、不必要に新しい接続を作成する手間を省きます。時間とメモリの両方を節約します)。

ただし、注意点があります。サードパーティシステムのコアコードの変更は、常に慎重に行う必要があります。彼らが選んだ振る舞いには理由があるかもしれませんが、コメントの仕方はあまりわかりませんサポートチャネルを介して質問する価値があるかもしれません。なぜそれがこのように機能するのか、そして彼らがそれを変更することを検討するのかどうかを確認するためです。

于 2013-01-19T23:49:24.653 に答える