From 0891e0d047c9ecdaec4b5d354ba057ec07e4ea86 Mon Sep 17 00:00:00 2001 From: Andrew <33055211+andrew-nuwber@users.noreply.github.com> Date: Wed, 26 Jun 2019 17:53:06 +0300 Subject: [PATCH] phpredis >3 compatibility (#1) * add src path, fixes for phpredis 4, update php version, other minor fixes * update picture * fix doc, fix build --- .travis.yml | 6 ++-- README.md | 40 ++++++++------------------- composer.json | 22 +++++++-------- phpredis-vs-yii-redis.png | Bin 39181 -> 50456 bytes Cache.php => src/Cache.php | 3 +- Connection.php => src/Connection.php | 11 +------- Session.php => src/Session.php | 2 +- tests/CacheTest.php | 7 ++--- tests/SessionTest.php | 14 ++++++---- tests/performance.php | 14 ++++++++++ 10 files changed, 52 insertions(+), 67 deletions(-) rename Cache.php => src/Cache.php (99%) rename Connection.php => src/Connection.php (93%) rename Session.php => src/Session.php (98%) diff --git a/.travis.yml b/.travis.yml index ba86bfb..358442d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,10 @@ language: php php: - - '5.4' - - '5.5' - - '5.6' - '7.0' - '7.1' + - '7.2' + - '7.3' services: - redis-server @@ -13,7 +12,6 @@ services: before_install: v=$(phpenv version-name); if [ ${v:0:1} -lt 7 ]; then pecl install igbinary ; yes | pecl install redis; else echo "extension = redis.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini; fi install: - - composer global require --prefer-dist "fxp/composer-asset-plugin:^1.2.0" - composer require codeclimate/php-test-reporter --dev --prefer-dist - composer install --no-progress --no-interaction --prefer-dist diff --git a/README.md b/README.md index 2890ecf..d8356ba 100644 --- a/README.md +++ b/README.md @@ -4,25 +4,10 @@ This extension provides the [redis](http://redis.io/) key-value store support fo It includes a `Cache` and `Session` storage handler in redis. - -[![Build Status](https://travis-ci.org/dcb9/yii2-phpredis.svg?branch=master)](https://travis-ci.org/dcb9/yii2-phpredis) -[![Code Climate](https://codeclimate.com/github/dcb9/yii2-phpredis/badges/gpa.svg)](https://codeclimate.com/github/dcb9/yii2-phpredis) -[![Test Coverage](https://codeclimate.com/github/dcb9/yii2-phpredis/badges/coverage.svg)](https://codeclimate.com/github/dcb9/yii2-phpredis/coverage) -[![Issue Count](https://codeclimate.com/github/dcb9/yii2-phpredis/badges/issue_count.svg)](https://codeclimate.com/github/dcb9/yii2-phpredis) -[![Latest Stable Version](https://poser.pugx.org/dcb9/yii2-phpredis/version)](https://packagist.org/packages/dcb9/yii2-phpredis) -[![Total Downloads](https://poser.pugx.org/dcb9/yii2-phpredis/downloads)](https://packagist.org/packages/dcb9/yii2-phpredis) -[![License](https://poser.pugx.org/dcb9/yii2-phpredis/license)](https://packagist.org/packages/dcb9/yii2-phpredis) +[![Build Status](https://travis-ci.org/nuwber/yii2-phpredis.svg?branch=master)](https://travis-ci.org/nuwber/yii2-phpredis) **Notice: THIS REPO DOES NOT SUPPORT ACTIVE RECORD.** -Requirements ------------- - -- PHP >= 5.4.0 -- Redis >= 2.6.12 -- ext-redis >= 2.2.7 -- Yii2 ~2.0.4 - Installation ------------ @@ -50,15 +35,20 @@ To use this extension, you have to configure the Connection class in your applic ```php return [ - //.... 'components' => [ 'redis' => [ - 'class' => 'dcb9\redis\Connection', + 'class' => \dcb9\redis\Connection::class, 'hostname' => 'localhost', 'port' => 6379, 'database' => 0, ], - ] + 'cache' => [ + 'class' => \dcb9\redis\Cache::class, + ], + 'session' => [ + 'class' => \dcb9\redis\Session::class, + ], + ], ]; ``` @@ -67,22 +57,14 @@ Run unit test You can specific your redis config -``` +```bash $ cp tests/config.php tests/config-local.php -$ vim tests/config-local.php ``` and Run -``` +```bash $ ./vendor/bin/phpunit -PHPUnit 5.6.1 by Sebastian Bergmann and contributors. - -............ 12 / 12 (100%) - -Time: 600 ms, Memory: 10.00MB - -OK (12 tests, 50 assertions) ``` Performance test diff --git a/composer.json b/composer.json index 4895ae3..013cdda 100644 --- a/composer.json +++ b/composer.json @@ -10,25 +10,25 @@ } ], "require": { - "yiisoft/yii2": "~2.0.4", - "ext-redis": ">=2.2.7", - "php": ">=5.4.0" + "ext-json": "*", + "yiisoft/yii2": "~2.0.14", + "ext-redis": ">=3", + "php": ">=7.0" }, "autoload": { "psr-4": { - "dcb9\\redis\\": "" + "dcb9\\redis\\": "src/", + "dcb9\\redis\\tests\\": "tests/" } }, "require-dev": { "phpunit/phpunit": "<6.0", "yiisoft/yii2-redis": "^2.0" }, - "config": { - "fxp-asset": { - "vcs-driver-options": { - "github-no-api": true - }, - "pattern-skip-version": "(-build|-patch)" + "repositories": [ + { + "type": "composer", + "url": "https://asset-packagist.org" } - } + ] } diff --git a/phpredis-vs-yii-redis.png b/phpredis-vs-yii-redis.png index d977632763f81bbe428643b3b577dda393413e75..b1594f4220559f9646080a056504f878adc7067c 100644 GIT binary patch literal 50456 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 diff --git a/Cache.php b/src/Cache.php similarity index 99% rename from Cache.php rename to src/Cache.php index 725c9ee..452ff7f 100644 --- a/Cache.php +++ b/src/Cache.php @@ -23,11 +23,10 @@ class Cache extends \yii\caching\Cache public function init() { parent::init(); - $this->redis = Instance::ensure($this->redis, Connection::className()); + $this->redis = Instance::ensure($this->redis, Connection::class); $this->redis->open(); } - /** * @inheritdoc */ diff --git a/Connection.php b/src/Connection.php similarity index 93% rename from Connection.php rename to src/Connection.php index 040009b..634a686 100644 --- a/Connection.php +++ b/src/Connection.php @@ -64,15 +64,6 @@ public function __construct($config = []) } } - /** - * Returns the fully qualified name of this class. - * @return string the fully qualified name of this class. - */ - public static function className() - { - return get_called_class(); - } - /** * Establishes a DB connection. * It does nothing if a DB connection has already been established. @@ -123,7 +114,7 @@ public function ping() return parent::ping() === '+PONG'; } - public function flushdb() + public function flushdb($async = null) { return parent::flushDB(); } diff --git a/Session.php b/src/Session.php similarity index 98% rename from Session.php rename to src/Session.php index 5425b61..b82abca 100644 --- a/Session.php +++ b/src/Session.php @@ -77,7 +77,7 @@ public function init() $this->redis = Yii::$app->get($this->redis); } elseif (is_array($this->redis)) { if (!isset($this->redis['class'])) { - $this->redis['class'] = Connection::className(); + $this->redis['class'] = Connection::class; } $this->redis = Yii::createObject($this->redis); } diff --git a/tests/CacheTest.php b/tests/CacheTest.php index 1b8c156..ae981bd 100644 --- a/tests/CacheTest.php +++ b/tests/CacheTest.php @@ -97,7 +97,7 @@ public function testMultiSet() $this->assertEquals('v1', $cache->get('k1')); $this->assertEquals('v2', $cache->get('k2')); $this->assertEquals('v3', $cache->get('k3')); - sleep(1); + usleep(1100000); $this->assertFalse($cache->get('k1')); $this->assertFalse($cache->get('k2')); $this->assertFalse($cache->get('k3')); @@ -107,7 +107,6 @@ public function testMultiSet() $this->assertFalse($cache->exists('k3')); $cache->multiSet($items); - sleep(2); $this->assertEquals('v1', $cache->get('k1')); $this->assertEquals('v2', $cache->get('k2')); $this->assertEquals('v3', $cache->get('k3')); @@ -118,7 +117,7 @@ public function testSetGet() $cache = $this->getCacheInstance(); $cache->set('key', 'val', 1); $this->assertEquals('val', $cache->get('key')); - sleep(1); + usleep(1100000); $this->assertFalse($cache->get('key')); $this->assertFalse($cache->exists('key')); @@ -150,7 +149,7 @@ public function testMultiAdd() 'k1' => 'v1', ], 1)); $this->assertEquals('vv55', $cache->get('k5')); - sleep(1); + usleep(1100000); $this->assertFalse($cache->exists('k5')); $this->assertTrue($cache->exists('k1')); } diff --git a/tests/SessionTest.php b/tests/SessionTest.php index 237f641..413e4f6 100644 --- a/tests/SessionTest.php +++ b/tests/SessionTest.php @@ -2,30 +2,32 @@ namespace dcb9\redis\tests; -use dcb9\redis\Connection; use Yii; +use dcb9\redis\Connection; +use dcb9\redis\Session; class SessionTest extends TestCase { public function testSession() { - $params = self::getParam(); - $params['class'] = Connection::className(); $this->mockApplication([ 'components' => [ - 'redis' => $params, - 'session' => 'dcb9\\redis\\Session', + 'redis' => array_merge(self::getParam(), [ + 'class' => Connection::class, + ]), + 'session' => Session::class, ] ]); $sessionId = 'sessionId'; $session = Yii::$app->session; - $session->setTimeout(1); $sessionData = json_encode([ 'sessionId' => $sessionId, 'username' => 'bob', ]); + $session->writeSession($sessionId, $sessionData); + $this->assertEquals($sessionData, $session->readSession($sessionId)); $this->assertTrue($session->destroySession($sessionId)); $this->assertEquals('', $session->readSession($sessionId)); diff --git a/tests/performance.php b/tests/performance.php index 02b3c79..f8a69fd 100644 --- a/tests/performance.php +++ b/tests/performance.php @@ -56,3 +56,17 @@ $yiiRedis->get('yii_redis_prefix' . $i); } echo " " . ((microtime(true) - $start) * 1000) . " micro seconds.\n"; + +echo "phpredis run DEL $count times in"; +$start = microtime(true); +for ($i = 0; $i < $count; $i++) { + $phpRedis->del('php_redis_prefix' . $i); +} +echo " " . ((microtime(true) - $start) * 1000) . " micro seconds.\n"; + +echo "yii redis run DEL $count times in"; +$start = microtime(true); +for ($i = 0; $i < $count; $i++) { + $yiiRedis->del('yii_redis_prefix' . $i); +} +echo " " . ((microtime(true) - $start) * 1000) . " micro seconds.\n";