├── .gitignore ├── README.md ├── common ├── Factory.php ├── lib │ ├── ActiveRecord.php │ └── Command.php └── models │ └── User.php ├── composer.json ├── composer.lock ├── config ├── db.php └── test.sql └── start.php /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | .idea 3 | 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WorkermanYii2 2 | 3 | [![Yii2](https://img.shields.io/badge/Powered_by-Yii_Framework-green.svg?style=flat)](http://www.yiiframework.com/) 4 | 5 | 对于熟悉使用workerman和yii2 ActiveRecod的人来说,在workerman中使用ActiveRecord是一个问题 6 | 这个项目主要解决了在workerman中使用yii2中的ActiveRecord的问题 7 | 8 | 同时,解决了在命令行下常驻进程mysql gone away的问题 9 | 10 | config文件中包含了表结构代码 11 | 12 | ```php 13 | composer install; 14 | php start.php start; 15 | 16 | ``` 17 | 18 | ```bash 19 | 20 | Workerman[start.php] start in DEBUG mode 21 | ----------------------- WORKERMAN ----------------------------- 22 | Workerman version:3.4.1 PHP version:7.0.15 23 | ------------------------ WORKERS ------------------------------- 24 | user worker listen processes status 25 | ruanjiajia demo_worker none 1 [OK] 26 | ---------------------------------------------------------------- 27 | Press Ctrl-C to quit. Start success. 28 | name is test and age is 5 29 | 30 | ``` 31 | 32 | workerman 主页 http://www.workerman.net/ 33 | yii2 主页 http://www.yiiframework.com/ 34 | yii2 ActiveRecord http://www.yiichina.com/doc/guide/2.0/db-active-record -------------------------------------------------------------------------------- /common/Factory.php: -------------------------------------------------------------------------------- 1 | 'mysql:host='.$db_config['host'].';port='.$db_config['port'].';dbname='.$db_config['dbname'], 14 | 'username' => $db_config['username'], 15 | 'password' => $db_config['password'], 16 | 'charset' => 'utf8', 17 | 'commandClass'=>"\\common\\lib\\Command", 18 | ]); 19 | } 20 | return static::$yii_db; 21 | } 22 | } -------------------------------------------------------------------------------- /common/lib/ActiveRecord.php: -------------------------------------------------------------------------------- 1 | errorInfo[1] == 2006 || $e->errorInfo[1] == 2013) { 10 | $this->db->close(); 11 | $this->db->open(); 12 | $this->pdoStatement = null ; 13 | return parent::execute(); 14 | }else{ 15 | throw $e; 16 | } 17 | } 18 | } 19 | 20 | protected function queryInternal($method, $fetchMode = null){ 21 | try { 22 | return parent::queryInternal($method, $fetchMode); 23 | } catch (\yii\db\Exception $e) { 24 | if ($e->errorInfo[1] == 2006 || $e->errorInfo[1] == 2013) { 25 | $this->db->close(); 26 | $this->db->open(); 27 | $this->pdoStatement = null ; 28 | 29 | return parent::queryInternal($method, $fetchMode); 30 | }else{ 31 | throw $e; 32 | } 33 | } 34 | } 35 | 36 | 37 | } -------------------------------------------------------------------------------- /common/models/User.php: -------------------------------------------------------------------------------- 1 | =1.7" 56 | }, 57 | "type": "bower-asset-library", 58 | "extra": { 59 | "bower-asset-main": [ 60 | "./dist/inputmask/inputmask.js", 61 | "./dist/inputmask/inputmask.extensions.js", 62 | "./dist/inputmask/inputmask.date.extensions.js", 63 | "./dist/inputmask/inputmask.numeric.extensions.js", 64 | "./dist/inputmask/inputmask.phone.extensions.js", 65 | "./dist/inputmask/inputmask.regex.extensions.js", 66 | "./dist/inputmask/jquery.inputmask.js", 67 | "./dist/inputmask/global/document.js", 68 | "./dist/inputmask/global/window.js", 69 | "./dist/inputmask/phone-codes/phone.js", 70 | "./dist/inputmask/phone-codes/phone-be.js", 71 | "./dist/inputmask/phone-codes/phone-nl.js", 72 | "./dist/inputmask/phone-codes/phone-ru.js", 73 | "./dist/inputmask/phone-codes/phone-uk.js", 74 | "./dist/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.js", 75 | "./dist/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.js", 76 | "./dist/inputmask/dependencyLibs/inputmask.dependencyLib.js", 77 | "./dist/inputmask/bindings/inputmask.binding.js" 78 | ], 79 | "bower-asset-ignore": [ 80 | "**/*", 81 | "!dist/*", 82 | "!dist/inputmask/*", 83 | "!dist/min/*", 84 | "!dist/min/inputmask/*" 85 | ] 86 | }, 87 | "license": [ 88 | "http://opensource.org/licenses/mit-license.php" 89 | ], 90 | "description": "jquery.inputmask is a jquery plugin which create an input mask.", 91 | "keywords": [ 92 | "form", 93 | "input", 94 | "inputmask", 95 | "jquery", 96 | "mask", 97 | "plugins" 98 | ] 99 | }, 100 | { 101 | "name": "bower-asset/punycode", 102 | "version": "v1.3.2", 103 | "source": { 104 | "type": "git", 105 | "url": "https://github.com/bestiejs/punycode.js.git", 106 | "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3" 107 | }, 108 | "dist": { 109 | "type": "zip", 110 | "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3", 111 | "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3", 112 | "shasum": "" 113 | }, 114 | "type": "bower-asset-library", 115 | "extra": { 116 | "bower-asset-main": "punycode.js", 117 | "bower-asset-ignore": [ 118 | "coverage", 119 | "tests", 120 | ".*", 121 | "component.json", 122 | "Gruntfile.js", 123 | "node_modules", 124 | "package.json" 125 | ] 126 | } 127 | }, 128 | { 129 | "name": "bower-asset/yii2-pjax", 130 | "version": "v2.0.6", 131 | "source": { 132 | "type": "git", 133 | "url": "https://github.com/yiisoft/jquery-pjax.git", 134 | "reference": "60728da6ade5879e807a49ce59ef9a72039b8978" 135 | }, 136 | "dist": { 137 | "type": "zip", 138 | "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/60728da6ade5879e807a49ce59ef9a72039b8978", 139 | "reference": "60728da6ade5879e807a49ce59ef9a72039b8978", 140 | "shasum": "" 141 | }, 142 | "require": { 143 | "bower-asset/jquery": ">=1.8" 144 | }, 145 | "type": "bower-asset-library", 146 | "extra": { 147 | "bower-asset-main": "./jquery.pjax.js", 148 | "bower-asset-ignore": [ 149 | ".travis.yml", 150 | "Gemfile", 151 | "Gemfile.lock", 152 | "CONTRIBUTING.md", 153 | "vendor/", 154 | "script/", 155 | "test/" 156 | ] 157 | }, 158 | "license": [ 159 | "MIT" 160 | ] 161 | }, 162 | { 163 | "name": "cebe/markdown", 164 | "version": "1.1.1", 165 | "source": { 166 | "type": "git", 167 | "url": "https://github.com/cebe/markdown.git", 168 | "reference": "c30eb5e01fe021cc5bba2f9ee0eeef96d4931166" 169 | }, 170 | "dist": { 171 | "type": "zip", 172 | "url": "https://files.phpcomposer.com/files/cebe/markdown/c30eb5e01fe021cc5bba2f9ee0eeef96d4931166.zip", 173 | "reference": "c30eb5e01fe021cc5bba2f9ee0eeef96d4931166", 174 | "shasum": "" 175 | }, 176 | "require": { 177 | "lib-pcre": "*", 178 | "php": ">=5.4.0" 179 | }, 180 | "require-dev": { 181 | "cebe/indent": "*", 182 | "facebook/xhprof": "*@dev", 183 | "phpunit/phpunit": "4.1.*" 184 | }, 185 | "bin": [ 186 | "bin/markdown" 187 | ], 188 | "type": "library", 189 | "extra": { 190 | "branch-alias": { 191 | "dev-master": "1.1.x-dev" 192 | } 193 | }, 194 | "autoload": { 195 | "psr-4": { 196 | "cebe\\markdown\\": "" 197 | } 198 | }, 199 | "notification-url": "https://packagist.org/downloads/", 200 | "license": [ 201 | "MIT" 202 | ], 203 | "authors": [ 204 | { 205 | "name": "Carsten Brandt", 206 | "email": "mail@cebe.cc", 207 | "homepage": "http://cebe.cc/", 208 | "role": "Creator" 209 | } 210 | ], 211 | "description": "A super fast, highly extensible markdown parser for PHP", 212 | "homepage": "https://github.com/cebe/markdown#readme", 213 | "keywords": [ 214 | "extensible", 215 | "fast", 216 | "gfm", 217 | "markdown", 218 | "markdown-extra" 219 | ], 220 | "time": "2016-09-14T20:40:20+00:00" 221 | }, 222 | { 223 | "name": "ezyang/htmlpurifier", 224 | "version": "v4.9.2", 225 | "source": { 226 | "type": "git", 227 | "url": "https://github.com/ezyang/htmlpurifier.git", 228 | "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4" 229 | }, 230 | "dist": { 231 | "type": "zip", 232 | "url": "https://files.phpcomposer.com/files/ezyang/htmlpurifier/6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4.zip", 233 | "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4", 234 | "shasum": "" 235 | }, 236 | "require": { 237 | "php": ">=5.2" 238 | }, 239 | "require-dev": { 240 | "simpletest/simpletest": "^1.1" 241 | }, 242 | "type": "library", 243 | "autoload": { 244 | "psr-0": { 245 | "HTMLPurifier": "library/" 246 | }, 247 | "files": [ 248 | "library/HTMLPurifier.composer.php" 249 | ] 250 | }, 251 | "notification-url": "https://packagist.org/downloads/", 252 | "license": [ 253 | "LGPL" 254 | ], 255 | "authors": [ 256 | { 257 | "name": "Edward Z. Yang", 258 | "email": "admin@htmlpurifier.org", 259 | "homepage": "http://ezyang.com" 260 | } 261 | ], 262 | "description": "Standards compliant HTML filter written in PHP", 263 | "homepage": "http://htmlpurifier.org/", 264 | "keywords": [ 265 | "html" 266 | ], 267 | "time": "2017-03-13T06:30:53+00:00" 268 | }, 269 | { 270 | "name": "workerman/workerman", 271 | "version": "v3.4.1", 272 | "source": { 273 | "type": "git", 274 | "url": "https://github.com/walkor/Workerman.git", 275 | "reference": "59506827fe677ac6df4f27c291026d17a52590d7" 276 | }, 277 | "dist": { 278 | "type": "zip", 279 | "url": "https://files.phpcomposer.com/files/walkor/Workerman/59506827fe677ac6df4f27c291026d17a52590d7.zip", 280 | "reference": "59506827fe677ac6df4f27c291026d17a52590d7", 281 | "shasum": "" 282 | }, 283 | "require": { 284 | "php": ">=5.3" 285 | }, 286 | "suggest": { 287 | "ext-event": "For better performance." 288 | }, 289 | "type": "library", 290 | "autoload": { 291 | "psr-4": { 292 | "Workerman\\": "./" 293 | } 294 | }, 295 | "notification-url": "https://packagist.org/downloads/", 296 | "license": [ 297 | "MIT" 298 | ], 299 | "authors": [ 300 | { 301 | "name": "walkor", 302 | "email": "walkor@workerman.net", 303 | "homepage": "http://www.workerman.net", 304 | "role": "Developer" 305 | } 306 | ], 307 | "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.", 308 | "homepage": "http://www.workerman.net", 309 | "keywords": [ 310 | "asynchronous", 311 | "event-loop" 312 | ], 313 | "time": "2017-04-21T00:40:51+00:00" 314 | }, 315 | { 316 | "name": "yiisoft/yii2", 317 | "version": "2.0.11.2", 318 | "source": { 319 | "type": "git", 320 | "url": "https://github.com/yiisoft/yii2-framework.git", 321 | "reference": "ee996adec1dfd7babb67bd0c604f5bd6425fe5ab" 322 | }, 323 | "dist": { 324 | "type": "zip", 325 | "url": "https://files.phpcomposer.com/files/yiisoft/yii2-framework/ee996adec1dfd7babb67bd0c604f5bd6425fe5ab.zip", 326 | "reference": "ee996adec1dfd7babb67bd0c604f5bd6425fe5ab", 327 | "shasum": "" 328 | }, 329 | "require": { 330 | "bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", 331 | "bower-asset/jquery.inputmask": "~3.2.2 | ~3.3.3", 332 | "bower-asset/punycode": "1.3.*", 333 | "bower-asset/yii2-pjax": "~2.0.1", 334 | "cebe/markdown": "~1.0.0 | ~1.1.0", 335 | "ext-ctype": "*", 336 | "ext-mbstring": "*", 337 | "ezyang/htmlpurifier": "~4.6", 338 | "lib-pcre": "*", 339 | "php": ">=5.4.0", 340 | "yiisoft/yii2-composer": "~2.0.4" 341 | }, 342 | "bin": [ 343 | "yii" 344 | ], 345 | "type": "library", 346 | "extra": { 347 | "branch-alias": { 348 | "dev-master": "2.0.x-dev" 349 | } 350 | }, 351 | "autoload": { 352 | "psr-4": { 353 | "yii\\": "" 354 | } 355 | }, 356 | "notification-url": "https://packagist.org/downloads/", 357 | "license": [ 358 | "BSD-3-Clause" 359 | ], 360 | "authors": [ 361 | { 362 | "name": "Qiang Xue", 363 | "email": "qiang.xue@gmail.com", 364 | "homepage": "http://www.yiiframework.com/", 365 | "role": "Founder and project lead" 366 | }, 367 | { 368 | "name": "Alexander Makarov", 369 | "email": "sam@rmcreative.ru", 370 | "homepage": "http://rmcreative.ru/", 371 | "role": "Core framework development" 372 | }, 373 | { 374 | "name": "Maurizio Domba", 375 | "homepage": "http://mdomba.info/", 376 | "role": "Core framework development" 377 | }, 378 | { 379 | "name": "Carsten Brandt", 380 | "email": "mail@cebe.cc", 381 | "homepage": "http://cebe.cc/", 382 | "role": "Core framework development" 383 | }, 384 | { 385 | "name": "Timur Ruziev", 386 | "email": "resurtm@gmail.com", 387 | "homepage": "http://resurtm.com/", 388 | "role": "Core framework development" 389 | }, 390 | { 391 | "name": "Paul Klimov", 392 | "email": "klimov.paul@gmail.com", 393 | "role": "Core framework development" 394 | }, 395 | { 396 | "name": "Dmitry Naumenko", 397 | "email": "d.naumenko.a@gmail.com", 398 | "role": "Core framework development" 399 | }, 400 | { 401 | "name": "Boudewijn Vahrmeijer", 402 | "email": "info@dynasource.eu", 403 | "homepage": "http://dynasource.eu", 404 | "role": "Core framework development" 405 | } 406 | ], 407 | "description": "Yii PHP Framework Version 2", 408 | "homepage": "http://www.yiiframework.com/", 409 | "keywords": [ 410 | "framework", 411 | "yii2" 412 | ], 413 | "time": "2017-02-08T09:04:32+00:00" 414 | }, 415 | { 416 | "name": "yiisoft/yii2-composer", 417 | "version": "2.0.5", 418 | "source": { 419 | "type": "git", 420 | "url": "https://github.com/yiisoft/yii2-composer.git", 421 | "reference": "3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2" 422 | }, 423 | "dist": { 424 | "type": "zip", 425 | "url": "https://files.phpcomposer.com/files/yiisoft/yii2-composer/3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2.zip", 426 | "reference": "3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2", 427 | "shasum": "" 428 | }, 429 | "require": { 430 | "composer-plugin-api": "^1.0" 431 | }, 432 | "require-dev": { 433 | "composer/composer": "^1.0" 434 | }, 435 | "type": "composer-plugin", 436 | "extra": { 437 | "class": "yii\\composer\\Plugin", 438 | "branch-alias": { 439 | "dev-master": "2.0.x-dev" 440 | } 441 | }, 442 | "autoload": { 443 | "psr-4": { 444 | "yii\\composer\\": "" 445 | } 446 | }, 447 | "notification-url": "https://packagist.org/downloads/", 448 | "license": [ 449 | "BSD-3-Clause" 450 | ], 451 | "authors": [ 452 | { 453 | "name": "Qiang Xue", 454 | "email": "qiang.xue@gmail.com" 455 | } 456 | ], 457 | "description": "The composer plugin for Yii extension installer", 458 | "keywords": [ 459 | "composer", 460 | "extension installer", 461 | "yii2" 462 | ], 463 | "time": "2016-12-20T13:26:02+00:00" 464 | } 465 | ], 466 | "packages-dev": [], 467 | "aliases": [], 468 | "minimum-stability": "stable", 469 | "stability-flags": [], 470 | "prefer-stable": false, 471 | "prefer-lowest": false, 472 | "platform": [], 473 | "platform-dev": [] 474 | } 475 | -------------------------------------------------------------------------------- /config/db.php: -------------------------------------------------------------------------------- 1 | '127.0.0.1', 4 | 'dbname'=>'test', 5 | 'username'=>'root', 6 | 'password'=>'', 7 | 'port'=>'3306' 8 | ]; -------------------------------------------------------------------------------- /config/test.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat Premium Data Transfer 3 | 4 | Source Server : localhost 5 | Source Server Type : MySQL 6 | Source Server Version : 50717 7 | Source Host : localhost 8 | Source Database : test 9 | 10 | Target Server Type : MySQL 11 | Target Server Version : 50717 12 | File Encoding : utf-8 13 | 14 | Date: 04/28/2017 16:20:47 PM 15 | */ 16 | 17 | SET NAMES utf8; 18 | SET FOREIGN_KEY_CHECKS = 0; 19 | 20 | -- ---------------------------- 21 | -- Table structure for `user` 22 | -- ---------------------------- 23 | DROP TABLE IF EXISTS `user`; 24 | CREATE TABLE `user` ( 25 | `id` int(11) NOT NULL AUTO_INCREMENT, 26 | `name` varchar(255) DEFAULT NULL, 27 | `age` int(11) DEFAULT NULL, 28 | PRIMARY KEY (`id`) 29 | ) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8; 30 | 31 | SET FOREIGN_KEY_CHECKS = 1; 32 | -------------------------------------------------------------------------------- /start.php: -------------------------------------------------------------------------------- 1 | name = 'demo_worker'; 12 | $tcp_worker->count = 1; 13 | $tcp_worker->onWorkerStart = function() 14 | { 15 | $user = new \common\models\User(); 16 | $user->setAttributes(['age'=>5, 'name' => "test", 17 | ],false); 18 | $user->save(); 19 | 20 | $another = \common\models\User::findOne($user->primaryKey); 21 | 22 | echo "name is ",$another->name," and age is ",$another->age."\n"; 23 | }; 24 | Worker::runAll(); 25 | 26 | --------------------------------------------------------------------------------