Я получал следующее сообщение: Serialization of Closure is not allowed
при попытке выполнить phpunit
.Мне предложили установить SuperClosure\Serializer
и сериализовать функцию закрытия. Я сделал это, и теперь он ломается, потому что Predis Cluster Options constructor
должен быть либо вызываемой функцией, либо строкой значения redis или predis, поэтому сериализация ломает опции строковых параметров
Вот мой код
// load redis cluster
use Selector\Cache\Redis\ClusterClient as SelectorRedisClusterClient;
use Selector\Cache\Redis\NaiveDistributor as SelectorNaiveDistributor;
use Selector\Cache\Redis\PredisCluster as SelectorPredisCluster;
use Selector\Cache\Redis\PredisStrategy as SelectorPredisStrategy;
use SuperClosure\Serializer;
$serializer = new Serializer();
$clusterFunc = function() {
$distributor = new SelectorNaiveDistributor();
$strategy = new SelectorPredisStrategy($distributor);
$cluster = new SelectorPredisCluster($strategy);
return $cluster;
};
$clusterFuncSer = $serializer->serialize($clusterFunc);
$options = array(
//'cluster' => function () {
// $distributor = new SelectorNaiveDistributor();
// $strategy = new SelectorPredisStrategy($distributor);
// $cluster = new SelectorPredisCluster($strategy);
// return $cluster;
//}
'cluster'=>$clusterFuncSer
);
$redisServerData=$buildData['cache']['redis']['server'];
if(!\Selector\Zf\Stdlib\ArrayUtils::isList($redisServerData)){
$tmp=[[
'host'=>$redisServerData['host'],
'port'=>$redisServerData['port'],
'database'=>$redisServerData['database'],
'alias'=>$redisServerData['alias'],
]];
$redisServerData=$tmp;
}
$redis = new SelectorRedisClusterClient($redisServerData,$options);
Новая ошибка:
Fatal error: Uncaught InvalidArgumentException: String value for the cluster option must be either
predis or
redis in /srv/awsconnect/connect/vendor/predis/predis/src/Configuration/Option/Cluster.php:45
Так что похоже на сериализацию функции в строку, но затемRedis Client
ломается, так как ищет массив, как я, или строку со значением redis
или predis
Не уверен, что здесь делать.