PHP가 Redis에 연결하기 위한 predis 작업의 전체 모음입니다.

WBOY
풀어 주다: 2016-07-25 08:46:27
원래의
1314명이 탐색했습니다.
PHP, 레디스, 프레디스

Predis는 PHP로 Redis에 연결하기 위한 연산 라이브러리이며, PHP5.3 이상만 지원하므로 측정된 성능은 평균 25,000회입니다. C 언어로 작성된 PHP 확장(예: C 확장 phpredis https://github.com/owlient/phpredis 사용)으로 변경하면 성능이 크게 향상될 것이라고 믿습니다.

세션 데이터를 redis에 저장하는 것도 매우 간단합니다.
session.save_handler = redis
session.save_path = “tcp://127.0.0.1:6379″

다음은 일부 작업을 요약한 것이며 지속적으로 업데이트될 예정입니다.

  1. //자동 로드를 사용하여 관련 라이브러리를 로드합니다. 여기서 초점은 $file;
  2. spl_autoload_register(function($class) {
  3. $file = __DIR__.'을 요구하는 것입니다. / lib/Predis/'.$class.'.php';
  4. if (file_exists($file)) {
  5. require $file;
  6. return true;
  7. }
  8. });
  9. //연결 IP, 포트 및 해당 데이터베이스 구성
  10. $server = array(
  11. 'host' => '127.0.0.1',
  12. 'port' => ; 6379,
  13. '데이터베이스' => 15
  14. );
  15. $redis = new Client($server);
  16. //일반 설정/가져오기 작업
  17. $ redis- >set('library', 'predis');
  18. $retval = $redis->get('library');
  19. echo $retval; //'predis' 표시
  20. //setex 저장 유효기간 설정
  21. $redis->setex('str', 10, 'bar') //저장 유효기간이 10초임을 나타냅니다
  22. //setnx/ msetnx는 동일합니다. 추가 작업의 경우 기존 값을 덮어쓰지 않습니다.
  23. $redis->setnx('foo',12) //true
  24. $redis->setnx('foo',34) ); //false
  25. //set의 변형인 getset 연산, 결과는 교체 전의 값을 반환합니다
  26. $redis->getset('foo',56);//returns 34
  27. // incrby/incr/decrby/decr 값을 늘리거나 줄입니다.
  28. $redis->incr('foo') //foo는 57
  29. $redis->incrby(' foo',2); //foo는 59입니다
  30. //exists는 특정 값이 존재하는지 감지합니다
  31. $redis->exists('foo');//true
  32. //del delete
  33. $redis->del('foo');//true
  34. //유형 감지, 문자열 반환 문자열, 목록 반환 목록, 집합 테이블 반환 집합/zset, 해시 테이블은 해시를 반환합니다
  35. $redis->type('foo');//존재하지 않으면 없음을 반환합니다
  36. $redis->set('str','test');
  37. $redis ->type('str '); //문자열, 반환 문자열
  38. //append는 기존 문자열에 연결됩니다.
  39. $redis->append('str','_123'); //누적된 값을 반환합니다. 문자열 길이는 8이고, 입력된 str은 'test_123'입니다
  40. //setrange 부분 교체 연산
  41. $redis->setrange('str',0,'abc' ); //return 3, 매개변수 2가 0이면 설정 작업
  42. $redis->setrange('str',2,'cd');//에서 대체를 나타내는 4를 반환합니다. 두 번째 문자 이후부터 'str'은 'abcd'입니다
  43. //substr 부분 획득 작업
  44. $redis->substr('str',0,2);// 0번째 문자, 두 번째 문자 가져오기, 총 3개, 'abc' 반환
  45. //strlen 문자열 길이 가져오기
  46. $redis->strlen('str') //Return 4
  47. //setbit/ getbit 비트 저장 및 검색
  48. $redis->setbit('binary',31,1); //31번째 비트에 1이 저장됨을 나타냅니다. 여기서 엔디안 문제가 발생합니까? 하지만 문제가 되지 않습니다. getbit에서는 문제가 발생합니다
  49. $redis->getbit('binary',31); //return 1
  50. //keys 퍼지 검색 함수, * 기호 및 ? 기호 지원(한 문자와 일치)
  51. $redis->set('foo1',123);
  52. $redis->set('foo2',456);
  53. $redis->keys('foo*'); // foo1과 foo2의 배열을 반환합니다.
  54. $redis->keys('f?o?') //위와 같습니다
  55. //randomkey는 무작위로 키를 반환합니다
  56. $redis->randomkey( ); //'foo1' 또는 'foo2' 및 redis에 존재하는 다른 키를 반환할 수 있습니다
  57. //rename/ renamenx는 키 이름을 바꿉니다. 차이점은 renamenx는 기존 키로의 변경을 허용하지 않는다는 것입니다. key
  58. $redis->rename('str','str2') //원래 이름이 'str'인 키를 ' str2'
  59. //expire 키 설정- 값의 적시성, ttl은 남은 유효 기간을 가져오고 지속은 영구 저장소로 재설정됩니다
  60. $redis->expire('foo', 1) // 유효기간을 1초로 설정
  61. $redis->ttl( 'foo'); //유효기간 값을 1초로 반환
  62. $redis->expire('foo'); //만료 취소 동작
  63. //dbsize 현재 Redis 데이터베이스의 총 레코드 수를 반환합니다.
  64. $redis->dbsize();
  65. /*
  66. 큐 작업
  67. * /
  68. //rpush/rpushx 순서가 지정된 목록 작업, 대기열에서 요소 삽입
  69. //lpush/lpushx와 rpush/rpushx의 차이점은 대기열의 헤드에 삽입된다는 점입니다. 위와 같이 'x'는 기존 키에서만 작동한다는 의미입니다.
  70. $redis->rpush('fooList', ' bar1') //목록의 길이를 반환합니다. 1
  71. $redis->lpush( 'fooList', 'bar0'); //목록의 길이를 반환합니다. 2
  72. $redis->rpushx(' fooList', 'bar2') //3을 반환합니다. rpushx는 기존 대기열에만 추가합니다. 그렇지 않으면 0을 반환합니다.
  73. //llen은 현재 목록 길이를 반환합니다.
  74. $redis->llen('fooList') ;//3
  75. //lrange는 대기열의 요소 범위를 반환합니다
  76. $redis->lrange('fooList',0,1); //0~1번째 요소를 포함하는 배열을 반환합니다. 총 2개의 요소
  77. $redis->lrange('fooList',0, -1);//0번째 요소를 두 번째 요소로 반환하는 것은 모든 요소를 ​​반환하는 것과 동일합니다. redis에서 종종 음수로 사용되며, 아래와 동일합니다.
  78. //lindex는 다음 위치의 목록 요소를 반환합니다. 지정된 시퀀스 위치
  79. $redis->lindex('fooList',1); //'bar1'을 반환합니다
  80. //lset은 대기열의 지정된 위치에 있는 값을 수정합니다
  81. $ redis->lset('fooList',1,'123');//위치 1의 요소를 수정하고 true를 반환합니다
  82. //lrem 대기열의 왼쪽에서 지정된 수의 문자를 삭제합니다
  83. $redis->lrem('fooList',1,'_'); //큐(있는 경우)의 왼쪽에서 '_' 문자 1개를 삭제합니다(오른쪽에서 -1 사용).
  84. //lpop/rpop은 스택 구조와 유사한 가장 왼쪽 또는 가장 오른쪽 요소를 팝(및 삭제)합니다.
  85. $redis->lpop('fooList') //' bar0'
  86. $redis-> rpop('fooList'); //'bar2'
  87. //ltrim 대기열 수정, 왼쪽에서 몇 가지 요소 유지, 나머지 삭제
  88. $redis-> ,1); //왼쪽에서 0번째부터 첫 번째 요소 유지
  89. //rpoplpush 한 대기열의 요소를 팝하고 다른 대기열로 푸시
  90. $ redis->rpush('list1','ab0 ');
  91. $redis->rpush('list1','ab1');
  92. $redis->rpush('list2','ab2 ');
  93. $redis->rpush ('list2','ab3');
  94. $redis->rpoplpush('list1','list2');//결과 list1 =>array('ab0'),list2 =>array('ab1','ab2','ab3')
  95. $redis->rpoplpush('list2','list2');//또한 동일한 대기열에 적용되며 마지막 요소를 헤드로 이동합니다. list2 =>array('ab3','ab1','ab2 ' )
  96. //linsert는 대기열 중간에 지정된 요소 앞이나 뒤에 요소를 삽입합니다.
  97. $redis->linsert('list2', 'before','ab1','123') ; / /'ab1' 요소 앞에 '123'을 삽입함을 나타냅니다.
  98. $redis->linsert('list2', 'after','ab1','456') //'ab1' 요소 뒤에 '를 삽입함을 나타냅니다. 456'
  99. //blpop/brpop은 큐가 비어 있지 않을 때까지 차단하고 기다린 다음 가장 왼쪽 또는 가장 오른쪽 요소를 팝아웃합니다(이 함수는 PHP 외부에서 매우 유용하다고 할 수 있습니다)
  100. / / brpoplpush도 작업을 차단하고 기다리며 결과는 rpoplpush
  101. $redis->blpop('list3',10); //list3이 비어 있으면 첫 번째 요소가 팝될 때까지 기다립니다. 비어 있지 않습니다. 10초 후 시간 초과
  102. /**
  103. 테이블 조작 설정
  104. */
  105. //sadd가 요소를 추가하고, true를 반환하고, false를 반복적으로 반환합니다.
  106. $redis->sadd ('set1' ,'ab');
  107. $redis->sadd('set1','cd');
  108. $redis->sadd('set1','ef');
  109. //srem은 지정된 요소를 제거합니다.
  110. $redis->srem('set1','cd') //'cd' 요소를 삭제합니다.
  111. //spop은 첫 번째 요소
  112. $redis ->spop('set1');
  113. //smove는 현재 설정 테이블의 지정된 요소를 다른 설정 테이블로 이동합니다
  114. $redis->sadd(' set2','123');
  115. $redis->smove('set1','set2','ab');//'set1'의 'ab'를 'set2'로 이동하고 true 또는 false를 반환합니다.
  116. / /scard는 현재 세트 테이블의 요소 수를 반환합니다.
  117. $redis->scard('set2');//2
  118. //sismember는 요소가 요소인지 여부를 결정합니다. 현재 테이블에 속함
  119. $redis-> sismember('set2','123'); //true 또는 false
  120. //smembers는 현재 테이블의 모든 요소를 ​​반환합니다
  121. $redis ->smembers('set2'); //array( '123','ab');
  122. //sinter/sunion/sdiff 두 테이블에 있는 요소의 교집합/합집합/보수를 반환합니다.
  123. $redis->sadd('set1', 'ab');
  124. $redis->sinter('set2','set1') //배열 반환('ab')
  125. //sinterstore/sunionstore/sdiffstore 두 테이블 결합 교집합/합집합/보완 요소를 세 번째 테이블에 복사
  126. $redis->set('foo',0);
  127. $redis-> ;sinterstore('foo','set1') ; //'set1'의 내용을 'foo'에 복사하고 'foo'를 세트 테이블로 변환하는 것과 같습니다
  128. $redis->sinterstore('foo ',array('set1',' set2')); //'set1'과 'set2'의 동일한 요소를 'foo' 테이블에 복사하여 'foo'의 원래 내용을 덮어씁니다
  129. / /srandmember는 테이블의 임의 요소를 반환합니다.
  130. $redis->srandmember('set1');
  131. /**
  132. 주문한 세트 테이블 운영
  133. */
  134. //sadd는 요소를 추가하고 일련 번호를 설정하고, true를 반환하고, 반복하면 false를 반환합니다.
  135. $redis->zadd('zset1',1,'ab');
  136. $redis->zadd('zset1',2,' cd');
  137. $redis-> zadd('zset1',3,'ef');
  138. //zincrby는 지정된 요소의 인덱스 값을 늘리거나 줄이고 순서를 변경합니다. elements
  139. $redis->zincrby('zset1',10 ,'ab');//Return 11
  140. //zrem은 지정된 요소를 제거합니다
  141. $redis->zrem(' zset1','ef'); //true 또는 false
  142. //zrange는 테이블의 지정된 범위에 있는 요소를 위치 순서로 반환합니다.
  143. $redis->zrange('zset1',0 ,1); //위치 0과 1(2) 사이의 요소를 반환합니다.
  144. $redis->zrange('zset1',0,-1);//위치 0과 첫 번째 요소 사이의 요소를 반환합니다. 마지막 (모든 요소와 동일)
  145. //zrevrange 위와 동일, 테이블의 지정된 범위에 있는 요소를 역순으로 반환
  146. $redis->zrevrange('zset1',0 ,-1); //요소 순서가 zrange와 반대입니다
  147. //zrangebyscore /zrevrangebyscore는 테이블의 지정된 인덱스 범위에 있는 요소를 순서/내림차순으로 반환합니다
  148. $redis-> zadd('zset1',3,'ef');
  149. $redis->zadd('zset1',5 ,'gh');
  150. $redis->zrangebyscore('zset1',2, 9); //인덱스 값 2~9 사이의 요소 array('ef','gh')
  151. 반환 //매개변수 형식
  152. $redis->zrangebyscore('zset1',2,9, 'withscores'); //인덱스 값 2-9 사이의 요소를 반환하고 인덱스 값을 포함합니다. array(array('ef' ,3),array('gh',5))
  153. $redis-> zrangebyscore('zset1',2,9,array('withscores' =>true,'limit'=>array(1 , 2))) //인덱스 값 2-9 사이의 요소 반환, 'withscores ' =>true는 인덱스 값을 포함한다는 의미입니다. 'limit'=>array(1, 2)는 최대 2개 항목을 반환한다는 의미입니다. 결과는 array(array('ef',3),array('gh'입니다. ,5))
  154. //zunionstore/zinterstore 여러 테이블의 합집합/교집합을 다른 테이블에 저장
  155. $redis->zunionstore('zset3',array('zset1','zset2', 'zset0')); //'zset1','zset2','zset0'의 합집합을 'zset3'에 저장
  156. //기타 매개변수
  157. $redis->zunionstore('zset3',array( 'zset1','zset2'),array('weights' => array(5,0)));/ /weights 매개변수는 가중치를 나타냅니다. 즉, 합집합 후 5보다 큰 값을 가진 요소의 순위가 매겨집니다. 먼저, 0보다 큰 요소는 마지막으로 순위가 매겨집니다.
  158. $redis->zunionstore('zset3',array('zset1','zset2') ,array('aggregate' => 'max'));/ /'aggregate' => 'max' 또는 'min'은 합집합 후 동일한 요소가 큰 값을 취하는지 작은 값을 취하는지 나타냅니다.
  159. //zcount는 인덱스 범위의 요소 수를 계산합니다
  160. $redis->zcount('zset1',3,5);//2
  161. $redis->zcount('zset1',' (3',5)) //'(3'은 다음을 나타냅니다. 인덱스 값은 3-5 사이이지만 3을 포함하지 않습니다. 마찬가지로 '(5'를 사용하여 상한이 5이지만 5를 포함하지 않음을 나타낼 수도 있습니다.
  162. //zcard는 개수를 계산합니다. elements
  163. $redis->zcard('zset1');//4
  164. //zscore는 요소의 인덱스를 쿼리합니다
  165. $redis->zscore('zset1','ef');//3
  166. //zremrangebyscore는 인덱스 범위의 요소를 삭제합니다
  167. $redis->zremrangebyscore('zset1',0, 2); //0-2('ab', 'cd') 사이의 인덱스를 가진 요소를 삭제하고, 삭제된 요소의 수를 반환합니다. 2
  168. //zrank/zrevrank는 테이블의 순서/내림차순을 반환합니다. 요소가 있는 위치 위치(인덱스 아님)
  169. $redis->zrank('zset1','ef');//첫 번째 요소이므로 0을 반환합니다. zrevrank는 1(마지막 요소)을 반환합니다. >
  170. //zremrangebyrank는 테이블의 지정된 위치 범위에 있는 요소를 삭제합니다
  171. $redis->zremrangebyrank('zset1',0,10) //위치 0-10의 요소를 삭제하고 개수를 반환합니다. 삭제된 요소 2
  172. /**
  173. 해시 테이블 연산
  174. */
  175. //hset/hget 해시 테이블 데이터 액세스
  176. $redis->hset('hash1','key1', 'v1'); //'key1' 키와 'v1' 값을 갖는 요소를 hash1 테이블에 저장
  177. $redis->hset('hash1','key2','v2');
  178. $redis ->hget('hash1','key1'); //'hash1' 테이블에서 'key1' 키의 값을 가져오고 'v1'을 반환합니다.
  179. //hexists는 해시에 지정된 키를 반환합니다. table
  180. $redis->hexists ('hash1','key1'); //true 또는 false
  181. //hdel 해시 테이블에서 지정된 키의 요소를 삭제합니다
  182. $redis-> ;hdel('hash1','key2'); //true 또는 false
  183. //hlen은 해시 테이블 요소 수를 반환합니다
  184. $redis->hlen('hash1 '); //1
  185. //hsetnx는 요소를 추가하지만 반복할 수는 없습니다.
  186. $redis->hsetnx('hash1','key1','v2') //false
  187. $redis-> hsetnx('hash1','key2','v2'); //true
  188. //hmset/hmget은 해시 테이블에 대한 여러 요소에 액세스합니다
  189. $redis-> ;hmset('hash1' ,array('key3'=>'v3','key4'=>'v4'));
  190. $redis->hmget('hash1',array('key3' ,'key4')) ; //해당 값을 반환합니다 array('v3','v4')
  191. //hincrby는 지정된 키를 누적합니다
  192. $redis->hincrby('hash1', 'key5',3 ); //3을 반환
  193. $redis->hincrby('hash1','key5',10); //13을 반환
  194. //hkeys 해시 테이블
  195. $redis->hkeys('hash1'); //return array('key1','key2','key3','key4','key5')
  196. // hvals는 해시 테이블로 반환됩니다. 모든 값
  197. $redis->hvals('hash1') //return array('v1','v2','v3','v4',13)
  198. //hgetall 전체 해시 테이블 요소를 반환합니다
  199. $redis->hgetall('hash1') //return array('key1'=>'v1','key2'=>'v2' ,'key3'=> ;'v3','key4'=>'v4','key5'=>13)
  200. /**
  201. 정렬 작업
  202. */
  203. / /sort sort
  204. $redis->rpush('tab',3);
  205. $redis->rpush('tab',2);
  206. $redis->rpush('tab' ,17);
  207. $redis->sort('tab'); //배열(2,3,17) 반환
  208. //매개변수 사용 array('sort' => 'desc', 'limit'는 조합하여 사용할 수 있습니다 => array(1, 2))
  209. $redis->sort('tab',array('sort' => 'desc')); 내림차순, return array(17,3, 2)
  210. $redis->sort('tab',array('limit' => array(1, 2))) //1의 2개 요소 반환 시퀀스 위치(여기서 2는 위치가 아닌 숫자를 나타냄)에서 array(3,17)
  211. $redis->sort('tab',array('limit' => array('alpha' =)를 반환합니다. > true))); // 첫 번째 문자를 기준으로 정렬하고 배열(17,2,3)을 반환합니다. 17의 첫 번째 문자가 '1'이므로 첫 번째 위치는
  212. $redis->sort입니다. ('tab',array('limit' => ; array('store' => 'ordered')))) //영구 정렬을 나타내며 요소 수를 반환합니다
  213. $redis->sort(' tab',array('limit' => array ('get' => 'pre_*'))); //와일드카드 문자 '*'는 요소를 필터링하는 데 사용됩니다. 즉, 'pre_로 시작하는 요소만 필터링됩니다. '가 반환됩니다.
  214. /**
  215. Redis 관리 작업
  216. */
  217. //select는 운용할 데이터베이스를 지정합니다.
  218. $redis->select('mydb') //specify mydb, 존재하지 않으면 생성
  219. //flushdb 현재 라이브러리 지우기
  220. $redis->flushdb();
  221. //move는 현재 라이브러리의 요소를 이동합니다. 다른 라이브러리로
  222. $redis->set('foo', 'bar');
  223. $redis->move('foo', 'mydb2') //'mydb2' 라이브러리가 존재하는 경우
  224. //info는 서비스 상태 정보를 표시합니다
  225. $redis->info( ; redis->slaveof(); //슬레이브 서버 지우기
  226. //서버 데이터 저장 동기식으로 디스크에
  227. $redis->save();
  228. //서버 데이터를 디스크에 비동기식으로 저장
  229. $redis->bgsave();
  230. //??
  231. $redis ->bgrewriteaof();
  232. //디스크가 마지막으로 업데이트된 시간을 반환합니다
  233. $redis-> lastsave();
  234. //여러 키-값 설정/가져오기
  235. $mkv = array(
  236. 'usr:0001' => '첫 번째 사용자',
  237. 'usr: 0002' => '두 번째 사용자',
  238. 'usr:0003' => '세 번째 사용자'
  239. );
  240. $redis->mset($mkv); //해당 값을 여러 개 저장
  241. $retval = $redis->mget(array_keys($mkv)); 여러 키에 해당하는 값
  242. print_r($retval);
  243. //일괄 작업
  244. $replies = $redis->pipeline(function($pipe) {
  245. $pipe-> ;ping();
  246. $pipe->flushdb();
  247. $pipe- >incrby('counter', 10) //증분 연산
  248. $pipe->incrby('counter ', 30);
  249. $pipe->exists('counter');
  250. $pipe->get('counter');
  251. $pipe->mget('does_not_exist', ' 카운터');
  252. });
  253. print_r($replies);
  254. //CAS,사건성操작
  255. function zpop($client, $zsetKey) {
  256. $element = null;
  257. $options = array(
  258. 'cas' => true, // CAS 연산 지원으로 초기화
  259. 'watch' => $zsetKey, // 변경 사항을 감지하기 위해 감시해야 하는 키
  260. 'retry' => 3, // 중단된 트랜잭션에 대한 재시도 횟수,
  261. // 클라이언트가 예외로 구제된 후.
  262. );
  263. $txReply = $client- >multiExec($options, function($tx)
  264. use ($zsetKey, &$element) {
  265. @list($element) = $tx->zrange($zsetKey, 0, 0);
  266. if (isset($element)) {
  267. $tx->multi(); // CAS를 사용하면 MULTI가 명시적으로 호출되어야 합니다.
  268. $tx->zrem($zsetKey, $element);
  269. }
  270. });
  271. return $element;
  272. }
  273. $zpopped = zpop($redis, 'zset');
  274. echo isset($zpopped) ? "ZPOPed $zpopped": "ZPOP에 아무 것도 없습니다!", "n";
  275. //对存取的key加前缀,如: 'nrk:'
  276. $redis->getProfile() ->setPreprocessor(new KeyPrefixPreprocessor('nrk:'));
  277. //分布式存储적 일些방법
  278. $multiple_servers = array(
  279. array(
  280. 'host' => ; '127.0.0.1',
  281. '포트' => 6379,
  282. '데이터베이스' => 15,
  283. '별칭' => array(
  284. '호스트' => '127.0.0.1',
  285. '포트' => 6380,
  286. '데이터베이스' => 15,
  287. '별칭' => '초 ',
  288. ),
  289. );
  290. predistributionIDistributionStrategy 사용;
  291. NaiveDistributionStrategy 클래스는 IDistributionStrategy {
  292. private $_nodes, $_nodesCount;
  293. 공개 함수를 구현합니다. __constructor() {
  294. $this->_nodes = array();
  295. $this->_nodesCount = 0;
  296. }
  297. 공용 함수 add($node, $weight = null) {
  298. $this->_nodes[] = $node;
  299. $this->_nodesCount ;
  300. }
  301. 공용 함수 제거($node) {
  302. $ this->_nodes = array_filter($this->_nodes, function($n) use($node) {
  303. return $n !== $node;
  304. });
  305. $this- >_nodesCount = count($this->_nodes);
  306. }
  307. 공개 함수 get($key) {
  308. $count = $this->_nodesCount;
  309. if ( $count === 0) {
  310. throw new RuntimeException('연결 없음');
  311. }
  312. return $this->_nodes[$count > 1? abs(crc32($key) % $count) : 0];
  313. }
  314. 공개 함수 generateKey($value) {
  315. return crc32($value);
  316. }
  317. }
  318. //配置键分布策略
  319. $options = array(
  320. 'key_distribution' => new NaiveDistributionStrategy(),
  321. );
  322. $redis = new PredisClient($multiple_servers, $options);
  323. for ($i = 0; $i set("key:$i", str_pad($i, 4, '0', 0));
  324. $redis->get("key:$i");
  325. }
  326. $server1 = $redis->getClientFor('first')->info();
  327. $server2 = $redis->getClientFor('second')->info();
  328. printf("서버 '%s'에는 %d개의 키가 있고 서버 '%s'에는 %d개의 키가 있습니다. n",
  329. '첫 번째', $server1['db15']['keys'], '두 번째', $server2['db15']['keys']
  330. );
제조대码

본주题由 小贝 于 2015-11-12 08:43 移动
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿