4

私はphp5.4.4を使用していますが、 mysqliとの持続的接続が機能しないようです。特に、このスクリプトを見てみましょう。

<?php

$links = array();

for ($i = 0; $i < 15; $i++) {
    $links[] =  mysqli_connect('p:192.168.1.40', 'USER', 'PWD', 'DB', 3306);
}

sleep(15);

次に、スクリプトの実行中に、別のシェルを開いて次の手順を実行します。

netstat -an | grep 192.168.1.40:3306
tcp        0      0 192.168.1.6:52441       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52454       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52445       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52443       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52446       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52449       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52452       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52442       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52450       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52448       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52440       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52447       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52444       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52451       192.168.1.40:3306       ESTABLISHED
tcp        0      0 192.168.1.6:52453       192.168.1.40:3306       ESTABLISHED

これはエラーだと思います。PHPは15の異なる接続ではなく、1つの永続的な接続のみを開く必要があります。

それは本当ですか?

皆さんありがとう。

4

3 に答える 3

4

あなたは間違った場所で利益を探しています。永続的な接続を使用しても、テストのように単一の php スクリプトの実行には役立ちません。一連のリクエストに役立ちます。

mysqli に永続的な接続を確立するように要求すると、mysqli は、接続の詳細 (ユーザー名/パスワード/その他)と一致し、使用されていない確立済みの接続のプールを調べます。 あなたのループは15 の接続を使用するように要求し、 15 の接続を取得します。各接続はスレッド専用です。

スレッドが閉じると、netstat に 15 個の接続がリストされているはずです。

スクリプトを再度実行すると、一覧表示された接続に変化がないことがわかります (つまり、新しい接続は作成されていません)。ここで利点が生まれます。後でスクリプトを実行するときに、接続を確立するためのオーバーヘッドを節約できます。

より良いテストは、最初のリクエストで 100 の永続的な接続を作成する実行のタイミングを計ってから、同じリクエストを再実行することです。これは、100 の新しい接続を作成する必要がないため、高速になるはずです。

于 2013-05-17T13:07:29.567 に答える
0

これは、PHP を実行しているサーバー API が PHP を実行するための複数の親プロセスを作成する場合に意味があります。

たとえば、FastCGI を使用していて、15 のプロセスを持つように構成し、各プロセスに 50 の子があるとします。任意の時点で最大 15 の永続的な接続 (プロセスごとに 1 つ) と、それぞれの 50 の子のそれぞれを持つことができます。プロセスは、親プロセスからの 1 つの永続リンクを使用します。

Apache では、StartServersディレクティブが関連していると思います。実行中の子サーバー プロセスごとに、それぞれの親からの永続的なリンクを使用するThreadsPerChildスレッドが実行されています。

私の推測では、Apache を使用している場合、15 の子プロセスが実行されており、それぞれに独自のスレッドがあると思います。そのため、15 の永続的な接続が表示されます。

それが役立つことを願っています。

于 2012-07-25T21:48:02.137 に答える