백엔드 개발 PHP 튜토리얼 PHP가 Redis에 연결하기 위한 predis 작업의 전체 모음입니다.

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

Jul 25, 2016 am 08:46 AM

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 移动
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. Apr 05, 2025 am 12:04 AM

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

확실한 원칙과 PHP 개발에 적용되는 방법을 설명하십시오. 확실한 원칙과 PHP 개발에 적용되는 방법을 설명하십시오. Apr 03, 2025 am 12:04 AM

PHP 개발에서 견고한 원칙의 적용에는 다음이 포함됩니다. 1. 단일 책임 원칙 (SRP) : 각 클래스는 하나의 기능 만 담당합니다. 2. Open and Close Principle (OCP) : 변경은 수정보다는 확장을 통해 달성됩니다. 3. Lisch의 대체 원칙 (LSP) : 서브 클래스는 프로그램 정확도에 영향을 미치지 않고 기본 클래스를 대체 할 수 있습니다. 4. 인터페이스 격리 원리 (ISP) : 의존성 및 사용되지 않은 방법을 피하기 위해 세밀한 인터페이스를 사용하십시오. 5. 의존성 반전 원리 (DIP) : 높고 낮은 수준의 모듈은 추상화에 의존하며 종속성 주입을 통해 구현됩니다.

시스템 재시작 후 UnixSocket의 권한을 자동으로 설정하는 방법은 무엇입니까? 시스템 재시작 후 UnixSocket의 권한을 자동으로 설정하는 방법은 무엇입니까? Mar 31, 2025 pm 11:54 PM

시스템이 다시 시작된 후 UnixSocket의 권한을 자동으로 설정하는 방법. 시스템이 다시 시작될 때마다 UnixSocket의 권한을 수정하려면 다음 명령을 실행해야합니다.

phpstorm에서 CLI 모드를 디버그하는 방법은 무엇입니까? phpstorm에서 CLI 모드를 디버그하는 방법은 무엇입니까? Apr 01, 2025 pm 02:57 PM

phpstorm에서 CLI 모드를 디버그하는 방법은 무엇입니까? PHPStorm으로 개발할 때 때때로 CLI (Command Line Interface) 모드에서 PHP를 디버그해야합니다 ...

PHP에서 늦은 정적 결합의 개념을 설명하십시오. PHP에서 늦은 정적 결합의 개념을 설명하십시오. Mar 21, 2025 pm 01:33 PM

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

PHP의 CURL 라이브러리를 사용하여 JSON 데이터가 포함 된 게시물 요청을 보내는 방법은 무엇입니까? PHP의 CURL 라이브러리를 사용하여 JSON 데이터가 포함 된 게시물 요청을 보내는 방법은 무엇입니까? Apr 01, 2025 pm 03:12 PM

PHP 개발에서 PHP의 CURL 라이브러리를 사용하여 JSON 데이터를 보내면 종종 외부 API와 상호 작용해야합니다. 일반적인 방법 중 하나는 컬 라이브러리를 사용하여 게시물을 보내는 것입니다 ...

프레임 워크 보안 기능 : 취약점 보호. 프레임 워크 보안 기능 : 취약점 보호. Mar 28, 2025 pm 05:11 PM

기사는 입력 유효성 검사, 인증 및 정기 업데이트를 포함한 취약점을 방지하기 위해 프레임 워크의 필수 보안 기능을 논의합니다.

See all articles