ホームページ > バックエンド開発 > PHPチュートリアル > PHP_PHP チュートリアルでの Sphinx の長い接続の問題の簡単な分析

PHP_PHP チュートリアルでの Sphinx の長い接続の問題の簡単な分析

WBOY
リリース: 2016-07-13 10:47:00
オリジナル
847 人が閲覧しました

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 スクリプトの実行をトレースすることに注意してください。システム コール情報を収集すると、次のことがわかります。

システムコールには192.168.1.108への接続要求が2つあります。つまり、open メソッドが呼び出されない場合、sphinx への 2 つの TCP リクエストが同じ 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

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632903.html技術記事 Sphinx については、ここでは大家可決を一切介さずに、次は PHP における Sphinx の接続問題の解析について説明します。これらの文章は各位の友友に役立つと思われます。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート