(empty log message)
@@ -53,6 +53,9 @@ | ||
53 | 53 | |
54 | 54 | private $errormsg; |
55 | 55 | |
56 | + private $okuyamaVersionNo = 0.00; | |
57 | + | |
58 | + | |
56 | 59 | /** |
57 | 60 | * MasterNodeの接続情報を設定する.<br> |
58 | 61 | * 本メソッドでセットし、autoConnect()メソッドを<br> |
@@ -184,7 +187,7 @@ | ||
184 | 187 | |
185 | 188 | /** |
186 | 189 | * Clientを初期化する.<br> |
187 | - * 今のところは最大保存サイズの初期化のみ<br> | |
190 | + * 今のところは最大保存サイズの初期化とバージョンの取得<br> | |
188 | 191 | * |
189 | 192 | * @return boolean true:開始成功 false:開始失敗 |
190 | 193 | * @throws Exception |
@@ -240,6 +243,15 @@ | ||
240 | 243 | } |
241 | 244 | } |
242 | 245 | |
246 | + // バージョン取得 | |
247 | + $versionRet = $this->getOkuyamaVersion(); | |
248 | + | |
249 | + if ($versionRet[0] === "true") { | |
250 | + | |
251 | + $versionWork = explode("okuyama-", $versionRet[1]); | |
252 | + | |
253 | + $this->okuyamaVersionNo = (double)$versionWork[1]; | |
254 | + } | |
243 | 255 | } catch (OkuyamaClientException $oe) { |
244 | 256 | throw $oe; |
245 | 257 | } catch (Exception $e) { |
@@ -255,7 +267,72 @@ | ||
255 | 267 | return $ret; |
256 | 268 | } |
257 | 269 | |
270 | + /** | |
271 | + * 接続先のokuyamaのバージョンを返す<br> | |
272 | + * | |
273 | + * @return String[] 要素1(データ有無):"true" or "false",要素2(データ):okuyamaのバージョン文字列 | |
274 | + * @throws OkuyamaClientException | |
275 | + */ | |
276 | + public function getOkuyamaVersion() { | |
277 | + $ret = array(); | |
258 | 278 | |
279 | + $serverRetStr = null; | |
280 | + $serverRet = null; | |
281 | + | |
282 | + $serverRequestBuf = null; | |
283 | + | |
284 | + try { | |
285 | + // エラーチェック | |
286 | + if ($this->socket == null) throw new OkuyamaClientException("No ServerConnect!!"); | |
287 | + | |
288 | + // 文字列バッファ初期化 | |
289 | + $serverRequestBuf = ""; | |
290 | + | |
291 | + // 処理番号連結 | |
292 | + $serverRequestBuf = $serverRequestBuf . "999"; | |
293 | + | |
294 | + // サーバ送信 | |
295 | + @fputs($this->socket, $serverRequestBuf . "\n"); | |
296 | + | |
297 | + $serverRetStr = @fgets($this->socket); | |
298 | + $serverRetStr = str_replace("\r", "", $serverRetStr); | |
299 | + $serverRetStr = str_replace("\n", "", $serverRetStr); | |
300 | + $serverRet = explode($this->sepStr, $serverRetStr); | |
301 | + | |
302 | + // 処理の妥当性確認 | |
303 | + if ($serverRet[0] === "999") { | |
304 | + // 取得 | |
305 | + $ret[0] = "true"; | |
306 | + $ret[1] = $serverRet[1]; | |
307 | + | |
308 | + } else { | |
309 | + if ($this->masterNodesList != null && count($this->masterNodesList) > 1) { | |
310 | + if($this->autoConnect()) { | |
311 | + $ret = $this->getOkuyamaVersion(); | |
312 | + } | |
313 | + } else { | |
314 | + | |
315 | + // 妥当性違反 | |
316 | + throw new OkuyamaClientException("Execute Violation of validity"); | |
317 | + } | |
318 | + } | |
319 | + } catch (OkuyamaClientException $oe) { | |
320 | + throw $oe; | |
321 | + } catch (Exception $e) { | |
322 | + if ($this->masterNodesList != null && count($this->masterNodesList) > 1) { | |
323 | + if($this->autoConnect()) { | |
324 | + $ret = $this->getOkuyamaVersion(); | |
325 | + } | |
326 | + } else { | |
327 | + | |
328 | + // 妥当性違反 | |
329 | + throw e; | |
330 | + } | |
331 | + } | |
332 | + return $ret; | |
333 | + } | |
334 | + | |
335 | + | |
259 | 336 | /** |
260 | 337 | * Transactionを開始する.<br> |
261 | 338 | * データロック、ロックリリースを使用する場合は、<br> |
@@ -560,14 +637,16 @@ | ||
560 | 637 | * マスタサーバへデータを送信する.<br> |
561 | 638 | * データ保存を行う.<br> |
562 | 639 | * Tag有り.<br> |
640 | + * 有効期限が秒単位で設定可能 | |
563 | 641 | * |
564 | 642 | * @param keyStr |
643 | + * @param value | |
565 | 644 | * @param tagStrs |
566 | - * @param value | |
645 | + * @param expireTime 有効期限(秒/単位) | |
567 | 646 | * @return boolean |
568 | 647 | * @throws Exception |
569 | 648 | */ |
570 | - public function setValue($keyStr, $value, $tagStrs = null) { | |
649 | + public function setValue($keyStr, $value, $tagStrs = null, $expireTime = null) { | |
571 | 650 | $ret = false; |
572 | 651 | $serverRetStr = null; |
573 | 652 | $serverRet = null; |
@@ -647,6 +726,22 @@ | ||
647 | 726 | // Value連結 |
648 | 727 | $serverRequestBuf = $serverRequestBuf . $encodeValue; |
649 | 728 | |
729 | + // 有効期限連結 | |
730 | + if ($expireTime != null) { | |
731 | + // 有効期限あり | |
732 | + if (0.880 > $this->okuyamaVersionNo) { | |
733 | + | |
734 | + throw new OkuyamaClientException("The version of the server is old [The expiration date can be used since version 0.8.8]"); | |
735 | + } else { | |
736 | + // セパレータ連結 | |
737 | + $serverRequestBuf = $serverRequestBuf . $this->sepStr; | |
738 | + $serverRequestBuf = $serverRequestBuf . intval($expireTime); | |
739 | + // セパレータ連結 最後に区切りを入れて送信データ終わりを知らせる | |
740 | + $serverRequestBuf = $serverRequestBuf . $this->sepStr; | |
741 | + } | |
742 | + } | |
743 | + | |
744 | + | |
650 | 745 | // サーバ送信 |
651 | 746 | @fputs($this->socket, $serverRequestBuf . "\n"); |
652 | 747 |
@@ -669,7 +764,7 @@ | ||
669 | 764 | } else { |
670 | 765 | if ($this->masterNodesList != null && count($this->masterNodesList) > 1) { |
671 | 766 | if($this->autoConnect()) { |
672 | - $ret = $this->setValue($keyStr, $value, $tagStrs); | |
767 | + $ret = $this->setValue($keyStr, $value, $tagStrs, $expireTime); | |
673 | 768 | } |
674 | 769 | } else { |
675 | 770 |
@@ -682,7 +777,7 @@ | ||
682 | 777 | } catch (Exception $e) { |
683 | 778 | if ($this->masterNodesList != null && count($this->masterNodesList) > 1) { |
684 | 779 | if($this->autoConnect()) { |
685 | - $ret = $this->setValue($keyStr, $value, $tagStrs); | |
780 | + $ret = $this->setValue($keyStr, $value, $tagStrs, $expireTime); | |
686 | 781 | } |
687 | 782 | } else { |
688 | 783 |
@@ -861,7 +956,7 @@ | ||
861 | 956 | * @return boolean |
862 | 957 | * @throws Exception |
863 | 958 | */ |
864 | - public function setNewValue($keyStr, $value, $tagStrs = null) { | |
959 | + public function setNewValue($keyStr, $value, $tagStrs = null, $expireTime) { | |
865 | 960 | $ret = false; |
866 | 961 | $serverRetStr = null; |
867 | 962 | $serverRet = null; |
@@ -939,6 +1034,21 @@ | ||
939 | 1034 | // Value連結 |
940 | 1035 | $serverRequestBuf = $serverRequestBuf . $encodeValue; |
941 | 1036 | |
1037 | + // 有効期限連結 | |
1038 | + if ($expireTime != null) { | |
1039 | + // 有効期限あり | |
1040 | + if (0.880 > $this->okuyamaVersionNo) { | |
1041 | + | |
1042 | + throw new OkuyamaClientException("The version of the server is old [The expiration date can be used since version 0.8.8]"); | |
1043 | + } else { | |
1044 | + // セパレータ連結 | |
1045 | + $serverRequestBuf = $serverRequestBuf . $this->sepStr; | |
1046 | + $serverRequestBuf = $serverRequestBuf . intval($expireTime); | |
1047 | + // セパレータ連結 最後に区切りを入れて送信データ終わりを知らせる | |
1048 | + $serverRequestBuf = $serverRequestBuf . $this->sepStr; | |
1049 | + } | |
1050 | + } | |
1051 | + | |
942 | 1052 | // サーバ送信 |
943 | 1053 | @fputs($this->socket, $serverRequestBuf . "\n"); |
944 | 1054 |
@@ -962,7 +1072,7 @@ | ||
962 | 1072 | } else { |
963 | 1073 | if ($this->masterNodesList != null && count($this->masterNodesList) > 1) { |
964 | 1074 | if($this->autoConnect()) { |
965 | - $ret = $this->setNewValue($keyStr, $value, $tagStrs); | |
1075 | + $ret = $this->setNewValue($keyStr, $value, $tagStrs, $expireTime); | |
966 | 1076 | } |
967 | 1077 | } else { |
968 | 1078 |
@@ -975,7 +1085,7 @@ | ||
975 | 1085 | } catch (Exception $e) { |
976 | 1086 | if ($this->masterNodesList != null && count($this->masterNodesList) > 1) { |
977 | 1087 | if($this->autoConnect()) { |
978 | - $ret = $this->setNewValue($keyStr, $value, $tagStrs); | |
1088 | + $ret = $this->setNewValue($keyStr, $value, $tagStrs, $expireTime); | |
979 | 1089 | } |
980 | 1090 | } else { |
981 | 1091 |
@@ -1552,6 +1662,106 @@ | ||
1552 | 1662 | |
1553 | 1663 | /** |
1554 | 1664 | * マスタサーバからKeyでデータを取得する.<br> |
1665 | + * 文字列エンコーディング指定あり.<br> | |
1666 | + * 取得と同時に値の有効期限を取得時から最初に設定した時間分延長更新<br> | |
1667 | + * 有効期限を設定していない場合は更新されない.<br> | |
1668 | + * Sessionキャッシュなどでアクセスした時間から所定時間有効などの場合にこちらのメソッドで<br> | |
1669 | + * 値を取得していれば自動的に有効期限が更新される<br> | |
1670 | + * | |
1671 | + * @param keyStr | |
1672 | + * @param encoding | |
1673 | + * @return String[] 要素1(データ有無):"true" or "false",要素2(データ):"データ文字列" | |
1674 | + * @throws Exception | |
1675 | + */ | |
1676 | + public function getValueAndUpdateExpireTime($keyStr, $encoding="UTF-8") { | |
1677 | + $ret = array(); | |
1678 | + $serverRetStr = null; | |
1679 | + $serverRet = null; | |
1680 | + | |
1681 | + $serverRequestBuf = null; | |
1682 | + | |
1683 | + try { | |
1684 | + if ($this->socket == null) throw new OkuyamaClientException("No ServerConnect!!"); | |
1685 | + | |
1686 | + // エラーチェック | |
1687 | + // Keyに対する無指定チェック | |
1688 | + if ($keyStr == null || $keyStr === "") { | |
1689 | + throw new OkuyamaClientException("The blank is not admitted on a key"); | |
1690 | + } | |
1691 | + | |
1692 | + // 文字列バッファ初期化 | |
1693 | + $serverRequestBuf = ""; | |
1694 | + | |
1695 | + // 処理番号連結 | |
1696 | + $serverRequestBuf = $serverRequestBuf . "17"; | |
1697 | + // セパレータ連結 | |
1698 | + $serverRequestBuf = $serverRequestBuf . $this->sepStr; | |
1699 | + | |
1700 | + // Key連結(Keyはデータ送信時には必ず文字列が必要) | |
1701 | + $serverRequestBuf = $serverRequestBuf . $this->dataEncoding($keyStr); | |
1702 | + | |
1703 | + // サーバ送信 | |
1704 | + @fputs($this->socket, $serverRequestBuf . "\n"); | |
1705 | + | |
1706 | + $serverRetStr = @fgets($this->socket); | |
1707 | + $serverRetStr = str_replace("\r", "", $serverRetStr); | |
1708 | + $serverRetStr = str_replace("\n", "", $serverRetStr); | |
1709 | + $serverRet = explode($this->sepStr, $serverRetStr); | |
1710 | + | |
1711 | + // 処理の妥当性確認 | |
1712 | + if ($serverRet[0] === "17") { | |
1713 | + if ($serverRet[1] === "true") { | |
1714 | + | |
1715 | + // データ有り | |
1716 | + $ret[0] =$serverRet[1]; | |
1717 | + | |
1718 | + // Valueがブランク文字か調べる | |
1719 | + if ($serverRet[2] === $this->blankStr) { | |
1720 | + $ret[1] = ""; | |
1721 | + } else { | |
1722 | + | |
1723 | + // Value文字列をBase64でデコード | |
1724 | + $ret[1] = $this->dataDecoding($serverRet[2], $encoding); | |
1725 | + } | |
1726 | + } else if($serverRet[1] === "false") { | |
1727 | + | |
1728 | + // データなし | |
1729 | + $ret[0] = $serverRet[1]; | |
1730 | + $ret[1] = null; | |
1731 | + } else if($serverRet[1] === "error") { | |
1732 | + | |
1733 | + // エラー発生 | |
1734 | + $ret[0] = $serverRet[1]; | |
1735 | + $ret[1] = $serverRet[2]; | |
1736 | + } | |
1737 | + } else { | |
1738 | + if ($this->masterNodesList != null && count($this->masterNodesList) > 1) { | |
1739 | + if($this->autoConnect()) { | |
1740 | + $ret = $this->getValueAndUpdateExpireTime($keyStr, $encoding); | |
1741 | + } | |
1742 | + } else { | |
1743 | + | |
1744 | + // 妥当性違反 | |
1745 | + throw new OkuyamaClientException("Execute Violation of validity"); | |
1746 | + } | |
1747 | + } | |
1748 | + } catch (OkuyamaClientException $oe) { | |
1749 | + throw $oe; | |
1750 | + } catch (Exception $e) { | |
1751 | + if ($this->masterNodesList != null && count($this->masterNodesList) > 1) { | |
1752 | + if($this->autoConnect()) { | |
1753 | + $ret = $this->getValueAndUpdateExpireTime($keyStr, $encoding); | |
1754 | + } | |
1755 | + } else { | |
1756 | + throw $e; | |
1757 | + } | |
1758 | + } | |
1759 | + return $ret; | |
1760 | + } | |
1761 | + | |
1762 | + | |
1763 | + /** | |
1764 | + * マスタサーバからKeyでデータを取得する.<br> | |
1555 | 1765 | * 取得データに対してJavaScriptを実行する.<br> |
1556 | 1766 | * 文字列エンコーディング指定あり.<br> |
1557 | 1767 | * |
@@ -2,6 +2,8 @@ | ||
2 | 2 | php PhpTestSock.php 1 127.0.0.1 8888 10 |
3 | 3 | rem キー値をkey_aでバリュー値value_bを登録 |
4 | 4 | php PhpTestSock.php 1.1 127.0.0.1 8888 key_a value_b |
5 | +rem キー値をkey_aでバリュー値value_cを登録-有効期限テスト | |
6 | +php PhpTestSock.php 1.2 127.0.0.1 8888 key_c value_c 3 | |
5 | 7 | rem キー値を自動でインクリメントして10個valueを取得 |
6 | 8 | php PhpTestSock.php 2 127.0.0.1 8888 10 |
7 | 9 | rem キー値をkey_aでvalueを取得 |
@@ -10,6 +12,8 @@ | ||
10 | 12 | php PhpTestSock.php 2.3 127.0.0.1 8888 key_a "var dataValue; var retValue = dataValue.replace('b', 'dummy'); var execRet = '1';" |
11 | 13 | rem キー値をkey_aで取得したvalueに対してJavaScriptを実行 |
12 | 14 | php PhpTestSock.php 2.4 127.0.0.1 8888 key_a "var dataValue; var dataKey; var retValue = dataValue.replace('b', 'dummy'); if(dataKey == 'key_a') {var execRet = '2'} else {var execRet = '1'}" |
15 | +rem キー値をkey_aでバリュー値value_dを登録-有効期限設定を行って有効期限到達前に更新での取得 | |
16 | +php PhpTestSock.php 2.5 127.0.0.1 8888 key_d value_d 3 | |
13 | 17 | rem Tag値を自動で変えて、KeyとValueを10回登録 |
14 | 18 | php PhpTestSock.php 3 127.0.0.1 8888 10 |
15 | 19 | rem Tag値をtag1を指定して、tag1に属するKey値を取得(Key値存在指定有り(true)) |
@@ -22,8 +26,10 @@ | ||
22 | 26 | php PhpTestSock.php 9 127.0.0.1 8888 key_a 10 5 |
23 | 27 | rem 値の新規登録をおこなう |
24 | 28 | php PhpTestSock.php 10 127.0.0.1 8888 newkey newvalue |
25 | -rem gets | |
29 | +rem get | |
26 | 30 | php PhpTestSock.php 11 127.0.0.1 8888 newkey |
31 | +rem 値の新規登録をおこなう-有効期限あり | |
32 | +php PhpTestSock.php 10.1 127.0.0.1 8888 newkeyT newvalueT 3 | |
27 | 33 | rem cas |
28 | 34 | php PhpTestSock.php 12 127.0.0.1 8888 newkey value_cas 0 |
29 | 35 | rem cas Miss |
@@ -54,7 +54,26 @@ | ||
54 | 54 | if(!$client->setValue($argv[4], $argv[5])) { |
55 | 55 | print_r("Regist Error"); |
56 | 56 | } |
57 | + } else if ($argv[1] === "1.2") { | |
57 | 58 | |
59 | + // データを有効期限付きで登録 | |
60 | + if(!$client->setValue($argv[4], $argv[5], null, $argv[6])) { | |
61 | + | |
62 | + print_r("Regist Error"); | |
63 | + } else { | |
64 | + | |
65 | + sleep(intval($argv[6])); | |
66 | + sleep(1); | |
67 | + $ret = $client->getValue($argv[4]); | |
68 | + if ($ret[0] === "true") { | |
69 | + print_r("ExpireData Get Error"); | |
70 | + print_r($ret[1]); | |
71 | + print_r("\r\n"); | |
72 | + } else if ($ret[0] === "false") { | |
73 | + print_r("ExpireData Get OK"); | |
74 | + print_r("\r\n"); | |
75 | + } | |
76 | + } | |
58 | 77 | } else if ($argv[1] === "42") { |
59 | 78 | |
60 | 79 | // データを引数の回数分登録 |
@@ -143,6 +162,29 @@ | ||
143 | 162 | print_r("There is no data"); |
144 | 163 | print_r("\r\n"); |
145 | 164 | } |
165 | + } else if ($argv[1] === "2.5") { | |
166 | + // 指定のKey値でデータを取得 | |
167 | + // 有効期限を自動的に更新する | |
168 | + // データを有効期限付きで登録 | |
169 | + if(!$client->setValue($argv[4], $argv[5], null, $argv[6])) { | |
170 | + | |
171 | + print_r("Regist Error"); | |
172 | + } else { | |
173 | + | |
174 | + sleep(intval($argv[6]) - 1); | |
175 | + $ret = $client->getValueAndUpdateExpireTime($argv[4]); | |
176 | + sleep(1); | |
177 | + $ret = $client->getValue($argv[4]); | |
178 | + if ($ret[0] === "false") { | |
179 | + print_r("ExpireTimeUpdateGet Error"); | |
180 | + print_r($ret[1]); | |
181 | + print_r("\r\n"); | |
182 | + } else if ($ret[0] === "true") { | |
183 | + print_r("ExpireTimeUpdateGet OK"); | |
184 | + print_r("\r\n"); | |
185 | + } | |
186 | + } | |
187 | + | |
146 | 188 | } else if ($argv[1] === "3") { |
147 | 189 | |
148 | 190 | // データを引数の回数分登録(Tagを登録) |
@@ -279,9 +321,23 @@ | ||
279 | 321 | var_dump($ret); |
280 | 322 | |
281 | 323 | } else if ($argv[1] === "10") { |
282 | - // データを引数の回数分登録 | |
324 | + // データを引数の新規登録 | |
283 | 325 | var_dump($client->setNewValue($argv[4], $argv[5])); |
284 | 326 | |
327 | + } else if ($argv[1] === "10.1") { | |
328 | + // データを引数の新規登録-有効期限あり | |
329 | + var_dump($client->setNewValue($argv[4], $argv[5], null, $argv[6])); | |
330 | + sleep($argv[6]); | |
331 | + sleep(1); | |
332 | + $ret = $client->getValue($argv[4]); | |
333 | + if ($ret[0] === "true") { | |
334 | + print_r("ExpireNewData Get Error"); | |
335 | + print_r($ret[1]); | |
336 | + print_r("\r\n"); | |
337 | + } else if ($ret[0] === "false") { | |
338 | + print_r("ExpireNewData Get OK"); | |
339 | + print_r("\r\n"); | |
340 | + } | |
285 | 341 | } else if ($argv[1] === "11") { |
286 | 342 | // gets |
287 | 343 | var_dump($client->getValueVersionCheck($argv[4])); |