php-MYsql5.6Memcacheの使用
ここでは本当に明白な何かが欠けているに違いないと思いますが、私がやろうとしているのは、MySQL 5.6を使用し、memcacheを介して値を返すことです
ここで、memcacheプラグインを使用するようにMYSQLを設定し、innodb_memcache.containersテーブルで詳細を設定しました
このテーブルには、MySQLによって入力されたデフォルトのアイテムと自分の設定の2つのアイテムがあり、どちらにもテーブル名があります。
php経由でデータを取得するには、次を使用します:
$memcache->get($key);
ここで、$keyはdb列のデータです
しかし、これは何も返しません。理由は、MySQL Docsによると、テーブル名が指定されていない場合、リストの最初の名前が選択されるためだと思います。これは、私が理解していないものです。キーに正しいテーブル名を指定する方法です。これにより、キーを検索するテーブルがわかります。
追加情報:
table design:
table: codes
id INT PK
code VARCHAR UNIQUE
codeval VARCHAR
innodb_memcache.containers :
name: mycode
db_schema: databaseName
db_table: codes
key_columns: code
value_columns: codeval
flags: id
cas_column: null
expire_time_column: null
unique_idx_name_on_key: code
コード:
$ table = "mycode";
$ key = "123456";
$memcache=新しいMemcache;
$ memcache-> connect($ this-> CONNECTURL、$ this-> CONNECTPORT)またはdie( "接続できませんでした");
$ version = $ memcache-> getVersion();
echo "サーバーのバージョン:"。$version。"
\ n";
$ key="@@"。 $table。 「。」 。 $key。 「。」 。 $ table;
$ get_result={-コード-1}
print_r($ get_result);
上記のコードはサーバーのバージョンを問題なく返すため、接続は機能しています。 print_r($ get_result)は、値を返す必要があるときに空白を返します
通知をスローします:非オブジェクトのプロパティを取得しようとしています
したがって、誰かが$ keyを使用して、memcacheを介してクエリを実行するために使用しているテーブルを指定する方法を教えていただければ幸いです。
答え :
解決策:
テーブル名( @@ table_id
のtable_id
)は値である必要がありますマッピング( innodb_memcache.containers
)からではなく、実際のテーブル名(異なる場合)から。
マッピングのテーブル名がmycode
の場合、 memcacheを介した結果のクエリは次のようになります。
$ table ='mycode';
$ key = '123456';
$ memcache-> get('@@'。$table。'。'。$key);
最後に余分な'.' . $table
はありません。
一部の詳細は、 InnoDB memcachedPluginのドキュメントページから入手できます。
ここで重要なことをいくつか挙げると:
select * from innodb_memcache.containers;
を使用して、定義されたマッピングを取得します;- クエリ構成に注意してください:
たとえば、@@t1.some_keyと@@t2.some_keyのキー値は同じです。 ただし、異なるテーブルに格納されるため、競合しないでください。
答え :
解決策:
差出人: http://dev.mysql.com/doc/refman/5.6/en/innodb-memcached-intro.html
名前空間:memcachedは単一の巨大なディレクトリのようなもので、ファイルが互いに競合しないようにするために、プレフィックスとサフィックスを付けた複雑な名前を付けることができます。統合されたInnoDB/memcachedサーバーでは、キーにこれらの同じ命名規則を1つ追加するだけで使用できます。 @@ table_id.key.table_id 形式のキー名は、 innodb_memcache.containers テーブルのマッピングデータを使用して、特定のテーブルを参照するようにデコードされます。キーは、指定されたテーブルで検索または書き込まれます。
@@表記は、get、add、およびset関数への個々の呼び出しに対してのみ機能し、incrやdeleteなどの他の呼び出しに対しては機能しません。セッション内の後続のすべてのmemcached操作のデフォルトテーブルを指定するには、@@表記とテーブルIDを使用して、キー部分を使用せずにgetリクエストを実行します。例:
get @@ table_x
後続のget、set、incr、delete、およびその他の操作では、 innodb_memcache.containers.name列のtable_xで指定されたテーブルを使用します。
答え :
解決策:
デフォルトのテーブルがまだある場合は、telnetを使用してみてください。
注:これはmemcachedを使用するAWS RDSインスタンスで使用されました。これは、memcachedを使用するすべてのMySQL実装で同じである必要があります が、わかりません。
telnet localhost 11211
stats
#=> should return a long list of stats including pid, uptime, etc
get AA
#=> should return
VALUE AA 8 12
HELLO, HELLO
END
quit #exit telnet session
これでは質問に答えられないことはわかっていますが、トラブルシューティングには役立つ可能性があります。
答え :
解決策:
<?php
$memc = new Memcache;
$memc->addServer('localhost','11211');
if(empty($_POST['film'])) {
?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Simple Memcache Lookup</title>
</head>
<body>
<form method="post">
<p><b>Film</b>: <input type="text" size="20" name="film"></p>
<input type="submit">
</form>
<hr/>
<?php
} else {
echo "Loading data...\n";
$film = htmlspecialchars($_POST['film'], ENT_QUOTES, 'UTF-8');
$mfilms = $memc->get($film);
if ($mfilms) {
printf("<p>Film data for %s loaded from memcache</p>", $mfilms['title']);
foreach (array_keys($mfilms) as $key) {
printf("<p><b>%s</b>: %s</p>", $key, $mfilms[$key]);
}
} else {
$mysqli = mysqli('localhost','sakila','password','sakila');
if (mysqli_connect_error()) {
sprintf("Database error: (%d) %s", mysqli_connect_errno(), mysqli_connect_error());
exit;
}
$sql = sprintf('SELECT * FROM film WHERE title="%s"', $mysqli->real_escape_string($film));
$result = $mysqli->query($sql);
if (!$result) {
sprintf("Database error: (%d) %s", $mysqli->errno, $mysqli->error);
exit;
}
$row = $result->fetch_assoc();
$memc->set($row['title'], $row);
printf("<p>Loaded (%s) from MySQL</p>", htmlspecialchars($row['title'], ENT_QUOTES, 'UTF-8');
}
}
?>
</body>
</html>
PHPでは、PHPと関連するApacheインスタンスが実行されている限り、memcachedインスタンスへの接続は開いたままになります。実行中のインスタンスでサーバーをリストに追加またはリストから削除する場合(たとえば、追加のサーバーに言及する別のスクリプトを開始する場合)、接続は共有されますが、スクリプトはスクリプト内で明示的に構成されたインスタンスからのみ選択します。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。