Marks a Lua script for EVAL and EVALSHA as a read-only operation. When
the behaviour of a script can be decided only at runtime depending on
its arguments, a callable object can be provided to dynamically check
if the passed instance of EVAL or EVALSHA performs write operations or
not.
public setScriptReadOnly ( string $script, mixed $readonly = true ) | ||
$script | string | Body of the Lua script. |
$readonly | mixed | A boolean value or a callable object. |
table.insert(hashes, redis.call('hgetall', key)) end return hashes LUA; public function getScript() { return self::BODY; } } // ------------------------------------------------------------------------- // $parameters = array('tcp://127.0.0.1:6379/?alias=master', 'tcp://127.0.0.1:6380/?alias=slave'); $options = array('profile' => function ($options, $option) { $profile = $options->getDefault($option); $profile->defineCommand('hmgetall', 'HashMultipleGetAll'); return $profile; }, 'replication' => function () { $strategy = new ReplicationStrategy(); $strategy->setScriptReadOnly(HashMultipleGetAll::BODY); $replication = new MasterSlaveReplication($strategy); return $replication; }); // ------------------------------------------------------------------------- // $client = new Predis\Client($parameters, $options); // Execute the following commands on the master server using redis-cli: // $ ./redis-cli HMSET metavars foo bar hoge piyo // $ ./redis-cli HMSET servers master host1 slave host2 $hashes = $client->hmgetall('metavars', 'servers'); $replication = $client->getConnection(); $stillOnSlave = $replication->getCurrent() === $replication->getConnectionById('slave'); echo "Is still on slave? ", $stillOnSlave ? 'YES!' : 'NO!', PHP_EOL; var_export($hashes);
/** * @group disconnected */ public function testSetLuaScriptAsReadOperationWorksWithScriptedCommandAndCallableCheck() { $strategy = new ReplicationStrategy(); $command = $this->getMock('Predis\\Command\\ScriptedCommand', array('getScript')); $command->expects($this->any())->method('getScript')->will($this->returnValue($script = 'return true')); $command->setArguments(array('trigger', false)); $strategy->setScriptReadOnly($script, true); $this->assertTrue($strategy->isReadOperation($command)); }