国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Maison développement back-end tutoriel php php連接redis的操作庫(kù)predis操作大全

php連接redis的操作庫(kù)predis操作大全

Jul 25, 2016 am 08:46 AM

predis是php連接redis的操作庫(kù),由于它完全使用php編寫,大量使用命名空間以及閉包等功能,只支持php5.3以上版本,故實(shí)測(cè)性能一般,每秒25000次讀寫,相信改換c語(yǔ)言編寫的php擴(kuò)展后性能會(huì)大幅提升(比如使用C擴(kuò)展phpredis https://github.com/owlient/phpredis)。

將session數(shù)據(jù)存放到redis也很簡(jiǎn)單:
session.save_handler = redis
session.save_path = “tcp://127.0.0.1:6379″

以下是匯總一些操作,并不斷更新。

  1. //使用autoload加載相關(guān)庫(kù),這邊重點(diǎn)就是為了require $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、端口、以及相應(yīng)的數(shù)據(jù)庫(kù)
  10. $server = array(
  11. 'host' => '127.0.0.1',
  12. 'port' => 6379,
  13. 'database' => 15
  14. );
  15. $redis = new Client($server);
  16. //普通set/get操作
  17. $redis->set('library', 'predis');
  18. $retval = $redis->get('library');
  19. echo $retval; //顯示 'predis'
  20. //setex set一個(gè)存儲(chǔ)時(shí)效
  21. $redis->setex('str', 10, 'bar'); //表示存儲(chǔ)有效期為10秒
  22. //setnx/msetnx相當(dāng)于add操作,不會(huì)覆蓋已有值
  23. $redis->setnx('foo',12); //true
  24. $redis->setnx('foo',34); //false
  25. //getset操作,set的變種,結(jié)果返回替換前的值
  26. $redis->getset('foo',56);//返回34
  27. // incrby/incr/decrby/decr 對(duì)值的遞增和遞減
  28. $redis->incr('foo'); //foo為57
  29. $redis->incrby('foo',2); //foo為59
  30. //exists檢測(cè)是否存在某值
  31. $redis->exists('foo');//true
  32. //del 刪除
  33. $redis->del('foo');//true
  34. //type 類型檢測(cè),字符串返回string,列表返回 list,set表返回set/zset,hash表返回hash
  35. $redis->type('foo');//不存在,返回none
  36. $redis->set('str','test');
  37. $redis->type('str'); //字符串,返回string
  38. //append 連接到已存在字符串
  39. $redis->append('str','_123'); //返回累加后的字符串長(zhǎng)度8,此進(jìn)str為 'test_123'
  40. //setrange 部分替換操作
  41. $redis->setrange('str',0,'abc'); //返回3,參數(shù)2為0時(shí)等同于set操作
  42. $redis->setrange('str',2,'cd');//返回4,表示從第2個(gè)字符后替換,這時(shí)'str'為'abcd'
  43. //substr 部分獲取操作
  44. $redis->substr('str',0,2);//表示從第0個(gè)起,取到第2個(gè)字符,共3個(gè),返回'abc'
  45. //strlen 獲取字符串長(zhǎng)度
  46. $redis->strlen('str'); //返回4
  47. //setbit/getbit 位存儲(chǔ)和獲取
  48. $redis->setbit('binary',31,1); //表示在第31位存入1,這邊可能會(huì)有大小端問題?不過沒關(guān)系,getbit 應(yīng)該不會(huì)有問題
  49. $redis->getbit('binary',31); //返回1
  50. //keys 模糊查找功能,支持*號(hào)以及?號(hào)(匹配一個(gè)字符)
  51. $redis->set('foo1',123);
  52. $redis->set('foo2',456);
  53. $redis->keys('foo*'); //返回foo1和foo2的array
  54. $redis->keys('f?o?'); //同上
  55. //randomkey 隨機(jī)返回一個(gè)key
  56. $redis->randomkey(); //可能是返回 'foo1'或者是'foo2'及其它任何一存在redis的key
  57. //rename/renamenx 對(duì)key進(jìn)行改名,所不同的是renamenx不允許改成已存在的key
  58. $redis->rename('str','str2'); //把原先命名為'str'的key改成了'str2'
  59. //expire 設(shè)置key-value的時(shí)效性,ttl 獲取剩余有效期,persist 重新設(shè)置為永久存儲(chǔ)
  60. $redis->expire('foo', 1); //設(shè)置有效期為1秒
  61. $redis->ttl('foo'); //返回有效期值1s
  62. $redis->expire('foo'); //取消expire行為
  63. //dbsize 返回redis當(dāng)前數(shù)據(jù)庫(kù)的記錄總數(shù)
  64. $redis->dbsize();
  65. /*
  66. 隊(duì)列操作
  67. */
  68. //rpush/rpushx 有序列表操作,從隊(duì)列后插入元素
  69. //lpush/lpushx 和rpush/rpushx的區(qū)別是插入到隊(duì)列的頭部,同上,'x'含義是只對(duì)已存在的key進(jìn)行操作
  70. $redis->rpush('fooList', 'bar1'); //返回一個(gè)列表的長(zhǎng)度1
  71. $redis->lpush('fooList', 'bar0'); //返回一個(gè)列表的長(zhǎng)度2
  72. $redis->rpushx('fooList', 'bar2'); //返回3,rpushx只對(duì)已存在的隊(duì)列做添加,否則返回0
  73. //llen返回當(dāng)前列表長(zhǎng)度
  74. $redis->llen('fooList');//3
  75. //lrange 返回隊(duì)列中一個(gè)區(qū)間的元素
  76. $redis->lrange('fooList',0,1); //返回?cái)?shù)組包含第0個(gè)至第1個(gè)共2個(gè)元素
  77. $redis->lrange('fooList',0,-1);//返回第0個(gè)至倒數(shù)第一個(gè),相當(dāng)于返回所有元素,注意redis中很多時(shí)候會(huì)用到負(fù)數(shù),下同
  78. //lindex 返回指定順序位置的list元素
  79. $redis->lindex('fooList',1); //返回'bar1'
  80. //lset 修改隊(duì)列中指定位置的value
  81. $redis->lset('fooList',1,'123');//修改位置1的元素,返回true
  82. //lrem 刪除隊(duì)列中左起指定數(shù)量的字符
  83. $redis->lrem('fooList',1,'_'); //刪除隊(duì)列中左起(右起使用-1)1個(gè)字符'_'(若有)
  84. //lpop/rpop 類似棧結(jié)構(gòu)地彈出(并刪除)最左或最右的一個(gè)元素
  85. $redis->lpop('fooList'); //'bar0'
  86. $redis->rpop('fooList'); //'bar2'
  87. //ltrim 隊(duì)列修改,保留左邊起若干元素,其余刪除
  88. $redis->ltrim('fooList', 0,1); //保留左邊起第0個(gè)至第1個(gè)元素
  89. //rpoplpush 從一個(gè)隊(duì)列中pop出元素并push到另一個(gè)隊(duì)列
  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');//結(jié)果list1 =>array('ab0'),list2 =>array('ab1','ab2','ab3')
  95. $redis->rpoplpush('list2','list2');//也適用于同一個(gè)隊(duì)列,把最后一個(gè)元素移到頭部list2 =>array('ab3','ab1','ab2')
  96. //linsert 在隊(duì)列的中間指定元素前或后插入元素
  97. $redis->linsert('list2', 'before','ab1','123'); //表示在元素'ab1'之前插入'123'
  98. $redis->linsert('list2', 'after','ab1','456'); //表示在元素'ab1'之后插入'456'
  99. //blpop/brpop 阻塞并等待一個(gè)列隊(duì)不為空時(shí),再pop出最左或最右的一個(gè)元素(這個(gè)功能在php以外可以說非常好用)
  100. //brpoplpush 同樣是阻塞并等待操作,結(jié)果同rpoplpush一樣
  101. $redis->blpop('list3',10); //如果list3為空則一直等待,直到不為空時(shí)將第一元素彈出,10秒后超時(shí)
  102. /**
  103. set表操作
  104. */
  105. //sadd 增加元素,返回true,重復(fù)返回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 移動(dòng)當(dāng)前set表的指定元素到另一個(gè)set表
  114. $redis->sadd('set2','123');
  115. $redis->smove('set1','set2','ab');//移動(dòng)'set1'中的'ab'到'set2',返回true or false
  116. //scard 返回當(dāng)前set表元素個(gè)數(shù)
  117. $redis->scard('set2');//2
  118. //sismember 判斷元素是否屬于當(dāng)前表
  119. $redis->sismember('set2','123'); //true or false
  120. //smembers 返回當(dāng)前表的所有元素
  121. $redis->smembers('set2'); //array('123','ab');
  122. //sinter/sunion/sdiff 返回兩個(gè)表中元素的交集/并集/補(bǔ)集
  123. $redis->sadd('set1','ab');
  124. $redis->sinter('set2','set1'); //返回array('ab')
  125. //sinterstore/sunionstore/sdiffstore 將兩個(gè)表交集/并集/補(bǔ)集元素copy到第三個(gè)表中
  126. $redis->set('foo',0);
  127. $redis->sinterstore('foo','set1'); //這邊等同于將'set1'的內(nèi)容copy到'foo'中,并將'foo'轉(zhuǎn)為set表
  128. $redis->sinterstore('foo',array('set1','set2')); //將'set1'和'set2'中相同的元素copy到'foo'表中,覆蓋'foo'原有內(nèi)容
  129. //srandmember 返回表中一個(gè)隨機(jī)元素
  130. $redis->srandmember('set1');
  131. /**
  132. 有序set表操作
  133. */
  134. //sadd 增加元素,并設(shè)置序號(hào),返回true,重復(fù)返回false
  135. $redis->zadd('zset1',1,'ab');
  136. $redis->zadd('zset1',2,'cd');
  137. $redis->zadd('zset1',3,'ef');
  138. //zincrby 對(duì)指定元素索引值的增減,改變?cè)嘏帕写涡?/li>
  139. $redis->zincrby('zset1',10,'ab');//返回11
  140. //zrem 移除指定元素
  141. $redis->zrem('zset1','ef'); //true or false
  142. //zrange 按位置次序返回表中指定區(qū)間的元素
  143. $redis->zrange('zset1',0,1); //返回位置0和1之間(兩個(gè))的元素
  144. $redis->zrange('zset1',0,-1);//返回位置0和倒數(shù)第一個(gè)元素之間的元素(相當(dāng)于所有元素)
  145. //zrevrange 同上,返回表中指定區(qū)間的元素,按次序倒排
  146. $redis->zrevrange('zset1',0,-1); //元素順序和zrange相反
  147. //zrangebyscore/zrevrangebyscore 按順序/降序返回表中指定索引區(qū)間的元素
  148. $redis->zadd('zset1',3,'ef');
  149. $redis->zadd('zset1',5,'gh');
  150. $redis->zrangebyscore('zset1',2,9); //返回索引值2-9之間的元素 array('ef','gh')
  151. //參數(shù)形式
  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條,結(jié)果為array(array('ef',3),array('gh',5))
  154. //zunionstore/zinterstore 將多個(gè)表的并集/交集存入另一個(gè)表中
  155. $redis->zunionstore('zset3',array('zset1','zset2','zset0')); //將'zset1','zset2','zset0'的并集存入'zset3'
  156. //其它參數(shù)
  157. $redis->zunionstore('zset3',array('zset1','zset2'),array('weights' => array(5,0)));//weights參數(shù)表示權(quán)重,其中表示并集后值大于5的元素排在前,大于0的排在后
  158. $redis->zunionstore('zset3',array('zset1','zset2'),array('aggregate' => 'max'));//'aggregate' => 'max'或'min'表示并集后相同的元素是取大值或是取小值
  159. //zcount 統(tǒng)計(jì)一個(gè)索引區(qū)間的元素個(gè)數(shù)
  160. $redis->zcount('zset1',3,5);//2
  161. $redis->zcount('zset1','(3',5)); //'(3'表示索引值在3-5之間但不含3,同理也可以使用'(5'表示上限為5但不含5
  162. //zcard 統(tǒng)計(jì)元素個(gè)數(shù)
  163. $redis->zcard('zset1');//4
  164. //zscore 查詢?cè)氐乃饕?/li>
  165. $redis->zscore('zset1','ef');//3
  166. //zremrangebyscore 刪除一個(gè)索引區(qū)間的元素
  167. $redis->zremrangebyscore('zset1',0,2); //刪除索引在0-2之間的元素('ab','cd'),返回刪除元素個(gè)數(shù)2
  168. //zrank/zrevrank 返回元素所在表順序/降序的位置(不是索引)
  169. $redis->zrank('zset1','ef');//返回0,因?yàn)樗堑谝粋€(gè)元素;zrevrank則返回1(最后一個(gè))
  170. //zremrangebyrank 刪除表中指定位置區(qū)間的元素
  171. $redis->zremrangebyrank('zset1',0,10); //刪除位置為0-10的元素,返回刪除的元素個(gè)數(shù)2
  172. /**
  173. hash表操作
  174. */
  175. //hset/hget 存取hash表的數(shù)據(jù)
  176. $redis->hset('hash1','key1','v1'); //將key為'key1' value為'v1'的元素存入hash1表
  177. $redis->hset('hash1','key2','v2');
  178. $redis->hget('hash1','key1'); //取出表'hash1'中的key 'key1'的值,返回'v1'
  179. //hexists 返回hash表中的指定key是否存在
  180. $redis->hexists ('hash1','key1'); //true or false
  181. //hdel 刪除hash表中指定key的元素
  182. $redis->hdel('hash1','key2'); //true or false
  183. //hlen 返回hash表元素個(gè)數(shù)
  184. $redis->hlen('hash1'); //1
  185. //hsetnx 增加一個(gè)元素,但不能重復(fù)
  186. $redis->hsetnx('hash1','key1','v2'); //false
  187. $redis->hsetnx('hash1','key2','v2'); //true
  188. //hmset/hmget 存取多個(gè)元素到hash表
  189. $redis->hmset('hash1',array('key3'=>'v3','key4'=>'v4'));
  190. $redis->hmget('hash1',array('key3','key4')); //返回相應(yīng)的值 array('v3','v4')
  191. //hincrby 對(duì)指定key進(jìn)行累加
  192. $redis->hincrby('hash1','key5',3); //返回3
  193. $redis->hincrby('hash1','key5',10); //返回13
  194. //hkeys 返回hash表中的所有key
  195. $redis->hkeys('hash1'); //返回array('key1','key2','key3','key4','key5')
  196. //hvals 返回hash表中的所有value
  197. $redis->hvals('hash1'); //返回array('v1','v2','v3','v4',13)
  198. //hgetall 返回整個(gè)hash表元素
  199. $redis->hgetall('hash1'); //返回array('key1'=>'v1','key2'=>'v2','key3'=>'v3','key4'=>'v4','key5'=>13)
  200. /**
  201. 排序操作
  202. */
  203. //sort 排序
  204. $redis->rpush('tab',3);
  205. $redis->rpush('tab',2);
  206. $redis->rpush('tab',17);
  207. $redis->sort('tab'); //返回array(2,3,17)
  208. //使用參數(shù),可組合使用 array('sort' => 'desc','limit' => array(1, 2))
  209. $redis->sort('tab',array('sort' => 'desc')); //降序排列,返回array(17,3,2)
  210. $redis->sort('tab',array('limit' => array(1, 2))); //返回順序位置中1的元素2個(gè)(這里的2是指?jìng)€(gè)數(shù),而不是位置),返回array(3,17)
  211. $redis->sort('tab',array('limit' => array('alpha' => true))); //按首字符排序返回array(17,2,3),因?yàn)?7的首字符是'1'所以排首位置
  212. $redis->sort('tab',array('limit' => array('store' => 'ordered'))); //表示永久性排序,返回元素個(gè)數(shù)
  213. $redis->sort('tab',array('limit' => array('get' => 'pre_*'))); //使用了通配符'*'過濾元素,表示只返回以'pre_'開頭的元素
  214. /**
  215. redis管理操作
  216. */
  217. //select 指定要操作的數(shù)據(jù)庫(kù)
  218. $redis->select('mydb'); //指定為mydb,不存在則創(chuàng)建
  219. //flushdb 清空當(dāng)前庫(kù)
  220. $redis->flushdb();
  221. //move 移動(dòng)當(dāng)庫(kù)的元素到其它庫(kù)
  222. $redis->set('foo', 'bar');
  223. $redis->move('foo', 'mydb2'); //若'mydb2'庫(kù)存在
  224. //info 顯示服務(wù)當(dāng)狀態(tài)信息
  225. $redis->info();
  226. //slaveof 配置從服務(wù)器
  227. $redis->slaveof('127.0.0.1',80); //配置127.0.0.1端口80的服務(wù)器為從服務(wù)器
  228. $redis->slaveof(); //清除從服務(wù)器
  229. //同步保存服務(wù)器數(shù)據(jù)到磁盤
  230. $redis->save();
  231. //異步保存服務(wù)器數(shù)據(jù)到磁盤
  232. $redis->bgsave();
  233. //??
  234. $redis->bgrewriteaof();
  235. //返回最后更新磁盤的時(shí)間
  236. $redis->lastsave();
  237. //set/get多個(gè)key-value
  238. $mkv = array(
  239. 'usr:0001' => 'First user',
  240. 'usr:0002' => 'Second user',
  241. 'usr:0003' => 'Third user'
  242. );
  243. $redis->mset($mkv); //存儲(chǔ)多個(gè)key對(duì)應(yīng)的value
  244. $retval = $redis->mget(array_keys($mkv)); //獲取多個(gè)key對(duì)應(yīng)的value
  245. print_r($retval);
  246. //批量操作
  247. $replies = $redis->pipeline(function($pipe) {
  248. $pipe->ping();
  249. $pipe->flushdb();
  250. $pipe->incrby('counter', 10); //增量操作
  251. $pipe->incrby('counter', 30);
  252. $pipe->exists('counter');
  253. $pipe->get('counter');
  254. $pipe->mget('does_not_exist', 'counter');
  255. });
  256. print_r($replies);
  257. //CAS,事務(wù)性操作
  258. function zpop($client, $zsetKey) {
  259. $element = null;
  260. $options = array(
  261. 'cas' => true, // Initialize with support for CAS operations
  262. 'watch' => $zsetKey, // Key that needs to be WATCHed to detect changes
  263. 'retry' => 3, // Number of retries on aborted transactions, after
  264. // which the client bails out with an exception.
  265. );
  266. $txReply = $client->multiExec($options, function($tx)
  267. use ($zsetKey, &$element) {
  268. @list($element) = $tx->zrange($zsetKey, 0, 0);
  269. if (isset($element)) {
  270. $tx->multi(); // With CAS, MULTI *must* be explicitly invoked.
  271. $tx->zrem($zsetKey, $element);
  272. }
  273. });
  274. return $element;
  275. }
  276. $zpopped = zpop($redis, 'zset');
  277. echo isset($zpopped) ? "ZPOPed $zpopped" : "Nothing to ZPOP!", "\n";
  278. //對(duì)存取的key加前綴,如: 'nrk:'
  279. $redis->getProfile()->setPreprocessor(new KeyPrefixPreprocessor('nrk:'));
  280. //分布式存儲(chǔ)的一些方法
  281. $multiple_servers = array(
  282. array(
  283. 'host' => '127.0.0.1',
  284. 'port' => 6379,
  285. 'database' => 15,
  286. 'alias' => 'first',
  287. ),
  288. array(
  289. 'host' => '127.0.0.1',
  290. 'port' => 6380,
  291. 'database' => 15,
  292. 'alias' => 'second',
  293. ),
  294. );
  295. use Predis\Distribution\IDistributionStrategy;
  296. class NaiveDistributionStrategy implements IDistributionStrategy {
  297. private $_nodes, $_nodesCount;
  298. public function __constructor() {
  299. $this->_nodes = array();
  300. $this->_nodesCount = 0;
  301. }
  302. public function add($node, $weight = null) {
  303. $this->_nodes[] = $node;
  304. $this->_nodesCount++;
  305. }
  306. public function remove($node) {
  307. $this->_nodes = array_filter($this->_nodes, function($n) use($node) {
  308. return $n !== $node;
  309. });
  310. $this->_nodesCount = count($this->_nodes);
  311. }
  312. public function get($key) {
  313. $count = $this->_nodesCount;
  314. if ($count === 0) {
  315. throw new RuntimeException('No connections');
  316. }
  317. return $this->_nodes[$count > 1 ? abs(crc32($key) % $count) : 0];
  318. }
  319. public function generateKey($value) {
  320. return crc32($value);
  321. }
  322. }
  323. //配置鍵分布策略
  324. $options = array(
  325. 'key_distribution' => new NaiveDistributionStrategy(),
  326. );
  327. $redis = new Predis\Client($multiple_servers, $options);
  328. for ($i = 0; $i set("key:$i", str_pad($i, 4, '0', 0));
  329. $redis->get("key:$i");
  330. }
  331. $server1 = $redis->getClientFor('first')->info();
  332. $server2 = $redis->getClientFor('second')->info();
  333. printf("Server '%s' has %d keys while server '%s' has %d keys.\n",
  334. 'first', $server1['db15']['keys'], 'second', $server2['db15']['keys']
  335. );
復(fù)制代碼

php, redis, predis
本主題由 小貝 于 2015-11-12 08:43 移動(dòng)


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1502
276
Porce de variable PHP expliquée Porce de variable PHP expliquée Jul 17, 2025 am 04:16 AM

Les problèmes et les solutions courants pour la portée de la variable PHP incluent: 1. La variable globale ne peut pas être accessible dans la fonction, et elle doit être transmise en utilisant le mot-clé ou le paramètre global; 2. La variable statique est déclarée avec statique, et elle n'est initialisée qu'une seule fois et la valeur est maintenue entre plusieurs appels; 3. Des variables hyperglobales telles que $ _get et $ _post peuvent être utilisées directement dans n'importe quelle portée, mais vous devez faire attention au filtrage s?r; 4. Les fonctions anonymes doivent introduire des variables de portée parents via le mot clé Utiliser, et lorsque vous modifiez les variables externes, vous devez passer une référence. La ma?trise de ces règles peut aider à éviter les erreurs et à améliorer la stabilité du code.

Comment gérer les téléchargements de fichiers en toute sécurité dans PHP? Comment gérer les téléchargements de fichiers en toute sécurité dans PHP? Jul 08, 2025 am 02:37 AM

Pour gérer en toute sécurité les téléchargements de fichiers PHP, vous devez vérifier la source et taper, contr?ler le nom et le chemin du fichier, définir les restrictions du serveur et traiter les fichiers multimédias deux fois. 1. Vérifiez la source de téléchargement pour empêcher le CSRF via le jeton et détecter le type de mime réel via FINFO_FILE en utilisant le contr?le de liste blanche; 2. Renommez le fichier à une cha?ne aléatoire et déterminez l'extension pour la stocker dans un répertoire non Web en fonction du type de détection; 3. La configuration PHP limite la taille de téléchargement et le répertoire temporaire Nginx / Apache interdit l'accès au répertoire de téléchargement; 4. La bibliothèque GD résait les images pour effacer des données malveillantes potentielles.

Commentant le code en php Commentant le code en php Jul 18, 2025 am 04:57 AM

Il existe trois méthodes courantes pour le code de commentaire PHP: 1. Utiliser // ou # pour bloquer une ligne de code, et il est recommandé d'utiliser //; 2. Utiliser /.../ pour envelopper des blocs de code avec plusieurs lignes, qui ne peuvent pas être imbriquées mais peuvent être croisées; 3. Compétences combinées Commentaires tels que l'utilisation / if () {} / pour contr?ler les blocs logiques, ou pour améliorer l'efficacité avec les touches de raccourci de l'éditeur, vous devez prêter attention aux symboles de fermeture et éviter les nidification lorsque vous les utilisez.

Comment les générateurs fonctionnent-ils en PHP? Comment les générateurs fonctionnent-ils en PHP? Jul 11, 2025 am 03:12 AM

AgeneratorInphpisamemory-EfficientwaytoterateOrgedatasetsByyieldingValuesonEatatimeIntedofreturningThemallAtonce.1.GeneratorsUsEtheieldKeywordToproduceValuesondemand, ReducingMemoryUsage.2.TheyAreusefulForHandlingBigloops, ReadingLargeFiles, OR OR.

Conseils pour écrire des commentaires PHP Conseils pour écrire des commentaires PHP Jul 18, 2025 am 04:51 AM

La clé pour rédiger des commentaires PHP est de clarifier l'objectif et les spécifications. Les commentaires devraient expliquer "pourquoi" plut?t que "ce qui a été fait", en évitant la redondance ou trop de simplicité. 1. Utilisez un format unifié, tel que DocBlock (/ * /) pour les descriptions de classe et de méthode afin d'améliorer la lisibilité et la compatibilité des outils; 2. Soulignez les raisons de la logique, telles que pourquoi les sauts JS doivent être sortis manuellement; 3. Ajoutez une description d'une vue d'ensemble avant le code complexe, décrivez le processus dans les étapes et aidez à comprendre l'idée globale; 4. Utilisez TODO et FIXME Rationalement pour marquer des éléments et des problèmes de taches pour faciliter le suivi et la collaboration ultérieurs. De bonnes annotations peuvent réduire les co?ts de communication et améliorer l'efficacité de la maintenance du code.

Apprendre PHP: un guide du débutant Apprendre PHP: un guide du débutant Jul 18, 2025 am 04:54 AM

Toléarnphpeffective, startBySettingUpAlocalServerERironmentUsingToolsLILYXAMPPANDACODEDITERLIGHILLEVSCODE.1) INSTRUSITIONXAMPFORAPACHE, MYSQL, ANDPHP.2) USACODEDEDITORFORSYNTAXSUPPORT.3)

Comment accéder à un caractère dans une cha?ne par index en php Comment accéder à un caractère dans une cha?ne par index en php Jul 12, 2025 am 03:15 AM

En PHP, vous pouvez utiliser des crochets ou des accolades bouclées pour obtenir des caractères d'index spécifiques à la cha?ne, mais les crochets sont recommandés; L'index commence à partir de 0 et l'accès à l'extérieur de la plage renvoie une valeur nulle et ne peut pas se voir attribuer une valeur; MB_substr est nécessaire pour gérer les caractères multi-octets. Par exemple: $ str = "Hello"; echo $ str [0]; sortie h; et les caractères chinois tels que MB_substr ($ str, 1,1) doivent obtenir le résultat correct; Dans les applications réelles, la longueur de la cha?ne doit être vérifiée avant le boucle, les cha?nes dynamiques doivent être vérifiées pour la validité et les projets multilingues recommandent d'utiliser des fonctions de sécurité multi-octets uniformément.

Tutoriel d'installation rapide PHP Tutoriel d'installation rapide PHP Jul 18, 2025 am 04:52 AM

Toinstallphpquickly, usexAmpPonWindowsorHomebrewonMacos.1.onwindows, downloadAndInstallxAmppp, selectComponents, startapache et placefilesInhtdocs.2.

See all articles