標籤:
博主在一次項目中,使用了工具類中的Redis類,因為該Redis沒有封裝管道pipeline和exec命令,所以就大筆一揮來了一段__call;
代碼如下(其中$this->_connect()返回的為一個Redis執行個體)。
之後的事情感覺中文已經無法表述,上代碼就是類似這樣的
$redis->pipeline();
$redis->lpop($key);
$redis->lpop($key);
$redis->exec();
自己寫了簡單例子測試之後,正常情況下應該會返回$key隊列中的兩個棧頂元素,即array(‘item1‘,‘item2‘);但是該次最終的返回結果竟然是NULL,博主這時候
就超級疑惑,難道是call_user_fun_array()這個申請的函數是木有傳回值,尼瑪,那這樣不是坑死老爹嗎。而這僅僅是個人猜測,php寶冊在手不虛,發現並無此
說明,但是有一個簡單的例子為,看下面的例子加親自測試是有傳回值,那就是說此次猜想不成功。
好吧,只能繼續debug了,許久之後依然木有發現問題,請教公司一同事,他來了之後發現你說那就既然是$this->_connect()是一個redis對象,
那上面不是還有一個$this->_redis的控制代碼嗎,直接替換,之後在神奇的事情發生了,尼瑪有傳回值了。
好吧,那問題就可以猜想一二了,這個肯定說明了$this->_connect()和$this->_redis肯定有哪些地方不太一樣,如上面的代碼,我們直接把兩個變數dump了出來。
之後發現是這樣的,如看官們應該明白這根本是不同的兩個資源。
感覺知道問題所在了,返回了看_connect()函數,發現裡面是沒有Redis單例的,每次都是new了一個Redis對象。
所以還不知道問題所在的看官可以繼續跟著哥往下走。
這個問題呢,我們技術人啥也不說了,上代碼,在一批redis的操作命令中,動用了三個不同的redis對象,第三次是直接exec,連pipeline都木有,那肯定是NULL.
這你敢相信,反正我是信了,我也是醉了,當然也是我自己坑了自己。問題到此真相大白。有一次自坑的打怪之路。
一次Redis的使用Bug記錄(exec)