colinmollenhour/credis 1.17 bug
Call to a member function getMode() on nullvendor\colinmollenhour\credis\Client.php(783): Credis_Client->assertNotPipelineOrMulti('Credis_Client::...')
错误代码
#Credis_Client vendor\colinmollenhour\credis\Client.php/*** @param ?int $Iterator* @param string $pattern* @param int $count* @return bool|array* @throws CredisException*/public function scan(&$Iterator, $pattern = null, $count = null) {$this->assertNotPipelineOrMulti(__METHOD__);return $this->__call('scan', array(&$Iterator, $pattern, $count));}/*** @param string $caller* @return void* @throws CredisException*/protected function assertNotPipelineOrMulti($caller) {if ($this->standalone && ($this->isMulti || $this->usePipeline) ||// phpredis triggers a php fatal error, so do the check before!$this->standalone && ($this->redis->getMode() === Redis::MULTI || $this->redis->getMode() === Redis::PIPELINE)) {throw new CredisException('multi()/pipeline() mode can not be used with ' . $caller);}}
报错是这个代码 "$this->redis->getMode()",其中$this->redis为空。
调用代码
$client = new Credis_Client();
$r = $client->select(15);
$data = $client->scan($client, "keywords:*", 1);
var_dump($data);
此时代码正常
$host = '127.0.0.1';
$port = 6379;
$timeout = null;
$persistent = '';
$db = 15;
$client = new Credis_Client($host,$port,$timeout ,$persistent,$db);$data = $client->scan($client, "keywords:*", 1);
var_dump($data);
var_dump(123);
会报上面的错误,就是Credis_Client构造里$this->redis没初始化。
使用懒加载,都是调用方法之后实现连接,实例化$this->redis。
可以按照正常顺序调用,也可以改代码。
修改后代码
protected function assertNotPipelineOrMulti($caller) {if (empty($this->redis)) {$this->connect();}if ($this->standalone && ($this->isMulti || $this->usePipeline) ||// phpredis triggers a php fatal error, so do the check before!$this->standalone && ($this->redis->getMode() === Redis::MULTI || $this->redis->getMode() === Redis::PIPELINE)) {throw new CredisException('multi()/pipeline() mode can not be used with ' . $caller);}}
