joelcox / codeigniter-redis Goto Github PK
View Code? Open in Web Editor NEWA CodeIgniter library to interact with Redis
License: MIT License
A CodeIgniter library to interact with Redis
License: MIT License
Hi,
I was trying to modify the code to make this work but there's some magic CodeIgniter 🌈 stuff going on which I don't fully understand.
TLDR; I got it working, but it's a total hack.
Essentially I'm trying to configure two separate Redis servers - one for read 📖 requests, one for write 📝 requests.
I pushed a new branch which adds this functionality but pretty much breaks previous functionality, as seen here: https://github.com/aw/codeigniter-redis/commit/6fc6dd1ef732ffa4671e39b3438327e351552993
I'm also unsure how this affects Sparks since I don't use them.
Perhaps you can have a look at the changes I made, and suggest some improvements to enable backwards compatibility with the config file / usage (ie: not requiring $this->redis->connect()
if a scope isn't defined) ?
Let me know what's possible when you have a chance.
Thanks!
There are a few inconsistencies when performing operation on lists:
Originally reported by Benjamin MA.
Not only this command, any command...
On php version 5.6 this error occurred, but on version 7.0.22 it working wonderfully.
need to execute this on version 5.6, any help?
Here is a test
$data = "ImE6MzA6e2k6MDthOjc6e3M6MjpcImlkXCI7czo1OlwiNDYwMTdcIjtzOjQ6XCJuYW1lXCI7czo5OlwiS2VubnlkYWxlXCI7czo4OlwibGF0aXR1ZGVcIjtzOjk6XCI0Ny41MTU0MThcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4xOTg2MTRcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6MTthOjc6e3M6MjpcImlkXCI7czo1OlwiNDk1MzJcIjtzOjQ6XCJuYW1lXCI7czo5OlwiTWFwbGV3b29kXCI7czo4OlwibGF0aXR1ZGVcIjtzOjk6XCI0Ny40NjkzODJcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4xNjQzNzZcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6MjthOjc6e3M6MjpcImlkXCI7czo2OlwiMjExMDM2XCI7czo0OlwibmFtZVwiO3M6NzpcIkdsZW5jb2VcIjtzOjg6XCJsYXRpdHVkZVwiO3M6OTpcIjQ3LjUxMTE5OFwiO3M6OTpcImxvbmdpdHVkZVwiO3M6MTE6XCItMTIyLjE2MzU4MVwiO3M6NDpcInRpbWVcIjtpOjEzNzYwMzEwOTk7czo0OlwiY2l0eVwiO3M6NjpcIlJlbnRvblwiO3M6NTpcInN0YXRlXCI7czoyOlwiV0FcIjt9aTozO2E6Nzp7czoyOlwiaWRcIjtzOjY6XCIyNDA3NzBcIjtzOjQ6XCJuYW1lXCI7czo2OlwiU3Vuc2V0XCI7czo4OlwibGF0aXR1ZGVcIjtzOjk6XCI0Ny41MDI0MTFcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4xODU4NTRcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6NDthOjc6e3M6MjpcImlkXCI7czo2OlwiMjUxMjU2XCI7czo0OlwibmFtZVwiO3M6OTpcIk1heSBDcmVla1wiO3M6ODpcImxhdGl0dWRlXCI7czo5OlwiNDcuNTA5MjAzXCI7czo5OlwibG9uZ2l0dWRlXCI7czoxMTpcIi0xMjIuMTU3NzE3XCI7czo0OlwidGltZVwiO2k6MTM3NjAzMTA5OTtzOjQ6XCJjaXR5XCI7czo2OlwiUmVudG9uXCI7czo1Olwic3RhdGVcIjtzOjI6XCJXQVwiO31pOjU7YTo3OntzOjI6XCJpZFwiO3M6NjpcIjI1MTUzNFwiO3M6NDpcIm5hbWVcIjtzOjg6XCJPcmNoYXJkc1wiO3M6ODpcImxhdGl0dWRlXCI7czo5OlwiNDcuNDk0MDIxXCI7czo5OlwibG9uZ2l0dWRlXCI7czoxMTpcIi0xMjIuMTYwNDM5XCI7czo0OlwidGltZVwiO2k6MTM3NjAzMTA5OTtzOjQ6XCJjaXR5XCI7czo2OlwiUmVudG9uXCI7czo1Olwic3RhdGVcIjtzOjI6XCJXQVwiO31pOjY7YTo3OntzOjI6XCJpZFwiO3M6NjpcIjI1MzUwNVwiO3M6NDpcIm5hbWVcIjtzOjg6XCJMYUNyb3NzZVwiO3M6ODpcImxhdGl0dWRlXCI7czo4OlwiNDcuNTIyMzdcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4xOTE3MjdcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6NzthOjc6e3M6MjpcImlkXCI7czo2OlwiMjcyNDkyXCI7czo0OlwibmFtZVwiO3M6MTE6XCJTb3V0aCBVbmlvblwiO3M6ODpcImxhdGl0dWRlXCI7czo5OlwiNDcuNDg0OTY5XCI7czo5OlwibG9uZ2l0dWRlXCI7czoxMDpcIi0xMjIuMTYwMTdcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6ODthOjc6e3M6MjpcImlkXCI7czo2OlwiMjc1NTkwXCI7czo0OlwibmFtZVwiO3M6OTpcIlN0b25lZ2F0ZVwiO3M6ODpcImxhdGl0dWRlXCI7czo5OlwiNDcuNTExODMxXCI7czo5OlwibG9uZ2l0dWRlXCI7czoxMTpcIi0xMjIuMTQ1OTA4XCI7czo0OlwidGltZVwiO2k6MTM3NjAzMTA5OTtzOjQ6XCJjaXR5XCI7czo2OlwiUmVudG9uXCI7czo1Olwic3RhdGVcIjtzOjI6XCJXQVwiO31pOjk7YTo3OntzOjI6XCJpZFwiO3M6NjpcIjM5NjE1MVwiO3M6NDpcIm5hbWVcIjtzOjc6XCJDYXNjYWRlXCI7czo4OlwibGF0aXR1ZGVcIjtzOjk6XCI0Ny40NTI0OTJcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4xODU5MTVcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6MTA7YTo3OntzOjI6XCJpZFwiO3M6NjpcIjYyMzM1MFwiO3M6NDpcIm5hbWVcIjtzOjEyOlwiU291dGggUmVudG9uXCI7czo4OlwibGF0aXR1ZGVcIjtzOjk6XCI0Ny40Nzc1NzFcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4yMTA1ODZcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6MTE7YTo3OntzOjI6XCJpZFwiO3M6NjpcIjYyMzM1MVwiO3M6NDpcIm5hbWVcIjtzOjE1OlwiRWFybGluZ3RvbiBIaWxsXCI7czo4OlwibGF0aXR1ZGVcIjtzOjk6XCI0Ny40ODc0MTZcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4yMjI1MzZcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6MTI7YTo3OntzOjI6XCJpZFwiO3M6NjpcIjYyMzM1MlwiO3M6NDpcIm5hbWVcIjtzOjEyOlwiTm9ydGggUmVudG9uXCI7czo4OlwibGF0aXR1ZGVcIjtzOjk6XCI0Ny40ODcyMDhcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4yMDA2NTdcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6MTM7YTo3OntzOjI6XCJpZFwiO3M6NjpcIjYyMzM1M1wiO3M6NDpcIm5hbWVcIjtzOjEzOlwiTGliZXJ0eSBSaWRnZVwiO3M6ODpcImxhdGl0dWRlXCI7czo4OlwiNDcuNDgxODdcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4xODQxMTdcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6MTQ7YTo3OntzOjI6XCJpZFwiO3M6NjpcIjYyMzM1NFwiO3M6NDpcIm5hbWVcIjtzOjE0OlwiTWFwbGV3b29kIEdsZW5cIjtzOjg6XCJsYXRpdHVkZVwiO3M6OTpcIjQ3LjQ3NTU3NFwiO3M6OTpcImxvbmdpdHVkZVwiO3M6MTE6XCItMTIyLjE3NDYzMVwiO3M6NDpcInRpbWVcIjtpOjEzNzYwMzEwOTk7czo0OlwiY2l0eVwiO3M6NjpcIlJlbnRvblwiO3M6NTpcInN0YXRlXCI7czoyOlwiV0FcIjt9aToxNTthOjc6e3M6MjpcImlkXCI7czo2OlwiNjIzMzU1XCI7czo0OlwibmFtZVwiO3M6MTU6XCJMZWlzdXJlIEVzdGF0ZXNcIjtzOjg6XCJsYXRpdHVkZVwiO3M6OTpcIjQ3LjQ4MzE0N1wiO3M6OTpcImxvbmdpdHVkZVwiO3M6MTE6XCItMTIyLjE2Njg5OFwiO3M6NDpcInRpbWVcIjtpOjEzNzYwMzEwOTk7czo0OlwiY2l0eVwiO3M6NjpcIlJlbnRvblwiO3M6NTpcInN0YXRlXCI7czoyOlwiV0FcIjt9aToxNjthOjc6e3M6MjpcImlkXCI7czo2OlwiNjIzMzU2XCI7czo0OlwibmFtZVwiO3M6MTM6XCJIZWF0aGVyIERvd25zXCI7czo4OlwibGF0aXR1ZGVcIjtzOjk6XCI0Ny40NzkzNDZcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjEwOlwiLTEyMi4xNjAxN1wiO3M6NDpcInRpbWVcIjtpOjEzNzYwMzEwOTk7czo0OlwiY2l0eVwiO3M6NjpcIlJlbnRvblwiO3M6NTpcInN0YXRlXCI7czoyOlwiV0FcIjt9aToxNzthOjc6e3M6MjpcImlkXCI7czo2OlwiNjIzMzU3XCI7czo0OlwibmFtZVwiO3M6MTU6XCJPbmUgVW5pb24gUGxhY2VcIjtzOjg6XCJsYXRpdHVkZVwiO3M6OTpcIjQ3LjQ4NDkwN1wiO3M6OTpcImxvbmdpdHVkZVwiO3M6MTA6XCItMTIyLjE1NDg5XCI7czo0OlwidGltZVwiO2k6MTM3NjAzMTA5OTtzOjQ6XCJjaXR5XCI7czo2OlwiUmVudG9uXCI7czo1Olwic3RhdGVcIjtzOjI6XCJXQVwiO31pOjE4O2E6Nzp7czoyOlwiaWRcIjtzOjY6XCI2MjMzNThcIjtzOjQ6XCJuYW1lXCI7czo4OlwiV2luZHNvbmdcIjtzOjg6XCJsYXRpdHVkZVwiO3M6OTpcIjQ3LjQ4OTM2OVwiO3M6OTpcImxvbmdpdHVkZVwiO3M6MTE6XCItMTIyLjE1MTY2NlwiO3M6NDpcInRpbWVcIjtpOjEzNzYwMzEwOTk7czo0OlwiY2l0eVwiO3M6NjpcIlJlbnRvblwiO3M6NTpcInN0YXRlXCI7czoyOlwiV0FcIjt9aToxOTthOjc6e3M6MjpcImlkXCI7czo2OlwiNjIzMzU5XCI7czo0OlwibmFtZVwiO3M6OTpcIlZpbmV5YXJkc1wiO3M6ODpcImxhdGl0dWRlXCI7czo5OlwiNDcuNDkyNTQ2XCI7czo5OlwibG9uZ2l0dWRlXCI7czoxMTpcIi0xMjIuMTYyOTExXCI7czo0OlwidGltZVwiO2k6MTM3NjAzMTA5OTtzOjQ6XCJjaXR5XCI7czo2OlwiUmVudG9uXCI7czo1Olwic3RhdGVcIjtzOjI6XCJXQVwiO31pOjIwO2E6Nzp7czoyOlwiaWRcIjtzOjY6XCI2MjMzNjBcIjtzOjQ6XCJuYW1lXCI7czo4OlwiVmVyQ2VsbG9cIjtzOjg6XCJsYXRpdHVkZVwiO3M6OTpcIjQ3LjQ5Njk4NVwiO3M6OTpcImxvbmdpdHVkZVwiO3M6MTA6XCItMTIyLjE0ODk4XCI7czo0OlwidGltZVwiO2k6MTM3NjAzMTA5OTtzOjQ6XCJjaXR5XCI7czo2OlwiUmVudG9uXCI7czo1Olwic3RhdGVcIjtzOjI6XCJXQVwiO31pOjIxO2E6Nzp7czoyOlwiaWRcIjtzOjY6XCI2MjMzNjFcIjtzOjQ6XCJuYW1lXCI7czoxMDpcIkFzcGVud29vZHNcIjtzOjg6XCJsYXRpdHVkZVwiO3M6OTpcIjQ3LjQ5NjYxMVwiO3M6OTpcImxvbmdpdHVkZVwiO3M6MTE6XCItMTIyLjE0OTg5MVwiO3M6NDpcInRpbWVcIjtpOjEzNzYwMzEwOTk7czo0OlwiY2l0eVwiO3M6NjpcIlJlbnRvblwiO3M6NTpcInN0YXRlXCI7czoyOlwiV0FcIjt9aToyMjthOjc6e3M6MjpcImlkXCI7czo2OlwiNjIzMzYyXCI7czo0OlwibmFtZVwiO3M6MTA6XCJBc3RlciBQYXJrXCI7czo4OlwibGF0aXR1ZGVcIjtzOjk6XCI0Ny41MDQxOTJcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4xNDQ2NThcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6MjM7YTo3OntzOjI6XCJpZFwiO3M6NjpcIjYyMzM2M1wiO3M6NDpcIm5hbWVcIjtzOjEwOlwiU3VtbWVyd2luZFwiO3M6ODpcImxhdGl0dWRlXCI7czo4OlwiNDcuNTA4NDJcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4xNTIzMDNcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6MjQ7YTo3OntzOjI6XCJpZFwiO3M6NjpcIjYyMzM2NFwiO3M6NDpcIm5hbWVcIjtzOjEwOlwiU3ByaW5ndHJlZVwiO3M6ODpcImxhdGl0dWRlXCI7czo5OlwiNDcuNTA1MTE1XCI7czo5OlwibG9uZ2l0dWRlXCI7czoxMTpcIi0xMjIuMTYyMDM5XCI7czo0OlwidGltZVwiO2k6MTM3NjAzMTA5OTtzOjQ6XCJjaXR5XCI7czo2OlwiUmVudG9uXCI7czo1Olwic3RhdGVcIjtzOjI6XCJXQVwiO31pOjI1O2E6Nzp7czoyOlwiaWRcIjtzOjY6XCI2MjMzNjVcIjtzOjQ6XCJuYW1lXCI7czoxNjpcIkhvbmV5IENyZWVrIFBhcmtcIjtzOjg6XCJsYXRpdHVkZVwiO3M6OTpcIjQ3LjUwNzY2NVwiO3M6OTpcImxvbmdpdHVkZVwiO3M6MTE6XCItMTIyLjE3MzMzNVwiO3M6NDpcInRpbWVcIjtpOjEzNzYwMzEwOTk7czo0OlwiY2l0eVwiO3M6NjpcIlJlbnRvblwiO3M6NTpcInN0YXRlXCI7czoyOlwiV0FcIjt9aToyNjthOjc6e3M6MjpcImlkXCI7czo2OlwiNjIzMzY2XCI7czo0OlwibmFtZVwiO3M6MTc6XCJIb25leSBDcmVlayBSaWRnZVwiO3M6ODpcImxhdGl0dWRlXCI7czo5OlwiNDcuNTE0MDY4XCI7czo5OlwibG9uZ2l0dWRlXCI7czoxMTpcIi0xMjIuMTc0NjE0XCI7czo0OlwidGltZVwiO2k6MTM3NjAzMTA5OTtzOjQ6XCJjaXR5XCI7czo2OlwiUmVudG9uXCI7czo1Olwic3RhdGVcIjtzOjI6XCJXQVwiO31pOjI3O2E6Nzp7czoyOlwiaWRcIjtzOjY6XCI2MjMzNjdcIjtzOjQ6XCJuYW1lXCI7czoxNDpcIlByZXNpZGVudCBQYXJrXCI7czo4OlwibGF0aXR1ZGVcIjtzOjk6XCI0Ny40OTczMTRcIjtzOjk6XCJsb25naXR1ZGVcIjtzOjExOlwiLTEyMi4xNzA4NzlcIjtzOjQ6XCJ0aW1lXCI7aToxMzc2MDMxMDk5O3M6NDpcImNpdHlcIjtzOjY6XCJSZW50b25cIjtzOjU6XCJzdGF0ZVwiO3M6MjpcIldBXCI7fWk6Mjg7YTo3OntzOjI6XCJpZFwiO3M6NjpcIjYyMzM2OFwiO3M6NDpcIm5hbWVcIjtzOjEzOlwiSGlnaGJ1cnkgUGFya1wiO3M6ODpcImxhdGl0dWRlXCI7czo5OlwiNDcuNDg5NzQzXCI7czo5OlwibG9uZ2l0dWRlXCI7czoxMTpcIi0xMjIuMTgzMDg4XCI7czo0OlwidGltZVwiO2k6MTM3NjAzMTA5OTtzOjQ6XCJjaXR5XCI7czo2OlwiUmVudG9uXCI7czo1Olwic3RhdGVcIjtzOjI6XCJXQVwiO31pOjI5O2E6Nzp7czoyOlwiaWRcIjtzOjY6XCI2MjMzNjlcIjtzOjQ6XCJuYW1lXCI7czoxMjpcIkNsdm9lciBDcmVla1wiO3M6ODpcImxhdGl0dWRlXCI7czo5OlwiNDcuNTE1NTg1XCI7czo5OlwibG9uZ2l0dWRlXCI7czoxMTpcIi0xMjIuMjA1MDQ3XCI7czo0OlwidGltZVwiO2k6MTM3NjAzMTA5OTtzOjQ6XCJjaXR5XCI7czo2OlwiUmVudG9uXCI7czo1Olwic3RhdGVcIjtzOjI6XCJXQVwiO319Ig=="
$this->redis->set("test", $data);
$brokenData = $this->redis->get("test");
echo $brokenData;
the data you see will be cut off.
I'm having trouble connecting to a remote instance of redis. I have a custom port number and a password. I think it might be a bug.
The thing is I can use the redis-cli on the machine to connect to the port:
redis-cli {portnumber}
-> AUTH {password}
etc..
but I can't connect to when I set the same settings.
$config['redis_host'] = {IP} // IP address or host
$config['redis_port'] = {portnumber};
$config['redis_password'] = {password};
I thought it could be a port firewall issue but it is not as I deliberately tried an invalid port and got the error.
Could not connect to Redis at {ip}:{port}
which means this is not a port issue.
..with the correct password, I get the error
Could not connect to Redis, invalid password
I have tested the setting without a password and it works.
The password used for my testing was password and has no special characters.
The only place in the library I can find the string 'OK' is in the authentication piece. It seems like whenever this bug happens, the redis lib will only return OK repeatedly and sometimes "1" for a good few queries.
I was submitting html(generated with php) into redis for caching. When I tried to retrieve the page it would only return part of the string.
After trying to find a bug in my own code. I checked redis which was definitely storing the whole string. Codeignitor redis would only return part of the string. I tested it in Predis which returned the whole string (as expected).
$string = "<div><span>Something</span>
<p>Somestuff</p>
</div>
";
$this->redis->set('test',$string);
print $this->redis->get('test');
//Output (not as expected)
<div><span>Something</span>
After playing around with it I realised that string always terminated where an /n appeared in $string (doing a get with redis-cli shows /n in a strings stored).
I tried to find the problem in the codeignitor-redis code but could not.
Do a string replace before setting a string that could contain \n. Hopefully this helps someone else who experienced the same thing.
$string = str_replace("\n",'',$string);
Sorry if this is not a good bug report. It is my first attempt at one.
So we can get rid of those "
!
As described in #24
以下为错误示例:
php代码:
var_dump($this->redis->command('scan 0'));
输出结果:
array(2) {
[0] =>
string(3) "768"
[1] =>
string(11) "$9
file_29"
}
I had a need to use some of the set-related commands in Redis for my app,
so I went ahead and implemented them.
It'd be great if you can look over it and merge it into the master if it looks good.
*I've wrote tests to go along with it too
I'm trying the following
$value = json_encode($jsonArrayed);
$response = $redis->command('set test ' .$value);
But I get bad syntax error.
I've also tried with
$value = '''.json_encode($jsonArrayed).''';
$value = '''.addslashes(json_encode($jsonArrayed)).''';
But no luck.
Any idea how to set a json string as a value?
I'm no longer an active CodeIgniter user and thus find it harder to dedicate time to maintaining this library. There are some serious bugs which need to be taken care of, but fixing them has been shown to be difficult. The PHP landscape has changed dramatically in the past few years, favoring framework independent packages, enabled by things like Composer/Packagist.
After 148 stars and 63 forks I plan on deprecating this library next week. The source will remain available on GitHub, but I'll encourage new users to use Predis instead. This is also the recommended update path for existing users.
Thank you for using this library. I also want to extend my thanks to every contributor who helped fixing bugs and/or worked on adding cool features.
In _bulk_reply()
, we test for the number of bytes to read from the initial response, and then attempt to read that response via fgets()
. The problem is, if the bulk reply is the result of a command like INFO
, the response will be truncated as soon as the first \r\n
is encountered.
Simply changing fgets()
to fread()
in that function fixes it, as fread()
will simply read the requested length, however a call to rtrim()
is needed to remove the right most \r\n
.
All tests pass once that's done, and multi line replies (that aren't multi bulk replies) return as expected. Do you want a pull request for this? It's extremely trivial. I was halfway considering implementing a concrete info()
method to break it down into a nice convenient array (I probably will, I'm just not sure if you want it or not).
Cheers!
--Tim
Hi, I just found that this library cannot deal with almost ANY special characters. I was trying to store some JSON within some keys, however I found that nothing passed to the redis.
Then I tried the following with no luck:
$this->redis->command('set ' .'key1' . ' ');
$this->redis->command('set ' .'key1' . '!');
$this->redis->command('set ' .'key1' . '%');
I think this may due to the key and the value were not proper encoded. Wish this issue report can be a little help.
The _auth()
method does a very simple check to see if authentication worked:
$request = $this->_encode_request('AUTH ' . $password);
if (! $this->_write_request($request))
{
In the case of a failed auth attempt, _write_request()
will still evaluate to 'true' as an error string will be returned (e.g. 'invalid password').
There are three options here:
_write_request()
in _auth()
and don't care if it works, since failures will be logged anyway_write_auth_request()
that returns an explicit bool, so people can throw / error if authentication failed$auth
bool to the existing _write_request()
to be passed on to _read_request()
indicating that any failure should return falseI was leaning in the third direction, but wanted some feedback prior to implementing that.
I attempted to use SETEX
and found, to my dismay, that it wasn't getting all of the arguments it wanted. Upon inspection of the __call()
method, I quickly discovered why. I have a simple fix for this, which I will issue a pull request for in just a minute. I don't think it will fix Issue #18 (though it might provide a cleaner workaround), so I'm creating a new issue for it here.
Basically, the fix is to use implode()
on the arguments array, since the logic in _encode_request()
already properly handles an argument list separated by spaces. This is only done, of course, if the first argument is not an array. The second argument to _encode_request()
is not sent in this case.
After I used $this->redis->hvals('key')
once in a request, I found I can't use any method.
All of them return empty.
private function _bulk_reply()
{
// Get the amount of bits to be read
$value_length = (int) fgets($this->_connection);
return fgets($this->_connection, $value_length + 1);
}
this function fixed problem =
private function _bulk_reply()
{
// Get the amount of bits to be read
$value_length = (int) fgets($this->_connection);
return @fgets($this->_connection, $value_length + 1);
}
when i use like $this->redis->mget('a', 'b', 'c'); but have no keys a, b, c then ,it wil always waiting.
As thank you for his contribution #20
v0.4 will remove plaintext commands for methods, except via the Redis::command
method. This will break the current API, but I don't suspect that many people will be affected, due to the overloading capabilities of the library.
It appears that _multi_bulk_reply runs _bulk_reply repeatedly but _bulk_reply is emptying the socket of all replies.
Redis protocol sends a "CRLF" when it returns a string with zero length (
-- CIRedis::_bulk_reply --
remove: if ($value_length <= 0) return NULL;
add: if ($value_length <= 0) {
add: if ($value_length == 0) {
add: fgets($this->_connection);
add: }
add: return NULL;
add: }
in __construct() function
$this->_connection = @fsockopen($this->_ci->config->item('redis_host'), $this->_ci->config->item('redis_port'), $errno, $errstr, 3);
to
$this->_connection = @stream_socket_client("tcp://".$this->_ci->config->item('redis_host').":".$this->_ci->config->item('redis_port'), $errno, $errstr, 3);
and in _bulk_reply() function
private function _bulk_reply()
{
$value_length = (int) fgets($this->_connection);
if($value_length > 0 && $this->_connection) {
return fgets($this->_connection, $value_length + 1);
}
}
Hi, I am trying to sort a list using the following:
$users = $this->redis->sort('users', array('by' => '*->time_created'), array('limit' => '0 2'));
But I always end up with FALSE, whereas
$users = $this->redis->sort('users', array('by' => '*->time_created'), array('get' => '*->username'));
works fine although it is not what I am looking for.
Am I doing something idiotic here or there is an issue?
For the time being I use:
$users = $this->redis->command("sort users by *->time_created limit 0 2");
but would be nice to have a limit filter that works :)
Keep up the good work!
So when my redis server is not running and I try to initialize the library : $this->load->library('Redis')
, it throws an error straight away via show_error() CI function which gives a 500 http response code.
I think It will be great to have a function like getStatus() to check if redis is on and then running the query. So something like :
if($this->redis->getStatus())
$this->redis->set($key, $value);
Hello,
How can i set particular cache for particular time. ?
I have tried using this : $this->redis->set('foo2', 'bar',500); but its not working. please some one look in to this.
Thanks,
Hardik Devariya
Running PHP 5.3.15. With $config['password'] set to "" (not set), $password argument is actually set and doesn't default to NULL.
I changed if($password !== NULL) to if($password !== NULL && $password !== '')
which works for me. May be a better way.
I'm a GitHub n00b so if there's something I should do here, please let me know. Thanks.
Thanks for this great script!
Can you add pipeline or some other "batch get" solution for this script?
I think it will be very helpful for me and others :)
Run the AUTH comment on init when a password is set in the configuration
While I was retrieving some JSON (rather huge sets) I noticed that _single_line_reply()
was returning only a (large) random chunk of what it should. The chunk was usually 8192 bytes, but sometimes 16k. The same thing happened with base64 encoded data larger than ~32k .
Identical behavior happens when data is just serialized prior to setting. Yet, a GET
from redis console produces the entire thing perfectly.
My understanding of fgets()
is the same as in the documentation:
Reading ends when length - 1 bytes have been read, on a newline (which is included in the return value), or on EOF (whichever comes first). If no length is specified, it will keep reading from the stream until it reaches the end of the line.
Try it with any large serialized array ( > 8k) e.g.
$redis->set('foo', serialize($big_array));
Then observe what you see via $redis->get('foo')
vs what you see via GET foo
in the console. I checked the points at which it chomped the data and there was no newline (escaped or otherwise) at that point. Always at 8k or 16k.
Can anyone reproduce this?
// Display an error message if connection failed
if ( ! $this->_connection)
{
show_error('Could not connect to Redis at ' . $config['host'] . ':' . $config['redis_port']);
}
should be $config['port'] instead, right? the port wasn't appearing in the error message for me.
I'm not able to use a function-call like $this->redis->hset('bucket', 'key', 'Value with spaces');
Each major Redis command should be tested so there is a more granular way of ensuring the quality of this lib. Each test should include all notations this lib supports (except the plain text version, of course).
i received an undefined variable notice on line 361 of the library- can be fixed by initialising the response variable with an empty array
I just migrated the unit test controller to PHPUnit, but the quality of these tests is seriously lacking. These tests are rather integration tests (black box approach) rather than proper unit tests.
Hello, thank you for your code, but i have a problem.How can i use this in cli?
My error:
php index.php crons/DymcCodeCron sendMsg
A PHP Error was encountered
Severity: Warning
Message: Redis::__construct() expects exactly 0 parameters, 1 given
Filename: /system/core/Loader.php
Line Number: 1281
Backtrace:
File: /controllers/crons/DymcCodeCron.php
Line: 10
Function: library
File: /index.php
Line: 315
Function: require_once
Hi again.
When using multi & exec with hmget function, every third request receive a correct response.
Checked without multi and it works...
Any idea?
$this->redis->multi();
$this->redis->hmget('member.123',array('profile'));
$this->redis->hmget('member.234',array('profile'));
$this->redis->hmget('member.345',array('profile'));
$this->redis->hmget('member.456',array('profile'));
var_dump($this->redis->exec());
array(970) {
[0]=>
string(1) "$"
[1]=>
bool(false)
[2]=>
string(189) "GOOD RESPONSE"
[3]=>
string(1) "$"
}
Thanks!
The server that I'm trying to run this Spark on has a compiled version of Redis for PHP (https://github.com/nicolasff/phpredis). So naming the class Redis creates a conflict and errors out. Solution would be to rename the spark to PHP-Redis or something along those lines.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.