From b5eb7b9f9573687f727b98e548488b12047c4d22 Mon Sep 17 00:00:00 2001 From: dcb9 Date: Mon, 17 Oct 2016 23:23:09 +0800 Subject: [PATCH] Add docs, travis and codeclimate --- .codeclimate.yml | 18 ++++++++++++ .travis.yml | 27 ++++++++++++++++++ README.md | 40 ++++++++++++++++++++++++++ composer.json | 7 ++++- phpredis-vs-yii-redis.png | Bin 0 -> 39181 bytes tests/performance.php | 58 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 .codeclimate.yml create mode 100644 .travis.yml create mode 100644 phpredis-vs-yii-redis.png create mode 100644 tests/performance.php diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 0000000..130915b --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,18 @@ +--- +engines: + duplication: + enabled: true + config: + languages: + - php + fixme: + enabled: true + phpcodesniffer: + enabled: true + phpmd: + enabled: true +ratings: + paths: + - "**.php" +exclude_paths: +- tests/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..45d16c0 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,27 @@ +language: php + +php: + - '5.4' + - '5.5' + - '5.6' + - '7.0' + +services: + - redis-server + +before_install: echo "extension = redis.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini + +install: + - composer global require "fxp/composer-asset-plugin:^1.2.0" + - composer require codeclimate/php-test-reporter --dev + - composer install --no-progress --no-interaction + +script: + - ./vendor/bin/phpunit --coverage-clover build/logs/clover.xml + +addons: + code_climate: + repo_token: 255db28eb13c47dff54362135d879145fc97afff3eb91d97158608818bb4d1a9 + +after_script: + - vendor/bin/test-reporter diff --git a/README.md b/README.md index 50499de..83f7f4a 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,14 @@ 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)](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) +[![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) + **Notice: THIS REPO DID NOT SUPPORT ACTIVE RECORD.** Requirements @@ -52,3 +60,35 @@ return [ ] ]; ``` + +Run unit test +------------- + +You can specific your redis config + +``` +$ cp tests/config.php tests/config-local.php +$ vim tests/config-local.php +``` + +and Run + +``` +$ ./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 +------------------ + +``` +$ php tests/performance.php +``` + +![phpredis-vs-yii-redis](./phpredis-vs-yii-redis.png) diff --git a/composer.json b/composer.json index 0d49550..bdce011 100644 --- a/composer.json +++ b/composer.json @@ -11,11 +11,16 @@ ], "require": { "yiisoft/yii2": "~2.0.4", - "ext-redis": ">=2.2.7" + "ext-redis": ">=2.2.5", + "php": ">=5.4.0" }, "autoload": { "psr-4": { "dcb9\\redis\\": "" } + }, + "require-dev": { + "phpunit/phpunit": "*", + "yiisoft/yii2-redis": "^2.0" } } diff --git a/phpredis-vs-yii-redis.png b/phpredis-vs-yii-redis.png new file mode 100644 index 0000000000000000000000000000000000000000..d977632763f81bbe428643b3b577dda393413e75 GIT binary patch literal 39181 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 literal 0 HcmV?d00001 diff --git a/tests/performance.php b/tests/performance.php new file mode 100644 index 0000000..02b3c79 --- /dev/null +++ b/tests/performance.php @@ -0,0 +1,58 @@ + 'test-performance-app', + 'basePath' => __DIR__, + 'vendorPath' => dirname(__DIR__) . '/vendor', + 'components' => [ + 'phpRedis' => $phpRedisConfig, + 'yiiRedis' => $yiiRedisConfig, + ], +]); + +$count = 10000; +echo "phpredis run SET $count times in"; +$start = microtime(true); +/* @var $phpRedis \dcb9\redis\Connection */ +$phpRedis = Yii::$app->phpRedis; +$phpRedis->open(); +$phpRedis->flushdb(); +for ($i = 0; $i < $count; $i++) { + $phpRedis->set('php_redis_prefix' . $i, $i); +} +echo " " . ((microtime(true) - $start) * 1000) . " micro seconds.\n"; + +echo "yii redis run SET $count times in"; +$start = microtime(true); +/* @var $yiiRedis \yii\redis\Connection */ +$yiiRedis = Yii::$app->yiiRedis; +$yiiRedis->flushdb(); +for ($i = 0; $i < $count; $i++) { + $yiiRedis->set('yii_redis_prefix' . $i, $i); +} +echo " " . ((microtime(true) - $start) * 1000) . " micro seconds.\n"; + +echo "phpredis run GET $count times in"; +$start = microtime(true); +for ($i = 0; $i < $count; $i++) { + $phpRedis->get('php_redis_prefix' . $i); +} +echo " " . ((microtime(true) - $start) * 1000) . " micro seconds.\n"; + +echo "yii redis run GET $count times in"; +$start = microtime(true); +for ($i = 0; $i < $count; $i++) { + $yiiRedis->get('yii_redis_prefix' . $i); +} +echo " " . ((microtime(true) - $start) * 1000) . " micro seconds.\n";