Sphinx とは何かをここで紹介しました。Baidu で確認できます。次に、PHP での Sphinx の長い接続の問題の分析を紹介します。この記事が皆さんのお役に立てれば幸いです。
SphinxClient::open
(PECL スフィンクス >= 1.0.3)
SphinxClient::open — 検索サーバーへの永続的な接続を確立します
手順
public bool SphinxClient::open (void)
検索サーバーへの永続的な接続を確立します。
パラメータ
この関数にはパラメータがありません。
戻り値
成功した場合は TRUE を返し、失敗した場合は FALSE を返します。
今日、PHP システム コードを最適化しているときに、sphinx の長い接続を分析したところ、php の sphinx API は、fastcgi 内の sphinx の searchd プロセスとの長い接続を常に維持していることがわかりました。 php-fpm の状態 API インターフェイスの open() メソッドは、複数の sphinx 呼び出しが単一の php プロセスで sphinx tcp 接続チャネルを共有するようにするためのセッション リクエストのみを提供します。php の解釈が完了すると、sphinx への接続が確立されます。接続を維持するのではなく、自動的に切断されます。
この投稿は元の投稿者のアイデアもサポートしています: http://sphinxsearch.com/forum/view.html?id=7200
>Sphinxにおける「永続的接続」の定義は違うようです
> PhP API を使用する場合の永続的な MySql 接続: 永続性は全体にのみ適用されます
> *同じ PHP リクエスト実行内* での複数の呼び出し、クライアント内での永続化ではない
> 複数の PHP リクエストにわたるプロセス
私の主張を証明するために、次のような実験を行うことができます:
sphinx.so 拡張機能を php に追加し、次のテスト コードを記述します:
$s = 新しい SphinxClient();
var_dump($s);
$s->setServer('192.168.1.108','9312');
//$s->open();
var_dump($s->query('abxxxx'));
var_dump($s->query('abxxxx'));
$s->open() が最初にブロックされ、次に strace コマンドを使用して cli 状態でのこの php スクリプトの実行をトレースすることに注意してください。システム コール情報を収集すると、次のことがわかります。
611 fcntl64(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
612 connect(3, {sa_family=AF_INET, sin_port=htons(9312), sin_addr=inet_addr("192.168.1.108")}, 16) = -1 EINPROGRESS (操作は進行中)
613 select(4, NULL, [3], NULL, {60, 0}) = 1 (out [3], left {59, 999996})
614 fcntl64(3, F_SETFL, O_RDONLY) = 0
615 send(3, "1", 4, MSG_NOSIGNAL) = 4
616 recv(3, "1", 4, 0) = 4
617 send(3, "1312241", 16, MSG_NOSIGNAL) = 16
618 send(3, "246abxx"..., 140, MSG_NOSIGNAL) = 140
619 recv(3, "131`", 8, 0) = 8
620recv(3, "25title4text2"..., 96, 0) = 96
621 閉じる(3)
。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。
。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。
756 ソケット(PF_INET、SOCK_STREAM、IPPROTO_IP) = 3
757 fcntl64(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
758 connect(3, {sa_family=AF_INET, sin_port=htons(9312), sin_addr=inet_addr("192.168.1.108")}, 16) = -1 EINPROGRESS (操作は進行中)
759 select(4, NULL, [3], NULL, {60, 0}) = 1 (out [3], left {59, 999997})
760 fcntl64(3, F_SETFL, O_RDONLY) = 0
761 send(3, "1", 4, MSG_NOSIGNAL) = 4
762recv(3, "1", 4, 0) = 4
763 send(3, "1312241", 16, MSG_NOSIGNAL) = 16
764 send(3, "246abxx"..., 140, MSG_NOSIGNAL) = 140
765recv(3, "131`", 8, 0) = 8
766 recv(3, "25title4text2"..., 96, 0) = 96
767 閉じる(3)
768 write(1, "array(9) {n", 11array(9) {
次に、open 呼び出しのコメントを解除して strace を続行すると、クエリ メソッドが引き続き 2 回呼び出されていることがわかりますが、最初のクエリ呼び出しの後、API はすぐに TCP 接続を閉じず、2 番目のクエリを実行し続けます。利用するには電話してください。
611 fcntl64(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
612 connect(3, {sa_family=AF_INET, sin_port=htons(9312), sin_addr=inet_addr("192.168.1.108")}, 16) = -1 EINPROGRESS (操作は進行中)
613 select(4, NULL, [3], NULL, {60, 0}) = 1 (out [3]、左 {59, 999996})
614 fcntl64(3, F_SETFL, O_RDONLY) = 0
615 send(3, "1", 4, MSG_NOSIGNAL) = 4
616recv(3, "1", 4, 0) = 4
617 send(3, "441", 12, MSG_NOSIGNAL) = 12
618 select(4, [3], NULL, [3], {0, 0}) = 0 (タイムアウト)
619 send(3, "1312241", 16, MSG_NOSIGNAL) = 16
620 send(3, "246abxx"..., 140, MSG_NOSIGNAL) = 140
621recv(3, "131`", 8, 0) = 8
622recv(3, "25title4text2"..., 96, 0) = 96
623 write(1, "array(9) {n", 11array(9) {
624 ) = 11