├── .gitignore ├── LICENSE.md ├── README.md ├── composer.json ├── composer.lock ├── deploy.php ├── docs ├── enable-feature-ssh-forward-agent.md ├── run-deployer-on-homestead.md └── setting-up-and-add-a-deployer-user-to-ec2.md ├── setup ├── chmodr.sh ├── key │ └── .gitkeep └── setup.sh ├── shared └── app │ └── config │ ├── app.php.tpl │ ├── vhost_apache.conf.tpl │ └── vhost_nginx.conf.tpl └── stage ├── dev.php └── servers.yml /.gitignore: -------------------------------------------------------------------------------- 1 | # User specific & automatically generated files # 2 | ################################################# 3 | /tmp 4 | /vendor 5 | /phpunit.xml 6 | /phpcs.xml 7 | *.log 8 | 9 | # IDE and editor specific files # 10 | ################################# 11 | /nbproject 12 | /.idea 13 | 14 | # OS generated files # 15 | ###################### 16 | .DS_Store 17 | .DS_Store? 18 | ._* 19 | .Spotlight-V100 20 | .Trashes 21 | Icon? 22 | ehthumbs.db 23 | Thumbs.db 24 | *.mo 25 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright © 2015-2017 Oanh Nguyen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | [![Join the chat at https://gitter.im/oanhnn/deployer-example](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/oanhnn/deployer-example?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) 4 | 5 | An example for use [Deployer](http://deployer.org) to deployment PHP project. 6 | In this example, i'm will deploy a project using [Slim framework](https://github.com/slimphp/Slim) follow my [slim-skeleton](https://github.com/oanhnn/slim-skeleton) 7 | 8 | See [http://deployer.org](http://deployer.org) for more information and documentation about Deployer. 9 | 10 | # Requirements 11 | 12 | * PHP 5.6.0 and up. 13 | 14 | That's all! 15 | 16 | > If PHP 5.4.x or 5.5.x, please using branch 3.x (using Deployer 3.x) 17 | 18 | You can install [ssh2 extension](http://php.net/manual/en/book.ssh2.php) to speedup deployment process and 19 | enable [sockets](http://php.net/manual/en/book.sockets.php) for parallel deployment. 20 | 21 | 22 | # Installation 23 | 24 | Clone with `git` and run `composer install` 25 | 26 | ```shell 27 | $ git clone git@github.com:oanhnn/deployer-example.git 28 | $ cd 29 | $ composer install 30 | ``` 31 | 32 | or using [`composer`](http://getcomposer.org) 33 | 34 | ```shell 35 | $ composer create-project oanhnn/deployer-example 36 | ``` 37 | 38 | # Usage 39 | 40 | > In this example using forward agent feature, to run it, please [enable `ssh` forward agent](https://github.com/oanhnn/deployer-example/blob/master/docs/enable-feature-ssh-forward-agent.md) the first. 41 | > If using ssh2 extension, please require package `"herzult/php-ssh": "~1.0"` and add line `set('ssh_type', 'ext-ssh2');` to `deploy.php` file before deployment. 42 | > If using native ssh client, please add line `set('ssh_type', 'native');` to `deploy.php` file before deployment. 43 | 44 | Customize `stage/dev.php` or make a copy and write your own stages. 45 | 46 | First deployment: 47 | ```shell 48 | $ bin/dep deploy:configure 49 | $ bin/dep deploy 50 | ``` 51 | 52 | Next deployments: 53 | ```shell 54 | $ bin/dep deploy 55 | ``` 56 | 57 | Using options `-vvv` for debug 58 | ```shell 59 | $ bin/dep deploy -vvv 60 | ``` 61 | 62 | Contributing 63 | ------------ 64 | All code contributions must go through a pull request and approved by a core developer before being merged. 65 | This is to ensure proper review of all the code. 66 | 67 | Fork the project, create a feature branch, and send a pull request. 68 | 69 | To ensure a consistent code base, you should make sure the code follows 70 | the [PSR-1](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md). 71 | 72 | If you would like to help take a look at the [list of issues](https://github.com/oanhnn/deployer-example/issues). 73 | 74 | License 75 | ------- 76 | This project is released under the MIT License. 77 | Copyright © 2015-2017 Oanh Nguyen. 78 | Please see [License File](LICENSE.md) for more information. 79 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oanhnn/deployer-example", 3 | "type": "application", 4 | "description": "Example project for deployment PHP project (Slim Framwork) by Deployer", 5 | "keyworks": ["Deployer", "deployment", "deploy", "Slim"], 6 | "license": "MIT", 7 | "homepage": "https://github.com/oanhnn/deployer-example", 8 | "support": { 9 | "issues": "https://github.com/oanhnn/deployer-example/issues", 10 | "source": "https://github.com/oanhnn/deployer-example" 11 | }, 12 | "authors": [ 13 | { 14 | "name": "Oanh Nguyen", 15 | "email": "oanhnn.bk@gmail.com", 16 | "homepage": "https://oanhnn.github.io/" 17 | } 18 | ], 19 | "minimum-stability": "stable", 20 | "require": { 21 | "php": ">=5.6.0" 22 | }, 23 | "require-dev": { 24 | "deployer/deployer": "~4.1" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "2a80fd4dcea5ea0d54bf30572118088d", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "deployer/deployer", 12 | "version": "v4.1.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/deployphp/deployer.git", 16 | "reference": "130c3d4aeb583146ef352c30d0af44ddd706f863" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/deployphp/deployer/zipball/130c3d4aeb583146ef352c30d0af44ddd706f863", 21 | "reference": "130c3d4aeb583146ef352c30d0af44ddd706f863", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "deployer/phar-update": "^1.0", 26 | "elfet/pure": "~2.0", 27 | "monolog/monolog": "^1.21", 28 | "php": ">=5.6.0", 29 | "phpseclib/phpseclib": "~2.0", 30 | "pimple/pimple": "~3.0", 31 | "symfony/console": "~2.6|~3.0", 32 | "symfony/finder": "~2.6|~3.0", 33 | "symfony/process": "~2.6|~3.0", 34 | "symfony/yaml": "~2.6|~3.0" 35 | }, 36 | "require-dev": { 37 | "phpunit/phpunit": "~5.4" 38 | }, 39 | "suggest": { 40 | "ext-sockets": "For parallel deployment", 41 | "herzult/php-ssh": "For SSH support through native SSH2 extension" 42 | }, 43 | "bin": [ 44 | "bin/dep" 45 | ], 46 | "type": "library", 47 | "autoload": { 48 | "psr-4": { 49 | "Deployer\\": "src/" 50 | } 51 | }, 52 | "notification-url": "https://packagist.org/downloads/", 53 | "license": [ 54 | "MIT" 55 | ], 56 | "authors": [ 57 | { 58 | "name": "Anton Medvedev", 59 | "email": "anton@medv.io" 60 | } 61 | ], 62 | "description": "Deployment Tool", 63 | "homepage": "https://deployer.org", 64 | "time": "2017-01-19T05:37:04+00:00" 65 | }, 66 | { 67 | "name": "deployer/phar-update", 68 | "version": "v1.0.0", 69 | "source": { 70 | "type": "git", 71 | "url": "https://github.com/deployphp/phar-update.git", 72 | "reference": "df2670056d9922b6f02e055ce9846508656b02aa" 73 | }, 74 | "dist": { 75 | "type": "zip", 76 | "url": "https://api.github.com/repos/deployphp/phar-update/zipball/df2670056d9922b6f02e055ce9846508656b02aa", 77 | "reference": "df2670056d9922b6f02e055ce9846508656b02aa", 78 | "shasum": "" 79 | }, 80 | "require": { 81 | "herrera-io/phar-update": "~2.0", 82 | "php": ">=5.3.3", 83 | "symfony/console": "^2.1|^3.0" 84 | }, 85 | "require-dev": { 86 | "herrera-io/box": "~1.0", 87 | "herrera-io/phpunit-test-case": "1.*", 88 | "phpunit/phpunit": "3.7.*" 89 | }, 90 | "type": "library", 91 | "autoload": { 92 | "psr-4": { 93 | "Deployer\\Component\\PharUpdate\\": "src/" 94 | } 95 | }, 96 | "notification-url": "https://packagist.org/downloads/", 97 | "license": [ 98 | "MIT" 99 | ], 100 | "authors": [ 101 | { 102 | "name": "Kevin Herrera", 103 | "email": "kevin@herrera.io", 104 | "homepage": "http://kevin.herrera.io" 105 | }, 106 | { 107 | "name": "Anton Medvedev", 108 | "email": "anton@medv.io", 109 | "homepage": "http://medv.io" 110 | } 111 | ], 112 | "description": "Integrates Phar Update to Symfony Console.", 113 | "homepage": "https://github.com/deployphp/phar-update", 114 | "keywords": [ 115 | "console", 116 | "phar", 117 | "update" 118 | ], 119 | "time": "2016-04-06T13:32:59+00:00" 120 | }, 121 | { 122 | "name": "elfet/pure", 123 | "version": "v2.0.0", 124 | "source": { 125 | "type": "git", 126 | "url": "https://github.com/elfet/purephp.git", 127 | "reference": "9d6422d31b89c4f79c322df2a7772936a8bc74a1" 128 | }, 129 | "dist": { 130 | "type": "zip", 131 | "url": "https://api.github.com/repos/elfet/purephp/zipball/9d6422d31b89c4f79c322df2a7772936a8bc74a1", 132 | "reference": "9d6422d31b89c4f79c322df2a7772936a8bc74a1", 133 | "shasum": "" 134 | }, 135 | "require": { 136 | "react/react": "~0.4", 137 | "symfony/console": "~2.6|~3.0", 138 | "symfony/debug": "~2.6|~3.0", 139 | "symfony/expression-language": "~2.6|~3.0" 140 | }, 141 | "require-dev": { 142 | "phpunit/phpunit": "~4.4", 143 | "symfony/finder": "~2.6|~3.0", 144 | "symfony/process": "~2.6|~3.0" 145 | }, 146 | "bin": [ 147 | "pure" 148 | ], 149 | "type": "library", 150 | "autoload": { 151 | "psr-4": { 152 | "Pure\\": "src/" 153 | } 154 | }, 155 | "notification-url": "https://packagist.org/downloads/", 156 | "license": [ 157 | "MIT" 158 | ], 159 | "authors": [ 160 | { 161 | "name": "Anton Medvedev", 162 | "email": "anton@medv.io" 163 | } 164 | ], 165 | "description": "Pure PHP key-value storage", 166 | "time": "2016-03-19T14:26:03+00:00" 167 | }, 168 | { 169 | "name": "evenement/evenement", 170 | "version": "v2.0.0", 171 | "source": { 172 | "type": "git", 173 | "url": "https://github.com/igorw/evenement.git", 174 | "reference": "f6e843799fd4f4184d54d8fc7b5b3551c9fa803e" 175 | }, 176 | "dist": { 177 | "type": "zip", 178 | "url": "https://api.github.com/repos/igorw/evenement/zipball/f6e843799fd4f4184d54d8fc7b5b3551c9fa803e", 179 | "reference": "f6e843799fd4f4184d54d8fc7b5b3551c9fa803e", 180 | "shasum": "" 181 | }, 182 | "require": { 183 | "php": ">=5.4.0" 184 | }, 185 | "type": "library", 186 | "extra": { 187 | "branch-alias": { 188 | "dev-master": "2.0-dev" 189 | } 190 | }, 191 | "autoload": { 192 | "psr-0": { 193 | "Evenement": "src" 194 | } 195 | }, 196 | "notification-url": "https://packagist.org/downloads/", 197 | "license": [ 198 | "MIT" 199 | ], 200 | "authors": [ 201 | { 202 | "name": "Igor Wiedler", 203 | "email": "igor@wiedler.ch", 204 | "homepage": "http://wiedler.ch/igor/" 205 | } 206 | ], 207 | "description": "Événement is a very simple event dispatching library for PHP", 208 | "keywords": [ 209 | "event-dispatcher", 210 | "event-emitter" 211 | ], 212 | "time": "2012-11-02T14:49:47+00:00" 213 | }, 214 | { 215 | "name": "guzzlehttp/psr7", 216 | "version": "1.9.1", 217 | "source": { 218 | "type": "git", 219 | "url": "https://github.com/guzzle/psr7.git", 220 | "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b" 221 | }, 222 | "dist": { 223 | "type": "zip", 224 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b", 225 | "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b", 226 | "shasum": "" 227 | }, 228 | "require": { 229 | "php": ">=5.4.0", 230 | "psr/http-message": "~1.0", 231 | "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" 232 | }, 233 | "provide": { 234 | "psr/http-message-implementation": "1.0" 235 | }, 236 | "require-dev": { 237 | "ext-zlib": "*", 238 | "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" 239 | }, 240 | "suggest": { 241 | "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" 242 | }, 243 | "type": "library", 244 | "autoload": { 245 | "files": [ 246 | "src/functions_include.php" 247 | ], 248 | "psr-4": { 249 | "GuzzleHttp\\Psr7\\": "src/" 250 | } 251 | }, 252 | "notification-url": "https://packagist.org/downloads/", 253 | "license": [ 254 | "MIT" 255 | ], 256 | "authors": [ 257 | { 258 | "name": "Graham Campbell", 259 | "email": "hello@gjcampbell.co.uk", 260 | "homepage": "https://github.com/GrahamCampbell" 261 | }, 262 | { 263 | "name": "Michael Dowling", 264 | "email": "mtdowling@gmail.com", 265 | "homepage": "https://github.com/mtdowling" 266 | }, 267 | { 268 | "name": "George Mponos", 269 | "email": "gmponos@gmail.com", 270 | "homepage": "https://github.com/gmponos" 271 | }, 272 | { 273 | "name": "Tobias Nyholm", 274 | "email": "tobias.nyholm@gmail.com", 275 | "homepage": "https://github.com/Nyholm" 276 | }, 277 | { 278 | "name": "Márk Sági-Kazár", 279 | "email": "mark.sagikazar@gmail.com", 280 | "homepage": "https://github.com/sagikazarmark" 281 | }, 282 | { 283 | "name": "Tobias Schultze", 284 | "email": "webmaster@tubo-world.de", 285 | "homepage": "https://github.com/Tobion" 286 | } 287 | ], 288 | "description": "PSR-7 message implementation that also provides common utility methods", 289 | "keywords": [ 290 | "http", 291 | "message", 292 | "psr-7", 293 | "request", 294 | "response", 295 | "stream", 296 | "uri", 297 | "url" 298 | ], 299 | "support": { 300 | "issues": "https://github.com/guzzle/psr7/issues", 301 | "source": "https://github.com/guzzle/psr7/tree/1.9.1" 302 | }, 303 | "funding": [ 304 | { 305 | "url": "https://github.com/GrahamCampbell", 306 | "type": "github" 307 | }, 308 | { 309 | "url": "https://github.com/Nyholm", 310 | "type": "github" 311 | }, 312 | { 313 | "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", 314 | "type": "tidelift" 315 | } 316 | ], 317 | "time": "2023-04-17T16:00:37+00:00" 318 | }, 319 | { 320 | "name": "herrera-io/json", 321 | "version": "1.0.3", 322 | "source": { 323 | "type": "git", 324 | "url": "https://github.com/kherge-php/json.git", 325 | "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1" 326 | }, 327 | "dist": { 328 | "type": "zip", 329 | "url": "https://api.github.com/repos/kherge-php/json/zipball/60c696c9370a1e5136816ca557c17f82a6fa83f1", 330 | "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1", 331 | "shasum": "" 332 | }, 333 | "require": { 334 | "ext-json": "*", 335 | "justinrainbow/json-schema": ">=1.0,<2.0-dev", 336 | "php": ">=5.3.3", 337 | "seld/jsonlint": ">=1.0,<2.0-dev" 338 | }, 339 | "require-dev": { 340 | "herrera-io/phpunit-test-case": "1.*", 341 | "mikey179/vfsstream": "1.1.0", 342 | "phpunit/phpunit": "3.7.*" 343 | }, 344 | "type": "library", 345 | "extra": { 346 | "branch-alias": { 347 | "dev-master": "1.0-dev" 348 | } 349 | }, 350 | "autoload": { 351 | "files": [ 352 | "src/lib/json_version.php" 353 | ], 354 | "psr-0": { 355 | "Herrera\\Json": "src/lib" 356 | } 357 | }, 358 | "notification-url": "https://packagist.org/downloads/", 359 | "license": [ 360 | "MIT" 361 | ], 362 | "authors": [ 363 | { 364 | "name": "Kevin Herrera", 365 | "email": "kevin@herrera.io", 366 | "homepage": "http://kevin.herrera.io" 367 | } 368 | ], 369 | "description": "A library for simplifying JSON linting and validation.", 370 | "homepage": "http://herrera-io.github.com/php-json", 371 | "keywords": [ 372 | "json", 373 | "lint", 374 | "schema", 375 | "validate" 376 | ], 377 | "abandoned": "kherge/json", 378 | "time": "2013-10-30T16:51:34+00:00" 379 | }, 380 | { 381 | "name": "herrera-io/phar-update", 382 | "version": "2.0.0", 383 | "source": { 384 | "type": "git", 385 | "url": "https://github.com/kherge-abandoned/php-phar-update.git", 386 | "reference": "15643c90d3d43620a4f45c910e6afb7a0ad4b488" 387 | }, 388 | "dist": { 389 | "type": "zip", 390 | "url": "https://api.github.com/repos/kherge-abandoned/php-phar-update/zipball/15643c90d3d43620a4f45c910e6afb7a0ad4b488", 391 | "reference": "15643c90d3d43620a4f45c910e6afb7a0ad4b488", 392 | "shasum": "" 393 | }, 394 | "require": { 395 | "herrera-io/json": "1.*", 396 | "herrera-io/version": "1.*", 397 | "php": ">=5.3.3" 398 | }, 399 | "require-dev": { 400 | "herrera-io/phpunit-test-case": "1.*", 401 | "mikey179/vfsstream": "1.1.0", 402 | "phpunit/phpunit": "3.7.*" 403 | }, 404 | "type": "library", 405 | "extra": { 406 | "branch-alias": { 407 | "dev-master": "2.0-dev" 408 | } 409 | }, 410 | "autoload": { 411 | "files": [ 412 | "src/lib/constants.php" 413 | ], 414 | "psr-0": { 415 | "Herrera\\Phar\\Update": "src/lib" 416 | } 417 | }, 418 | "notification-url": "https://packagist.org/downloads/", 419 | "license": [ 420 | "MIT" 421 | ], 422 | "authors": [ 423 | { 424 | "name": "Kevin Herrera", 425 | "email": "kevin@herrera.io", 426 | "homepage": "http://kevin.herrera.io" 427 | } 428 | ], 429 | "description": "A library for self-updating Phars.", 430 | "homepage": "http://herrera-io.github.com/php-phar-update", 431 | "keywords": [ 432 | "phar", 433 | "update" 434 | ], 435 | "abandoned": true, 436 | "time": "2013-11-09T17:13:13+00:00" 437 | }, 438 | { 439 | "name": "herrera-io/version", 440 | "version": "1.1.1", 441 | "source": { 442 | "type": "git", 443 | "url": "https://github.com/kherge-abandoned/php-version.git", 444 | "reference": "d39d9642b92a04d8b8a28b871b797a35a2545e85" 445 | }, 446 | "dist": { 447 | "type": "zip", 448 | "url": "https://api.github.com/repos/kherge-abandoned/php-version/zipball/d39d9642b92a04d8b8a28b871b797a35a2545e85", 449 | "reference": "d39d9642b92a04d8b8a28b871b797a35a2545e85", 450 | "shasum": "" 451 | }, 452 | "require": { 453 | "php": ">=5.3.3" 454 | }, 455 | "require-dev": { 456 | "herrera-io/phpunit-test-case": "1.*", 457 | "phpunit/phpunit": "3.7.*" 458 | }, 459 | "type": "library", 460 | "extra": { 461 | "branch-alias": { 462 | "dev-master": "1.1.x-dev" 463 | } 464 | }, 465 | "autoload": { 466 | "psr-0": { 467 | "Herrera\\Version": "src/lib" 468 | } 469 | }, 470 | "notification-url": "https://packagist.org/downloads/", 471 | "license": [ 472 | "MIT" 473 | ], 474 | "authors": [ 475 | { 476 | "name": "Kevin Herrera", 477 | "email": "kevin@herrera.io", 478 | "homepage": "http://kevin.herrera.io" 479 | } 480 | ], 481 | "description": "A library for creating, editing, and comparing semantic versioning numbers.", 482 | "homepage": "http://github.com/herrera-io/php-version", 483 | "keywords": [ 484 | "semantic", 485 | "version" 486 | ], 487 | "abandoned": true, 488 | "time": "2014-05-27T05:29:25+00:00" 489 | }, 490 | { 491 | "name": "justinrainbow/json-schema", 492 | "version": "1.6.1", 493 | "source": { 494 | "type": "git", 495 | "url": "https://github.com/justinrainbow/json-schema.git", 496 | "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341" 497 | }, 498 | "dist": { 499 | "type": "zip", 500 | "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/cc84765fb7317f6b07bd8ac78364747f95b86341", 501 | "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341", 502 | "shasum": "" 503 | }, 504 | "require": { 505 | "php": ">=5.3.29" 506 | }, 507 | "require-dev": { 508 | "json-schema/json-schema-test-suite": "1.1.0", 509 | "phpdocumentor/phpdocumentor": "~2", 510 | "phpunit/phpunit": "~3.7" 511 | }, 512 | "bin": [ 513 | "bin/validate-json" 514 | ], 515 | "type": "library", 516 | "extra": { 517 | "branch-alias": { 518 | "dev-master": "1.6.x-dev" 519 | } 520 | }, 521 | "autoload": { 522 | "psr-4": { 523 | "JsonSchema\\": "src/JsonSchema/" 524 | } 525 | }, 526 | "notification-url": "https://packagist.org/downloads/", 527 | "license": [ 528 | "BSD-3-Clause" 529 | ], 530 | "authors": [ 531 | { 532 | "name": "Bruno Prieto Reis", 533 | "email": "bruno.p.reis@gmail.com" 534 | }, 535 | { 536 | "name": "Justin Rainbow", 537 | "email": "justin.rainbow@gmail.com" 538 | }, 539 | { 540 | "name": "Igor Wiedler", 541 | "email": "igor@wiedler.ch" 542 | }, 543 | { 544 | "name": "Robert Schönthal", 545 | "email": "seroscho@googlemail.com" 546 | } 547 | ], 548 | "description": "A library to validate a json schema.", 549 | "homepage": "https://github.com/justinrainbow/json-schema", 550 | "keywords": [ 551 | "json", 552 | "schema" 553 | ], 554 | "time": "2016-01-25T15:43:01+00:00" 555 | }, 556 | { 557 | "name": "monolog/monolog", 558 | "version": "1.22.0", 559 | "source": { 560 | "type": "git", 561 | "url": "https://github.com/Seldaek/monolog.git", 562 | "reference": "bad29cb8d18ab0315e6c477751418a82c850d558" 563 | }, 564 | "dist": { 565 | "type": "zip", 566 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bad29cb8d18ab0315e6c477751418a82c850d558", 567 | "reference": "bad29cb8d18ab0315e6c477751418a82c850d558", 568 | "shasum": "" 569 | }, 570 | "require": { 571 | "php": ">=5.3.0", 572 | "psr/log": "~1.0" 573 | }, 574 | "provide": { 575 | "psr/log-implementation": "1.0.0" 576 | }, 577 | "require-dev": { 578 | "aws/aws-sdk-php": "^2.4.9 || ^3.0", 579 | "doctrine/couchdb": "~1.0@dev", 580 | "graylog2/gelf-php": "~1.0", 581 | "jakub-onderka/php-parallel-lint": "0.9", 582 | "php-amqplib/php-amqplib": "~2.4", 583 | "php-console/php-console": "^3.1.3", 584 | "phpunit/phpunit": "~4.5", 585 | "phpunit/phpunit-mock-objects": "2.3.0", 586 | "ruflin/elastica": ">=0.90 <3.0", 587 | "sentry/sentry": "^0.13", 588 | "swiftmailer/swiftmailer": "~5.3" 589 | }, 590 | "suggest": { 591 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 592 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 593 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 594 | "ext-mongo": "Allow sending log messages to a MongoDB server", 595 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 596 | "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", 597 | "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", 598 | "php-console/php-console": "Allow sending log messages to Google Chrome", 599 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 600 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server", 601 | "sentry/sentry": "Allow sending log messages to a Sentry server" 602 | }, 603 | "type": "library", 604 | "extra": { 605 | "branch-alias": { 606 | "dev-master": "2.0.x-dev" 607 | } 608 | }, 609 | "autoload": { 610 | "psr-4": { 611 | "Monolog\\": "src/Monolog" 612 | } 613 | }, 614 | "notification-url": "https://packagist.org/downloads/", 615 | "license": [ 616 | "MIT" 617 | ], 618 | "authors": [ 619 | { 620 | "name": "Jordi Boggiano", 621 | "email": "j.boggiano@seld.be", 622 | "homepage": "http://seld.be" 623 | } 624 | ], 625 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 626 | "homepage": "http://github.com/Seldaek/monolog", 627 | "keywords": [ 628 | "log", 629 | "logging", 630 | "psr-3" 631 | ], 632 | "time": "2016-11-26T00:15:39+00:00" 633 | }, 634 | { 635 | "name": "phpseclib/phpseclib", 636 | "version": "2.0.4", 637 | "source": { 638 | "type": "git", 639 | "url": "https://github.com/phpseclib/phpseclib.git", 640 | "reference": "ab8028c93c03cc8d9c824efa75dc94f1db2369bf" 641 | }, 642 | "dist": { 643 | "type": "zip", 644 | "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/ab8028c93c03cc8d9c824efa75dc94f1db2369bf", 645 | "reference": "ab8028c93c03cc8d9c824efa75dc94f1db2369bf", 646 | "shasum": "" 647 | }, 648 | "require": { 649 | "php": ">=5.3.3" 650 | }, 651 | "require-dev": { 652 | "phing/phing": "~2.7", 653 | "phpunit/phpunit": "~4.0", 654 | "sami/sami": "~2.0", 655 | "squizlabs/php_codesniffer": "~2.0" 656 | }, 657 | "suggest": { 658 | "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", 659 | "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", 660 | "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", 661 | "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." 662 | }, 663 | "type": "library", 664 | "autoload": { 665 | "files": [ 666 | "phpseclib/bootstrap.php" 667 | ], 668 | "psr-4": { 669 | "phpseclib\\": "phpseclib/" 670 | } 671 | }, 672 | "notification-url": "https://packagist.org/downloads/", 673 | "license": [ 674 | "MIT" 675 | ], 676 | "authors": [ 677 | { 678 | "name": "Jim Wigginton", 679 | "email": "terrafrost@php.net", 680 | "role": "Lead Developer" 681 | }, 682 | { 683 | "name": "Patrick Monnerat", 684 | "email": "pm@datasphere.ch", 685 | "role": "Developer" 686 | }, 687 | { 688 | "name": "Andreas Fischer", 689 | "email": "bantu@phpbb.com", 690 | "role": "Developer" 691 | }, 692 | { 693 | "name": "Hans-Jürgen Petrich", 694 | "email": "petrich@tronic-media.com", 695 | "role": "Developer" 696 | }, 697 | { 698 | "name": "Graham Campbell", 699 | "email": "graham@alt-three.com", 700 | "role": "Developer" 701 | } 702 | ], 703 | "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", 704 | "homepage": "http://phpseclib.sourceforge.net", 705 | "keywords": [ 706 | "BigInteger", 707 | "aes", 708 | "asn.1", 709 | "asn1", 710 | "blowfish", 711 | "crypto", 712 | "cryptography", 713 | "encryption", 714 | "rsa", 715 | "security", 716 | "sftp", 717 | "signature", 718 | "signing", 719 | "ssh", 720 | "twofish", 721 | "x.509", 722 | "x509" 723 | ], 724 | "time": "2016-10-04T00:57:04+00:00" 725 | }, 726 | { 727 | "name": "pimple/pimple", 728 | "version": "v3.0.2", 729 | "source": { 730 | "type": "git", 731 | "url": "https://github.com/silexphp/Pimple.git", 732 | "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a" 733 | }, 734 | "dist": { 735 | "type": "zip", 736 | "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a", 737 | "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a", 738 | "shasum": "" 739 | }, 740 | "require": { 741 | "php": ">=5.3.0" 742 | }, 743 | "type": "library", 744 | "extra": { 745 | "branch-alias": { 746 | "dev-master": "3.0.x-dev" 747 | } 748 | }, 749 | "autoload": { 750 | "psr-0": { 751 | "Pimple": "src/" 752 | } 753 | }, 754 | "notification-url": "https://packagist.org/downloads/", 755 | "license": [ 756 | "MIT" 757 | ], 758 | "authors": [ 759 | { 760 | "name": "Fabien Potencier", 761 | "email": "fabien@symfony.com" 762 | } 763 | ], 764 | "description": "Pimple, a simple Dependency Injection Container", 765 | "homepage": "http://pimple.sensiolabs.org", 766 | "keywords": [ 767 | "container", 768 | "dependency injection" 769 | ], 770 | "time": "2015-09-11T15:10:35+00:00" 771 | }, 772 | { 773 | "name": "psr/cache", 774 | "version": "1.0.1", 775 | "source": { 776 | "type": "git", 777 | "url": "https://github.com/php-fig/cache.git", 778 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" 779 | }, 780 | "dist": { 781 | "type": "zip", 782 | "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", 783 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", 784 | "shasum": "" 785 | }, 786 | "require": { 787 | "php": ">=5.3.0" 788 | }, 789 | "type": "library", 790 | "extra": { 791 | "branch-alias": { 792 | "dev-master": "1.0.x-dev" 793 | } 794 | }, 795 | "autoload": { 796 | "psr-4": { 797 | "Psr\\Cache\\": "src/" 798 | } 799 | }, 800 | "notification-url": "https://packagist.org/downloads/", 801 | "license": [ 802 | "MIT" 803 | ], 804 | "authors": [ 805 | { 806 | "name": "PHP-FIG", 807 | "homepage": "http://www.php-fig.org/" 808 | } 809 | ], 810 | "description": "Common interface for caching libraries", 811 | "keywords": [ 812 | "cache", 813 | "psr", 814 | "psr-6" 815 | ], 816 | "time": "2016-08-06T20:24:11+00:00" 817 | }, 818 | { 819 | "name": "psr/http-message", 820 | "version": "1.0.1", 821 | "source": { 822 | "type": "git", 823 | "url": "https://github.com/php-fig/http-message.git", 824 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 825 | }, 826 | "dist": { 827 | "type": "zip", 828 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 829 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 830 | "shasum": "" 831 | }, 832 | "require": { 833 | "php": ">=5.3.0" 834 | }, 835 | "type": "library", 836 | "extra": { 837 | "branch-alias": { 838 | "dev-master": "1.0.x-dev" 839 | } 840 | }, 841 | "autoload": { 842 | "psr-4": { 843 | "Psr\\Http\\Message\\": "src/" 844 | } 845 | }, 846 | "notification-url": "https://packagist.org/downloads/", 847 | "license": [ 848 | "MIT" 849 | ], 850 | "authors": [ 851 | { 852 | "name": "PHP-FIG", 853 | "homepage": "http://www.php-fig.org/" 854 | } 855 | ], 856 | "description": "Common interface for HTTP messages", 857 | "homepage": "https://github.com/php-fig/http-message", 858 | "keywords": [ 859 | "http", 860 | "http-message", 861 | "psr", 862 | "psr-7", 863 | "request", 864 | "response" 865 | ], 866 | "support": { 867 | "source": "https://github.com/php-fig/http-message/tree/master" 868 | }, 869 | "time": "2016-08-06T14:39:51+00:00" 870 | }, 871 | { 872 | "name": "psr/log", 873 | "version": "1.0.2", 874 | "source": { 875 | "type": "git", 876 | "url": "https://github.com/php-fig/log.git", 877 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" 878 | }, 879 | "dist": { 880 | "type": "zip", 881 | "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 882 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 883 | "shasum": "" 884 | }, 885 | "require": { 886 | "php": ">=5.3.0" 887 | }, 888 | "type": "library", 889 | "extra": { 890 | "branch-alias": { 891 | "dev-master": "1.0.x-dev" 892 | } 893 | }, 894 | "autoload": { 895 | "psr-4": { 896 | "Psr\\Log\\": "Psr/Log/" 897 | } 898 | }, 899 | "notification-url": "https://packagist.org/downloads/", 900 | "license": [ 901 | "MIT" 902 | ], 903 | "authors": [ 904 | { 905 | "name": "PHP-FIG", 906 | "homepage": "http://www.php-fig.org/" 907 | } 908 | ], 909 | "description": "Common interface for logging libraries", 910 | "homepage": "https://github.com/php-fig/log", 911 | "keywords": [ 912 | "log", 913 | "psr", 914 | "psr-3" 915 | ], 916 | "time": "2016-10-10T12:19:37+00:00" 917 | }, 918 | { 919 | "name": "ralouphie/getallheaders", 920 | "version": "3.0.3", 921 | "source": { 922 | "type": "git", 923 | "url": "https://github.com/ralouphie/getallheaders.git", 924 | "reference": "120b605dfeb996808c31b6477290a714d356e822" 925 | }, 926 | "dist": { 927 | "type": "zip", 928 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", 929 | "reference": "120b605dfeb996808c31b6477290a714d356e822", 930 | "shasum": "" 931 | }, 932 | "require": { 933 | "php": ">=5.6" 934 | }, 935 | "require-dev": { 936 | "php-coveralls/php-coveralls": "^2.1", 937 | "phpunit/phpunit": "^5 || ^6.5" 938 | }, 939 | "type": "library", 940 | "autoload": { 941 | "files": [ 942 | "src/getallheaders.php" 943 | ] 944 | }, 945 | "notification-url": "https://packagist.org/downloads/", 946 | "license": [ 947 | "MIT" 948 | ], 949 | "authors": [ 950 | { 951 | "name": "Ralph Khattar", 952 | "email": "ralph.khattar@gmail.com" 953 | } 954 | ], 955 | "description": "A polyfill for getallheaders.", 956 | "support": { 957 | "issues": "https://github.com/ralouphie/getallheaders/issues", 958 | "source": "https://github.com/ralouphie/getallheaders/tree/develop" 959 | }, 960 | "time": "2019-03-08T08:55:37+00:00" 961 | }, 962 | { 963 | "name": "react/cache", 964 | "version": "v0.4.1", 965 | "source": { 966 | "type": "git", 967 | "url": "https://github.com/reactphp/cache.git", 968 | "reference": "558f614891341b1d817a8cdf9a358948ec49638f" 969 | }, 970 | "dist": { 971 | "type": "zip", 972 | "url": "https://api.github.com/repos/reactphp/cache/zipball/558f614891341b1d817a8cdf9a358948ec49638f", 973 | "reference": "558f614891341b1d817a8cdf9a358948ec49638f", 974 | "shasum": "" 975 | }, 976 | "require": { 977 | "php": ">=5.3.0", 978 | "react/promise": "~2.0|~1.1" 979 | }, 980 | "type": "library", 981 | "autoload": { 982 | "psr-4": { 983 | "React\\Cache\\": "src\\" 984 | } 985 | }, 986 | "notification-url": "https://packagist.org/downloads/", 987 | "license": [ 988 | "MIT" 989 | ], 990 | "description": "Async caching.", 991 | "keywords": [ 992 | "cache" 993 | ], 994 | "time": "2016-02-25T18:17:16+00:00" 995 | }, 996 | { 997 | "name": "react/child-process", 998 | "version": "v0.4.1", 999 | "source": { 1000 | "type": "git", 1001 | "url": "https://github.com/reactphp/child-process.git", 1002 | "reference": "3ab4f83c6f6c5862f7ca28d999a92d327472a671" 1003 | }, 1004 | "dist": { 1005 | "type": "zip", 1006 | "url": "https://api.github.com/repos/reactphp/child-process/zipball/3ab4f83c6f6c5862f7ca28d999a92d327472a671", 1007 | "reference": "3ab4f83c6f6c5862f7ca28d999a92d327472a671", 1008 | "shasum": "" 1009 | }, 1010 | "require": { 1011 | "evenement/evenement": "~2.0", 1012 | "php": ">=5.4.0", 1013 | "react/event-loop": "0.4.*", 1014 | "react/stream": "~0.4.2" 1015 | }, 1016 | "require-dev": { 1017 | "sebastian/environment": "~1.0" 1018 | }, 1019 | "type": "library", 1020 | "autoload": { 1021 | "psr-4": { 1022 | "React\\ChildProcess\\": "src" 1023 | } 1024 | }, 1025 | "notification-url": "https://packagist.org/downloads/", 1026 | "license": [ 1027 | "MIT" 1028 | ], 1029 | "description": "Library for executing child processes.", 1030 | "keywords": [ 1031 | "process" 1032 | ], 1033 | "time": "2016-08-01T18:09:48+00:00" 1034 | }, 1035 | { 1036 | "name": "react/dns", 1037 | "version": "v0.4.3", 1038 | "source": { 1039 | "type": "git", 1040 | "url": "https://github.com/reactphp/dns.git", 1041 | "reference": "751b3129556e04944f164e3556a20ca6e201e459" 1042 | }, 1043 | "dist": { 1044 | "type": "zip", 1045 | "url": "https://api.github.com/repos/reactphp/dns/zipball/751b3129556e04944f164e3556a20ca6e201e459", 1046 | "reference": "751b3129556e04944f164e3556a20ca6e201e459", 1047 | "shasum": "" 1048 | }, 1049 | "require": { 1050 | "php": ">=5.3.0", 1051 | "react/cache": "~0.4.0|~0.3.0", 1052 | "react/promise": "~2.1|~1.2", 1053 | "react/socket": "~0.4.0|~0.3.0" 1054 | }, 1055 | "type": "library", 1056 | "autoload": { 1057 | "psr-4": { 1058 | "React\\Dns\\": "src" 1059 | } 1060 | }, 1061 | "notification-url": "https://packagist.org/downloads/", 1062 | "license": [ 1063 | "MIT" 1064 | ], 1065 | "description": "Async DNS resolver.", 1066 | "keywords": [ 1067 | "dns", 1068 | "dns-resolver" 1069 | ], 1070 | "time": "2016-08-01T10:09:07+00:00" 1071 | }, 1072 | { 1073 | "name": "react/event-loop", 1074 | "version": "v0.4.2", 1075 | "source": { 1076 | "type": "git", 1077 | "url": "https://github.com/reactphp/event-loop.git", 1078 | "reference": "164799f73175e1c80bba92a220ea35df6ca371dd" 1079 | }, 1080 | "dist": { 1081 | "type": "zip", 1082 | "url": "https://api.github.com/repos/reactphp/event-loop/zipball/164799f73175e1c80bba92a220ea35df6ca371dd", 1083 | "reference": "164799f73175e1c80bba92a220ea35df6ca371dd", 1084 | "shasum": "" 1085 | }, 1086 | "require": { 1087 | "php": ">=5.4.0" 1088 | }, 1089 | "suggest": { 1090 | "ext-event": "~1.0", 1091 | "ext-libev": "*", 1092 | "ext-libevent": ">=0.1.0" 1093 | }, 1094 | "type": "library", 1095 | "extra": { 1096 | "branch-alias": { 1097 | "dev-master": "0.5-dev" 1098 | } 1099 | }, 1100 | "autoload": { 1101 | "psr-4": { 1102 | "React\\EventLoop\\": "src" 1103 | } 1104 | }, 1105 | "notification-url": "https://packagist.org/downloads/", 1106 | "license": [ 1107 | "MIT" 1108 | ], 1109 | "description": "Event loop abstraction layer that libraries can use for evented I/O.", 1110 | "keywords": [ 1111 | "asynchronous", 1112 | "event-loop" 1113 | ], 1114 | "time": "2016-03-08T02:09:32+00:00" 1115 | }, 1116 | { 1117 | "name": "react/http", 1118 | "version": "v0.4.2", 1119 | "source": { 1120 | "type": "git", 1121 | "url": "https://github.com/reactphp/http.git", 1122 | "reference": "abedac54967d7ea237ad104cff8274e2c4077cf4" 1123 | }, 1124 | "dist": { 1125 | "type": "zip", 1126 | "url": "https://api.github.com/repos/reactphp/http/zipball/abedac54967d7ea237ad104cff8274e2c4077cf4", 1127 | "reference": "abedac54967d7ea237ad104cff8274e2c4077cf4", 1128 | "shasum": "" 1129 | }, 1130 | "require": { 1131 | "evenement/evenement": "^2.0", 1132 | "guzzlehttp/psr7": "^1.0", 1133 | "php": ">=5.4.0", 1134 | "react/socket": "^0.4", 1135 | "react/stream": "^0.4" 1136 | }, 1137 | "type": "library", 1138 | "autoload": { 1139 | "psr-4": { 1140 | "React\\Http\\": "src" 1141 | } 1142 | }, 1143 | "notification-url": "https://packagist.org/downloads/", 1144 | "license": [ 1145 | "MIT" 1146 | ], 1147 | "description": "Library for building an evented http server.", 1148 | "keywords": [ 1149 | "http" 1150 | ], 1151 | "time": "2016-11-09T15:20:39+00:00" 1152 | }, 1153 | { 1154 | "name": "react/http-client", 1155 | "version": "v0.4.15", 1156 | "source": { 1157 | "type": "git", 1158 | "url": "https://github.com/reactphp/http-client.git", 1159 | "reference": "01e919008363622334f91419a9908b3a51754ccd" 1160 | }, 1161 | "dist": { 1162 | "type": "zip", 1163 | "url": "https://api.github.com/repos/reactphp/http-client/zipball/01e919008363622334f91419a9908b3a51754ccd", 1164 | "reference": "01e919008363622334f91419a9908b3a51754ccd", 1165 | "shasum": "" 1166 | }, 1167 | "require": { 1168 | "evenement/evenement": "~2.0", 1169 | "guzzlehttp/psr7": "^1.0", 1170 | "php": ">=5.4.0", 1171 | "react/dns": "0.4.*", 1172 | "react/event-loop": "0.4.*", 1173 | "react/promise": "~2.2", 1174 | "react/socket-client": "^0.5 || ^0.4 || ^0.3", 1175 | "react/stream": "0.4.*" 1176 | }, 1177 | "type": "library", 1178 | "autoload": { 1179 | "psr-4": { 1180 | "React\\HttpClient\\": "src" 1181 | } 1182 | }, 1183 | "notification-url": "https://packagist.org/downloads/", 1184 | "license": [ 1185 | "MIT" 1186 | ], 1187 | "description": "Asynchronous HTTP client library.", 1188 | "keywords": [ 1189 | "http" 1190 | ], 1191 | "time": "2016-12-02T10:17:42+00:00" 1192 | }, 1193 | { 1194 | "name": "react/promise", 1195 | "version": "v2.5.0", 1196 | "source": { 1197 | "type": "git", 1198 | "url": "https://github.com/reactphp/promise.git", 1199 | "reference": "2760f3898b7e931aa71153852dcd48a75c9b95db" 1200 | }, 1201 | "dist": { 1202 | "type": "zip", 1203 | "url": "https://api.github.com/repos/reactphp/promise/zipball/2760f3898b7e931aa71153852dcd48a75c9b95db", 1204 | "reference": "2760f3898b7e931aa71153852dcd48a75c9b95db", 1205 | "shasum": "" 1206 | }, 1207 | "require": { 1208 | "php": ">=5.4.0" 1209 | }, 1210 | "type": "library", 1211 | "autoload": { 1212 | "psr-4": { 1213 | "React\\Promise\\": "src/" 1214 | }, 1215 | "files": [ 1216 | "src/functions_include.php" 1217 | ] 1218 | }, 1219 | "notification-url": "https://packagist.org/downloads/", 1220 | "license": [ 1221 | "MIT" 1222 | ], 1223 | "authors": [ 1224 | { 1225 | "name": "Jan Sorgalla", 1226 | "email": "jsorgalla@gmail.com" 1227 | } 1228 | ], 1229 | "description": "A lightweight implementation of CommonJS Promises/A for PHP", 1230 | "keywords": [ 1231 | "promise", 1232 | "promises" 1233 | ], 1234 | "time": "2016-12-22T14:09:01+00:00" 1235 | }, 1236 | { 1237 | "name": "react/react", 1238 | "version": "v0.4.2", 1239 | "source": { 1240 | "type": "git", 1241 | "url": "https://github.com/reactphp/react.git", 1242 | "reference": "457b6b8a16a37c11278cac0870d6d2ff911c5765" 1243 | }, 1244 | "dist": { 1245 | "type": "zip", 1246 | "url": "https://api.github.com/repos/reactphp/react/zipball/457b6b8a16a37c11278cac0870d6d2ff911c5765", 1247 | "reference": "457b6b8a16a37c11278cac0870d6d2ff911c5765", 1248 | "shasum": "" 1249 | }, 1250 | "require": { 1251 | "php": ">=5.4.0", 1252 | "react/cache": "0.4.*", 1253 | "react/child-process": "0.4.*", 1254 | "react/dns": "0.4.*", 1255 | "react/event-loop": "0.4.*", 1256 | "react/http": "0.4.*", 1257 | "react/http-client": "0.4.*", 1258 | "react/promise": "~2.1", 1259 | "react/socket": "0.4.*", 1260 | "react/socket-client": "0.4.*", 1261 | "react/stream": "0.4.*" 1262 | }, 1263 | "require-dev": { 1264 | "phpunit/phpunit": "~4.0" 1265 | }, 1266 | "suggest": { 1267 | "ext-event": "Allows for use of a more performant event-loop implementation.", 1268 | "ext-libev": "Allows for use of a more performant event-loop implementation.", 1269 | "ext-libevent": "Allows for use of a more performant event-loop implementation." 1270 | }, 1271 | "type": "library", 1272 | "extra": { 1273 | "branch-alias": { 1274 | "dev-master": "0.5-dev" 1275 | } 1276 | }, 1277 | "notification-url": "https://packagist.org/downloads/", 1278 | "license": [ 1279 | "MIT" 1280 | ], 1281 | "description": "Nuclear Reactor written in PHP.", 1282 | "keywords": [ 1283 | "asynchronous", 1284 | "event-loop", 1285 | "reactor" 1286 | ], 1287 | "time": "2014-12-11T02:06:55+00:00" 1288 | }, 1289 | { 1290 | "name": "react/socket", 1291 | "version": "v0.4.5", 1292 | "source": { 1293 | "type": "git", 1294 | "url": "https://github.com/reactphp/socket.git", 1295 | "reference": "32385d71f84c4a26ea577cb91f1220decb440dce" 1296 | }, 1297 | "dist": { 1298 | "type": "zip", 1299 | "url": "https://api.github.com/repos/reactphp/socket/zipball/32385d71f84c4a26ea577cb91f1220decb440dce", 1300 | "reference": "32385d71f84c4a26ea577cb91f1220decb440dce", 1301 | "shasum": "" 1302 | }, 1303 | "require": { 1304 | "evenement/evenement": "~2.0|~1.0", 1305 | "php": ">=5.3.0", 1306 | "react/event-loop": "0.4.*|0.3.*", 1307 | "react/promise": "^2.0 || ^1.1", 1308 | "react/stream": "^0.4.5" 1309 | }, 1310 | "require-dev": { 1311 | "clue/block-react": "^1.1", 1312 | "react/socket-client": "^0.5.1" 1313 | }, 1314 | "type": "library", 1315 | "autoload": { 1316 | "psr-4": { 1317 | "React\\Socket\\": "src" 1318 | } 1319 | }, 1320 | "notification-url": "https://packagist.org/downloads/", 1321 | "license": [ 1322 | "MIT" 1323 | ], 1324 | "description": "Async, streaming plaintext TCP/IP and secure TLS socket server for React PHP", 1325 | "keywords": [ 1326 | "Socket" 1327 | ], 1328 | "time": "2017-01-08T11:36:16+00:00" 1329 | }, 1330 | { 1331 | "name": "react/socket-client", 1332 | "version": "v0.4.6", 1333 | "source": { 1334 | "type": "git", 1335 | "url": "https://github.com/reactphp/socket-client.git", 1336 | "reference": "49e730523b73d912e56f7a41f53ed3fc083ae167" 1337 | }, 1338 | "dist": { 1339 | "type": "zip", 1340 | "url": "https://api.github.com/repos/reactphp/socket-client/zipball/49e730523b73d912e56f7a41f53ed3fc083ae167", 1341 | "reference": "49e730523b73d912e56f7a41f53ed3fc083ae167", 1342 | "shasum": "" 1343 | }, 1344 | "require": { 1345 | "php": ">=5.4.0", 1346 | "react/dns": "0.4.*", 1347 | "react/event-loop": "0.4.*", 1348 | "react/promise": "~2.0", 1349 | "react/stream": "0.4.*" 1350 | }, 1351 | "type": "library", 1352 | "extra": { 1353 | "branch-alias": { 1354 | "dev-master": "0.4-dev" 1355 | } 1356 | }, 1357 | "autoload": { 1358 | "psr-4": { 1359 | "React\\SocketClient\\": "src" 1360 | } 1361 | }, 1362 | "notification-url": "https://packagist.org/downloads/", 1363 | "license": [ 1364 | "MIT" 1365 | ], 1366 | "description": "Async connector to open TCP/IP and SSL/TLS based connections.", 1367 | "keywords": [ 1368 | "Socket" 1369 | ], 1370 | "time": "2016-12-06T10:54:49+00:00" 1371 | }, 1372 | { 1373 | "name": "react/stream", 1374 | "version": "v0.4.5", 1375 | "source": { 1376 | "type": "git", 1377 | "url": "https://github.com/reactphp/stream.git", 1378 | "reference": "23389503012e1ab721ad498a5a1f4b39f7a43c00" 1379 | }, 1380 | "dist": { 1381 | "type": "zip", 1382 | "url": "https://api.github.com/repos/reactphp/stream/zipball/23389503012e1ab721ad498a5a1f4b39f7a43c00", 1383 | "reference": "23389503012e1ab721ad498a5a1f4b39f7a43c00", 1384 | "shasum": "" 1385 | }, 1386 | "require": { 1387 | "evenement/evenement": "^2.0|^1.0", 1388 | "php": ">=5.3.8" 1389 | }, 1390 | "require-dev": { 1391 | "clue/stream-filter": "~1.2", 1392 | "react/event-loop": "^0.4|^0.3", 1393 | "react/promise": "^2.0|^1.0" 1394 | }, 1395 | "suggest": { 1396 | "react/event-loop": "^0.4", 1397 | "react/promise": "^2.0" 1398 | }, 1399 | "type": "library", 1400 | "autoload": { 1401 | "psr-4": { 1402 | "React\\Stream\\": "src" 1403 | } 1404 | }, 1405 | "notification-url": "https://packagist.org/downloads/", 1406 | "license": [ 1407 | "MIT" 1408 | ], 1409 | "description": "Basic readable and writable stream interfaces that support piping.", 1410 | "keywords": [ 1411 | "pipe", 1412 | "stream" 1413 | ], 1414 | "time": "2016-11-13T17:06:02+00:00" 1415 | }, 1416 | { 1417 | "name": "seld/jsonlint", 1418 | "version": "1.5.0", 1419 | "source": { 1420 | "type": "git", 1421 | "url": "https://github.com/Seldaek/jsonlint.git", 1422 | "reference": "19495c181d6d53a0a13414154e52817e3b504189" 1423 | }, 1424 | "dist": { 1425 | "type": "zip", 1426 | "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/19495c181d6d53a0a13414154e52817e3b504189", 1427 | "reference": "19495c181d6d53a0a13414154e52817e3b504189", 1428 | "shasum": "" 1429 | }, 1430 | "require": { 1431 | "php": "^5.3 || ^7.0" 1432 | }, 1433 | "bin": [ 1434 | "bin/jsonlint" 1435 | ], 1436 | "type": "library", 1437 | "autoload": { 1438 | "psr-4": { 1439 | "Seld\\JsonLint\\": "src/Seld/JsonLint/" 1440 | } 1441 | }, 1442 | "notification-url": "https://packagist.org/downloads/", 1443 | "license": [ 1444 | "MIT" 1445 | ], 1446 | "authors": [ 1447 | { 1448 | "name": "Jordi Boggiano", 1449 | "email": "j.boggiano@seld.be", 1450 | "homepage": "http://seld.be" 1451 | } 1452 | ], 1453 | "description": "JSON Linter", 1454 | "keywords": [ 1455 | "json", 1456 | "linter", 1457 | "parser", 1458 | "validator" 1459 | ], 1460 | "time": "2016-11-14T17:59:58+00:00" 1461 | }, 1462 | { 1463 | "name": "symfony/cache", 1464 | "version": "v3.2.2", 1465 | "source": { 1466 | "type": "git", 1467 | "url": "https://github.com/symfony/cache.git", 1468 | "reference": "c96ac9056b38702683c1b719be2d7f0c00107240" 1469 | }, 1470 | "dist": { 1471 | "type": "zip", 1472 | "url": "https://api.github.com/repos/symfony/cache/zipball/c96ac9056b38702683c1b719be2d7f0c00107240", 1473 | "reference": "c96ac9056b38702683c1b719be2d7f0c00107240", 1474 | "shasum": "" 1475 | }, 1476 | "require": { 1477 | "php": ">=5.5.9", 1478 | "psr/cache": "~1.0", 1479 | "psr/log": "~1.0" 1480 | }, 1481 | "provide": { 1482 | "psr/cache-implementation": "1.0" 1483 | }, 1484 | "require-dev": { 1485 | "cache/integration-tests": "dev-master", 1486 | "doctrine/cache": "~1.6", 1487 | "doctrine/dbal": "~2.4", 1488 | "predis/predis": "~1.0" 1489 | }, 1490 | "suggest": { 1491 | "symfony/polyfill-apcu": "For using ApcuAdapter on HHVM" 1492 | }, 1493 | "type": "library", 1494 | "extra": { 1495 | "branch-alias": { 1496 | "dev-master": "3.2-dev" 1497 | } 1498 | }, 1499 | "autoload": { 1500 | "psr-4": { 1501 | "Symfony\\Component\\Cache\\": "" 1502 | }, 1503 | "exclude-from-classmap": [ 1504 | "/Tests/" 1505 | ] 1506 | }, 1507 | "notification-url": "https://packagist.org/downloads/", 1508 | "license": [ 1509 | "MIT" 1510 | ], 1511 | "authors": [ 1512 | { 1513 | "name": "Nicolas Grekas", 1514 | "email": "p@tchwork.com" 1515 | }, 1516 | { 1517 | "name": "Symfony Community", 1518 | "homepage": "https://symfony.com/contributors" 1519 | } 1520 | ], 1521 | "description": "Symfony implementation of PSR-6", 1522 | "homepage": "https://symfony.com", 1523 | "keywords": [ 1524 | "caching", 1525 | "psr6" 1526 | ], 1527 | "time": "2017-01-12T11:00:26+00:00" 1528 | }, 1529 | { 1530 | "name": "symfony/console", 1531 | "version": "v3.2.2", 1532 | "source": { 1533 | "type": "git", 1534 | "url": "https://github.com/symfony/console.git", 1535 | "reference": "4f9e449e76996adf310498a8ca955c6deebe29dd" 1536 | }, 1537 | "dist": { 1538 | "type": "zip", 1539 | "url": "https://api.github.com/repos/symfony/console/zipball/4f9e449e76996adf310498a8ca955c6deebe29dd", 1540 | "reference": "4f9e449e76996adf310498a8ca955c6deebe29dd", 1541 | "shasum": "" 1542 | }, 1543 | "require": { 1544 | "php": ">=5.5.9", 1545 | "symfony/debug": "~2.8|~3.0", 1546 | "symfony/polyfill-mbstring": "~1.0" 1547 | }, 1548 | "require-dev": { 1549 | "psr/log": "~1.0", 1550 | "symfony/event-dispatcher": "~2.8|~3.0", 1551 | "symfony/filesystem": "~2.8|~3.0", 1552 | "symfony/process": "~2.8|~3.0" 1553 | }, 1554 | "suggest": { 1555 | "psr/log": "For using the console logger", 1556 | "symfony/event-dispatcher": "", 1557 | "symfony/filesystem": "", 1558 | "symfony/process": "" 1559 | }, 1560 | "type": "library", 1561 | "extra": { 1562 | "branch-alias": { 1563 | "dev-master": "3.2-dev" 1564 | } 1565 | }, 1566 | "autoload": { 1567 | "psr-4": { 1568 | "Symfony\\Component\\Console\\": "" 1569 | }, 1570 | "exclude-from-classmap": [ 1571 | "/Tests/" 1572 | ] 1573 | }, 1574 | "notification-url": "https://packagist.org/downloads/", 1575 | "license": [ 1576 | "MIT" 1577 | ], 1578 | "authors": [ 1579 | { 1580 | "name": "Fabien Potencier", 1581 | "email": "fabien@symfony.com" 1582 | }, 1583 | { 1584 | "name": "Symfony Community", 1585 | "homepage": "https://symfony.com/contributors" 1586 | } 1587 | ], 1588 | "description": "Symfony Console Component", 1589 | "homepage": "https://symfony.com", 1590 | "time": "2017-01-08T20:47:33+00:00" 1591 | }, 1592 | { 1593 | "name": "symfony/debug", 1594 | "version": "v3.2.2", 1595 | "source": { 1596 | "type": "git", 1597 | "url": "https://github.com/symfony/debug.git", 1598 | "reference": "810ba5c1c5352a4ddb15d4719e8936751dff0b05" 1599 | }, 1600 | "dist": { 1601 | "type": "zip", 1602 | "url": "https://api.github.com/repos/symfony/debug/zipball/810ba5c1c5352a4ddb15d4719e8936751dff0b05", 1603 | "reference": "810ba5c1c5352a4ddb15d4719e8936751dff0b05", 1604 | "shasum": "" 1605 | }, 1606 | "require": { 1607 | "php": ">=5.5.9", 1608 | "psr/log": "~1.0" 1609 | }, 1610 | "conflict": { 1611 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" 1612 | }, 1613 | "require-dev": { 1614 | "symfony/class-loader": "~2.8|~3.0", 1615 | "symfony/http-kernel": "~2.8|~3.0" 1616 | }, 1617 | "type": "library", 1618 | "extra": { 1619 | "branch-alias": { 1620 | "dev-master": "3.2-dev" 1621 | } 1622 | }, 1623 | "autoload": { 1624 | "psr-4": { 1625 | "Symfony\\Component\\Debug\\": "" 1626 | }, 1627 | "exclude-from-classmap": [ 1628 | "/Tests/" 1629 | ] 1630 | }, 1631 | "notification-url": "https://packagist.org/downloads/", 1632 | "license": [ 1633 | "MIT" 1634 | ], 1635 | "authors": [ 1636 | { 1637 | "name": "Fabien Potencier", 1638 | "email": "fabien@symfony.com" 1639 | }, 1640 | { 1641 | "name": "Symfony Community", 1642 | "homepage": "https://symfony.com/contributors" 1643 | } 1644 | ], 1645 | "description": "Symfony Debug Component", 1646 | "homepage": "https://symfony.com", 1647 | "time": "2017-01-02T20:32:22+00:00" 1648 | }, 1649 | { 1650 | "name": "symfony/expression-language", 1651 | "version": "v3.2.2", 1652 | "source": { 1653 | "type": "git", 1654 | "url": "https://github.com/symfony/expression-language.git", 1655 | "reference": "e0a7b0c58e0dac3a382d4234e33f6344a5ba69d1" 1656 | }, 1657 | "dist": { 1658 | "type": "zip", 1659 | "url": "https://api.github.com/repos/symfony/expression-language/zipball/e0a7b0c58e0dac3a382d4234e33f6344a5ba69d1", 1660 | "reference": "e0a7b0c58e0dac3a382d4234e33f6344a5ba69d1", 1661 | "shasum": "" 1662 | }, 1663 | "require": { 1664 | "php": ">=5.5.9", 1665 | "symfony/cache": "~3.1" 1666 | }, 1667 | "type": "library", 1668 | "extra": { 1669 | "branch-alias": { 1670 | "dev-master": "3.2-dev" 1671 | } 1672 | }, 1673 | "autoload": { 1674 | "psr-4": { 1675 | "Symfony\\Component\\ExpressionLanguage\\": "" 1676 | }, 1677 | "exclude-from-classmap": [ 1678 | "/Tests/" 1679 | ] 1680 | }, 1681 | "notification-url": "https://packagist.org/downloads/", 1682 | "license": [ 1683 | "MIT" 1684 | ], 1685 | "authors": [ 1686 | { 1687 | "name": "Fabien Potencier", 1688 | "email": "fabien@symfony.com" 1689 | }, 1690 | { 1691 | "name": "Symfony Community", 1692 | "homepage": "https://symfony.com/contributors" 1693 | } 1694 | ], 1695 | "description": "Symfony ExpressionLanguage Component", 1696 | "homepage": "https://symfony.com", 1697 | "time": "2017-01-02T20:32:22+00:00" 1698 | }, 1699 | { 1700 | "name": "symfony/finder", 1701 | "version": "v3.2.2", 1702 | "source": { 1703 | "type": "git", 1704 | "url": "https://github.com/symfony/finder.git", 1705 | "reference": "8c71141cae8e2957946b403cc71a67213c0380d6" 1706 | }, 1707 | "dist": { 1708 | "type": "zip", 1709 | "url": "https://api.github.com/repos/symfony/finder/zipball/8c71141cae8e2957946b403cc71a67213c0380d6", 1710 | "reference": "8c71141cae8e2957946b403cc71a67213c0380d6", 1711 | "shasum": "" 1712 | }, 1713 | "require": { 1714 | "php": ">=5.5.9" 1715 | }, 1716 | "type": "library", 1717 | "extra": { 1718 | "branch-alias": { 1719 | "dev-master": "3.2-dev" 1720 | } 1721 | }, 1722 | "autoload": { 1723 | "psr-4": { 1724 | "Symfony\\Component\\Finder\\": "" 1725 | }, 1726 | "exclude-from-classmap": [ 1727 | "/Tests/" 1728 | ] 1729 | }, 1730 | "notification-url": "https://packagist.org/downloads/", 1731 | "license": [ 1732 | "MIT" 1733 | ], 1734 | "authors": [ 1735 | { 1736 | "name": "Fabien Potencier", 1737 | "email": "fabien@symfony.com" 1738 | }, 1739 | { 1740 | "name": "Symfony Community", 1741 | "homepage": "https://symfony.com/contributors" 1742 | } 1743 | ], 1744 | "description": "Symfony Finder Component", 1745 | "homepage": "https://symfony.com", 1746 | "time": "2017-01-02T20:32:22+00:00" 1747 | }, 1748 | { 1749 | "name": "symfony/polyfill-mbstring", 1750 | "version": "v1.3.0", 1751 | "source": { 1752 | "type": "git", 1753 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1754 | "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" 1755 | }, 1756 | "dist": { 1757 | "type": "zip", 1758 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", 1759 | "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", 1760 | "shasum": "" 1761 | }, 1762 | "require": { 1763 | "php": ">=5.3.3" 1764 | }, 1765 | "suggest": { 1766 | "ext-mbstring": "For best performance" 1767 | }, 1768 | "type": "library", 1769 | "extra": { 1770 | "branch-alias": { 1771 | "dev-master": "1.3-dev" 1772 | } 1773 | }, 1774 | "autoload": { 1775 | "psr-4": { 1776 | "Symfony\\Polyfill\\Mbstring\\": "" 1777 | }, 1778 | "files": [ 1779 | "bootstrap.php" 1780 | ] 1781 | }, 1782 | "notification-url": "https://packagist.org/downloads/", 1783 | "license": [ 1784 | "MIT" 1785 | ], 1786 | "authors": [ 1787 | { 1788 | "name": "Nicolas Grekas", 1789 | "email": "p@tchwork.com" 1790 | }, 1791 | { 1792 | "name": "Symfony Community", 1793 | "homepage": "https://symfony.com/contributors" 1794 | } 1795 | ], 1796 | "description": "Symfony polyfill for the Mbstring extension", 1797 | "homepage": "https://symfony.com", 1798 | "keywords": [ 1799 | "compatibility", 1800 | "mbstring", 1801 | "polyfill", 1802 | "portable", 1803 | "shim" 1804 | ], 1805 | "time": "2016-11-14T01:06:16+00:00" 1806 | }, 1807 | { 1808 | "name": "symfony/process", 1809 | "version": "v3.2.2", 1810 | "source": { 1811 | "type": "git", 1812 | "url": "https://github.com/symfony/process.git", 1813 | "reference": "350e810019fc52dd06ae844b6a6d382f8a0e8893" 1814 | }, 1815 | "dist": { 1816 | "type": "zip", 1817 | "url": "https://api.github.com/repos/symfony/process/zipball/350e810019fc52dd06ae844b6a6d382f8a0e8893", 1818 | "reference": "350e810019fc52dd06ae844b6a6d382f8a0e8893", 1819 | "shasum": "" 1820 | }, 1821 | "require": { 1822 | "php": ">=5.5.9" 1823 | }, 1824 | "type": "library", 1825 | "extra": { 1826 | "branch-alias": { 1827 | "dev-master": "3.2-dev" 1828 | } 1829 | }, 1830 | "autoload": { 1831 | "psr-4": { 1832 | "Symfony\\Component\\Process\\": "" 1833 | }, 1834 | "exclude-from-classmap": [ 1835 | "/Tests/" 1836 | ] 1837 | }, 1838 | "notification-url": "https://packagist.org/downloads/", 1839 | "license": [ 1840 | "MIT" 1841 | ], 1842 | "authors": [ 1843 | { 1844 | "name": "Fabien Potencier", 1845 | "email": "fabien@symfony.com" 1846 | }, 1847 | { 1848 | "name": "Symfony Community", 1849 | "homepage": "https://symfony.com/contributors" 1850 | } 1851 | ], 1852 | "description": "Symfony Process Component", 1853 | "homepage": "https://symfony.com", 1854 | "time": "2017-01-02T20:32:22+00:00" 1855 | }, 1856 | { 1857 | "name": "symfony/yaml", 1858 | "version": "v3.2.2", 1859 | "source": { 1860 | "type": "git", 1861 | "url": "https://github.com/symfony/yaml.git", 1862 | "reference": "50eadbd7926e31842893c957eca362b21592a97d" 1863 | }, 1864 | "dist": { 1865 | "type": "zip", 1866 | "url": "https://api.github.com/repos/symfony/yaml/zipball/50eadbd7926e31842893c957eca362b21592a97d", 1867 | "reference": "50eadbd7926e31842893c957eca362b21592a97d", 1868 | "shasum": "" 1869 | }, 1870 | "require": { 1871 | "php": ">=5.5.9" 1872 | }, 1873 | "require-dev": { 1874 | "symfony/console": "~2.8|~3.0" 1875 | }, 1876 | "suggest": { 1877 | "symfony/console": "For validating YAML files using the lint command" 1878 | }, 1879 | "type": "library", 1880 | "extra": { 1881 | "branch-alias": { 1882 | "dev-master": "3.2-dev" 1883 | } 1884 | }, 1885 | "autoload": { 1886 | "psr-4": { 1887 | "Symfony\\Component\\Yaml\\": "" 1888 | }, 1889 | "exclude-from-classmap": [ 1890 | "/Tests/" 1891 | ] 1892 | }, 1893 | "notification-url": "https://packagist.org/downloads/", 1894 | "license": [ 1895 | "MIT" 1896 | ], 1897 | "authors": [ 1898 | { 1899 | "name": "Fabien Potencier", 1900 | "email": "fabien@symfony.com" 1901 | }, 1902 | { 1903 | "name": "Symfony Community", 1904 | "homepage": "https://symfony.com/contributors" 1905 | } 1906 | ], 1907 | "description": "Symfony Yaml Component", 1908 | "homepage": "https://symfony.com", 1909 | "time": "2017-01-03T13:51:32+00:00" 1910 | } 1911 | ], 1912 | "aliases": [], 1913 | "minimum-stability": "stable", 1914 | "stability-flags": [], 1915 | "prefer-stable": false, 1916 | "prefer-lowest": false, 1917 | "platform": { 1918 | "php": ">=5.6.0" 1919 | }, 1920 | "platform-dev": [], 1921 | "plugin-api-version": "2.3.0" 1922 | } 1923 | -------------------------------------------------------------------------------- /deploy.php: -------------------------------------------------------------------------------- 1 | setPrivate(); 26 | 27 | /** 28 | * Deploy configure 29 | */ 30 | desc('Make configure files for your stage'); 31 | task('deploy:configure', function() { 32 | /** 33 | * Paser value for template compiler 34 | * 35 | * @param array $matches 36 | * @return string 37 | */ 38 | $paser = function($matches) { 39 | if (isset($matches[1])) { 40 | $value = get($matches[1]); 41 | if (is_null($value) || is_bool($value) || is_array($value)) { 42 | $value = var_export($value, true); 43 | } 44 | } else { 45 | $value = $matches[0]; 46 | } 47 | return $value; 48 | }; 49 | 50 | /** 51 | * Template compiler 52 | * 53 | * @param string $contents 54 | * @return string 55 | */ 56 | $compiler = function ($contents) use ($paser) { 57 | $contents = preg_replace_callback('/\{\{\s*([\w\.]+)\s*\}\}/', $paser, $contents); 58 | 59 | return $contents; 60 | }; 61 | 62 | $finder = new \Symfony\Component\Finder\Finder(); 63 | $iterator = $finder 64 | ->files() 65 | ->name('*.tpl') 66 | ->in(__DIR__ . '/shared'); 67 | $tmpDir = sys_get_temp_dir(); 68 | /* @var $file \Symfony\Component\Finder\SplFileInfo */ 69 | foreach ($iterator as $file) { 70 | $success = false; 71 | // Make tmp file 72 | $tmpFile = tempnam($tmpDir, 'tmp'); 73 | if (!empty($tmpFile)) { 74 | try { 75 | $contents = $compiler($file->getContents()); 76 | $target = preg_replace('/\.tpl$/', '', $file->getRelativePathname()); 77 | // Put contents and upload tmp file to server 78 | if (file_put_contents($tmpFile, $contents) > 0) { 79 | //run('mkdir -p {{deploy_path}}/shared/' . dirname($target)); 80 | upload($tmpFile, '{{deploy_path}}/shared/' . $target); 81 | $success = true; 82 | } 83 | } catch (\Exception $e) { 84 | //throw new $e; 85 | $success = false; 86 | } 87 | // Delete tmp file 88 | unlink($tmpFile); 89 | } 90 | if ($success) { 91 | writeln(sprintf(" %s", $file->getRelativePathname())); 92 | } else { 93 | writeln(sprintf(" %s", $file->getRelativePathname())); 94 | } 95 | } 96 | }); 97 | 98 | /** 99 | * Main task 100 | */ 101 | task('deploy', [ 102 | 'deploy:prepare', 103 | 'deploy:lock', 104 | 'deploy:release', 105 | 'deploy:update_code', 106 | 'deploy:shared', 107 | 'deploy:vendors', 108 | 'deploy:clear_paths', 109 | 'deploy:symlink', 110 | 'deploy:unlock', 111 | 'cleanup', 112 | ])->desc('Deploy your project'); 113 | 114 | before('deploy:configure', 'deploy:start'); 115 | after('deploy:failed', 'deploy:unlock'); 116 | after('deploy:shared', 'deploy:writable'); 117 | before('deploy', 'deploy:start'); 118 | after('deploy', 'success'); 119 | 120 | /** 121 | * Load stage and list server 122 | */ 123 | //foreach (glob(__DIR__ . '/stage/*.php') as $filename) { 124 | // include $filename; 125 | //} 126 | serverList(__DIR__ . '/stage/servers.yml'); 127 | -------------------------------------------------------------------------------- /docs/enable-feature-ssh-forward-agent.md: -------------------------------------------------------------------------------- 1 | 1. On your local machine, content file `~/.ssh/config` : 2 | ``` 3 | Host 4 | ForwardAgent yes 5 | ``` 6 | Note: if on your team, each user connects using their own server account, you should also each specify `User ` here in the config instead of with a deployer `->user('username')` call (which would require a single server account _username_ to be used by the whole team). 7 | > it’s better to omit information such as user, port, identityFile, forwardAgent and use it from the ~/.ssh/config file instead —[Deployer docs 'Hosts'](https://deployer.org/docs/hosts.html) 8 | 9 | 2. On your server, uncomment line `#AllowAgentForwarding yes` in file `/etc/ssh/sshd_config` to allow agent forwarding feature. 10 | ``` 11 | AllowAgentForwarding yes 12 | #AllowTcpForwarding yes 13 | #GatewayPorts no 14 | #X11Forwarding no 15 | ``` 16 | Reload sshd service on your server. 17 | ```shell 18 | $ sudo service sshd restart 19 | ``` 20 | 21 | Note: Some servers enaable AllowAgentForwarding by default, in which case it will be allowed unless there is an entry `AllowAgentForwarding no`, so this step may not be necessary. 22 | 23 | 3. Test forward agent from your local machine. 24 | ```ssh 25 | $ ssh-add /path/to/your-key-file 26 | $ ssh @ 27 | $ ssh-add -l 28 | ``` 29 | Check your key really loaded. 30 | 31 | 4. Finally, using `deployer` v3.0 and forward agent feature. 32 | 33 | ```php 34 | server('your-server', 'xxx.xxx.xxx.xxx', 22) 35 | ->user('username') // Omit if specifying User in ssh config 36 | ->stage(['dev']) 37 | ->env('deploy_path', '/var/www/apps/yourappname') 38 | ->env('branch', 'master') 39 | ``` 40 | 41 | Wish you success !!! 42 | 43 | Refs: 44 | https://developer.github.com/guides/using-ssh-agent-forwarding/ 45 | -------------------------------------------------------------------------------- /docs/run-deployer-on-homestead.md: -------------------------------------------------------------------------------- 1 | Using [Deployer][] to deploy [Laravel][] application on [Homestead][] 2 | --- 3 | 4 | 1. Install [vagrant][] and [virtualbox][] if not installed. 5 | 6 | 2. Add box `laravel/homestead` into vagrant if not added. 7 | 8 | ```shell 9 | $ vagrant box add laravel/homestead 10 | ``` 11 | 12 | 3. [Generate your public and private key][key-generate] if not existed. 13 | 14 | 4. Init project 15 | 16 | ```shell 17 | $ cd /path/to/project 18 | $ mkdir key && 19 | $ cp /path/to/public_key key/ 20 | $ cp /path/to/private_key key/ 21 | $ composer require deployer/deployer 22 | $ composer require laravel/homestead --dev 23 | ``` 24 | 25 | 5. Make `Homestead.yaml` and `Vagrantfile` by command: 26 | 27 | ```shell 28 | $ ./vendor/bin/homestead make 29 | ``` 30 | 31 | Two files `Homestead.yaml` and `Vagrantfile` are created in root directory of project. 32 | Edit your `Homestead.yaml` file like: 33 | 34 | ```yml 35 | --- 36 | ip: "192.168.10.10" # your homestead's machine IP 37 | memory: 1024 38 | cpus: 1 39 | hostname: deployer-on-homestead # your homestead's hostname 40 | name: deployer-on-homestead # your homestead's machine name 41 | provider: virtualbox 42 | authorize: "./key/id_rsa.pub" # your public key 43 | keys: 44 | - "./key/id_rsa" # your private key 45 | folders: 46 | - map: "./" 47 | to: "/home/vagrant/deployer-on-homestead" 48 | sites: [] 49 | 50 | ``` 51 | 52 | 6. Make your `deploy.php` file follow documents of Deployer or [deployer-example][] 53 | 54 | 7. Make your `Homestead` and run deployer 55 | 56 | ```shell 57 | $ vagrant up 58 | $ vagrant ssh 59 | $ cd /home/vagrant/deployer-on-homestead 60 | $ ./vendor/bin/dep deploy 61 | ``` 62 | 63 | **Goodluck!** :smile: 64 | 65 | All source code is availabled in [here][example-source] 66 | 67 | 68 | [Homestead]: https://laravel.com/docs/5.2/homestead 69 | [Laravel]: https://laravel.com/ 70 | [Deployer]: http://deployer.org/ 71 | [vagrant]: https://www.vagrantup.com/ 72 | [virtualbox]: https://www.virtualbox.org/ 73 | [deployer-example]: https://github.com/oanhnn/deployer-example 74 | [example-source]: https://github.com/oanhnn/deployer-on-homestead 75 | [key-generate]: https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/ 76 | -------------------------------------------------------------------------------- /docs/setting-up-and-add-a-deployer-user-to-ec2.md: -------------------------------------------------------------------------------- 1 | # Setting up and add a deployer user to Amazon EC2 Server 2 | 3 | ## Login by default user 4 | 5 | ``` 6 | $ ssh -i generatedKey.pem ec2-user@xx.xx.xxx.xxx 7 | ``` 8 | 9 | ## Setting up server 10 | ``` 11 | $ sudo apt-get install -y gcc g++ autoconf openssl libssl-dev libicu-dev libyaml-dev curl git-core vim ssh mcrypt imagemagick wget 12 | $ sudo apt-get install -y mysql-server libmysqlclient-dev nginx php5-fpm php5-cli php5-common php5-mcrypt php5-curl php5-json php5-gd php5-imagick php5-mysqlnd php5-intl php5-redis 13 | $ sudo apt-get install -y nodejs npm 14 | ``` 15 | 16 | ## Create a new deployer user 17 | 18 | ``` 19 | $ sudo useradd -g www-data deployer 20 | $ sudo passwd deployer 21 | ``` 22 | 23 | ### Edit user privileges 24 | 25 | ``` 26 | $ sudo visudo 27 | ``` 28 | 29 | **Add this to the last line** 30 | 31 | ``` 32 | #deployer user 33 | deployer ALL=(ALL:ALL) ALL 34 | deployer ALL=(ALL) NOPASSWD:/etc/init.d/php5-fpm *, /usr/sbin/service php5-fpm * 35 | ``` 36 | 37 | ## Creating public and private keys 38 | 39 | ``` 40 | $ sudo su deployer 41 | $ cd /home/deployer 42 | $ ssh-keygen -b 2048 -f deployer -t RSA -C deployer@xx.xx.xxx.xxx 43 | $ mkdir .ssh 44 | $ chmod 700 .ssh 45 | $ cat deployer.pub > .ssh/authorized_keys 46 | $ chmod 600 .ssh/authorized_keys 47 | $ sudo chown deployer:deployer .ssh 48 | $ sudo chown deployer:deployer .ssh/authorized_keys 49 | ``` 50 | 51 | ## Downloading your private key 52 | 53 | ``` 54 | $ sudo mv /home/deployer/deployer /home/ec2-user/ 55 | $ sudo mv /home/deployer/deployer.pub /home/ec2-user/ 56 | $ sudo chmod 0644 /home/ec2-user/deployer 57 | $ sudo chmod 0644 /home/ec2-user/deployer.pub 58 | ``` 59 | 60 | **On your local machine** 61 | 62 | ``` 63 | $ scp -i generatedKey.pem ec2-user@xx.xx.xxx.xxx:/home/ec2-user/deployer deployer.pem 64 | $ scp -i generatedKey.pem ec2-user@xx.xx.xxx.xxx:/home/ec2-user/deployer.pub deployer.pub 65 | ``` 66 | 67 | **On EC2** 68 | 69 | ``` 70 | $ sudo rm /home/ec2-user/deployer 71 | $ sudo rm /home/ec2-user/deployer.pub 72 | ``` 73 | 74 | ## Test it out 75 | 76 | ``` 77 | $ ssh -i deployer.pem deployer@xx.xx.xxx.xxx 78 | ``` 79 | -------------------------------------------------------------------------------- /setup/chmodr.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # chmodr.sh 4 | # 5 | # author: Francis Byrne 6 | # date: 2011/02/12 7 | # source: https://gist.github.com/francisbyrne/3731497 8 | # 9 | # Generic Script for recursively setting permissions for directories and files 10 | # to defined or default permissions using chmod. 11 | # 12 | # Takes a path to recurse through and options for specifying directory and/or 13 | # file permissions. 14 | # Outputs a list of affected directories and files. 15 | # 16 | # If no options are specified, it recursively resets all directory and file 17 | # permissions to the default for most OSs (dirs: 755, files: 644). 18 | 19 | # Usage message 20 | usage() 21 | { 22 | echo "Usage: $0 PATH -d DIRPERMS -f FILEPERMS" 23 | echo "Arguments:" 24 | echo "PATH: path to the root directory you wish to modify permissions for" 25 | echo "Options:" 26 | echo " -d DIRPERMS, directory permissions" 27 | echo " -f FILEPERMS, file permissions" 28 | exit 1 29 | } 30 | 31 | # Check if user entered arguments 32 | if [ $# -lt 1 ] ; then 33 | usage 34 | fi 35 | 36 | # Get options 37 | while getopts d:f: opt 38 | do 39 | case "$opt" in 40 | d) DIRPERMS="$OPTARG";; 41 | f) FILEPERMS="$OPTARG";; 42 | \?) usage;; 43 | esac 44 | done 45 | 46 | # Shift option index so that $1 now refers to the first argument 47 | shift $(($OPTIND - 1)) 48 | 49 | # Default directory and file permissions, if not set on command line 50 | if [ -z "$DIRPERMS" ] && [ -z "$FILEPERMS" ] ; then 51 | DIRPERMS=755 52 | FILEPERMS=644 53 | fi 54 | 55 | # Set the root path to be the argument entered by the user 56 | ROOT=$1 57 | 58 | # Check if the root path is a valid directory 59 | if [ ! -d $ROOT ] ; then 60 | echo "$ROOT does not exist or isn't a directory!" ; exit 1 61 | fi 62 | 63 | # Recursively set directory/file permissions based on the permission variables 64 | if [ -n "$DIRPERMS" ] ; then 65 | find $ROOT -type d -print0 | xargs -0 chmod -v $DIRPERMS 66 | fi 67 | 68 | if [ -n "$FILEPERMS" ] ; then 69 | find $ROOT -type f -print0 | xargs -0 chmod -v $FILEPERMS 70 | fi 71 | -------------------------------------------------------------------------------- /setup/key/.gitkeep: -------------------------------------------------------------------------------- 1 | # Save key in here 2 | -------------------------------------------------------------------------------- /setup/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | export cf_timezone="Asia/Tokyo" 3 | export cf_username="dev" 4 | export cf_password="dev@2017" 5 | # Default, SELinux is disabled in Amazon Linux 6 | export cf_firewall_enabled=false 7 | export cf_selinux_enabled=false 8 | export cf_deploy_path="/var/www/apps/slim" 9 | 10 | echo ">> Prevent remote access with plaintext password and enable agent forwarding" 11 | sudo sed -i -e "s/^PasswordAuthentication *yes/PasswordAuthentication no/g" /etc/ssh/sshd_config 12 | sudo sed -i -e "s/^#AllowAgentForwarding *yes/AllowAgentForwarding yes/" /etc/ssh/sshd_config 13 | sudo systemctl restart sshd 14 | 15 | if [[ $cf_firewall_enabled == true ]] 16 | then 17 | echo ">> Enable firewalld service" 18 | sudo systemctl start firewalld 19 | sudo systemctl enable firewalld 20 | sudo firewall-cmd --permanent --add-port=22/tcp 21 | sudo firewall-cmd --permanent --add-port=80/tcp 22 | sudo firewall-cmd --reload 23 | else 24 | echo ">> Disable firewalld service" 25 | sudo systemctl stop firewalld 26 | sudo systemctl disable firewalld 27 | fi 28 | 29 | # Default, SELinux is disabled in Amazon Linux 30 | if [[ $cf_selinux_enabled == true ]] 31 | then 32 | echo ">> Fix SELinux" 33 | sudo setsebool -P httpd_can_network_connect 1 34 | sudo setsebool -P httpd_can_network_connect_db 1 35 | sudo setsebool -P httpd_can_network_memcache 1 36 | sudo setsebool -P httpd_anon_write 1 37 | sudo setsebool -P httpd_sys_script_anon_write 1 38 | sudo setsebool -P httpd_unified 1 39 | sudo setsebool -P httpd_can_sendmail 1 40 | else 41 | echo ">> Disable SELinux" 42 | sudo setenforce 0 43 | sudo sed -i 's/SELINUX=\(enforcing\|permissive\)/SELINUX=disabled/g' /etc/sysconfig/selinux 44 | sudo sed -i 's/SELINUX=\(enforcing\|permissive\)/SELINUX=disabled/g' /etc/selinux/config 45 | fi 46 | 47 | echo ">> Install common packages" 48 | sudo yum install -y epel-release 49 | sudo yum update -y 50 | sudo yum install -y wget curl gcc gcc-c++ make git unzip tree openssl \ 51 | gd libxml2 zlib pcre telnet nmap 52 | 53 | echo ">> Install 'chmodr' command" 54 | sudo cp -f ./chmodr.sh /usr/bin/chmodr && \ 55 | sudo chmod a+x /usr/bin/chmodr 56 | 57 | echo ">> Install Apache" 58 | sudo yum -y install httpd24 httpd24-tools 59 | 60 | # ensure it is running 61 | sudo service httpd start 62 | sudo chkconfig httpd on --level 2345 63 | 64 | echo ">> Install PHP 5.6" 65 | sudo yum install -y php56 php56-cli php56-common \ 66 | php56-gd php56-intl php56-mbstring php56-mcrypt php56-pdo php56-mysqlnd php56-xml 67 | 68 | echo ">> Configure and secure PHP" 69 | sudo sed -i -e "s#^;date\.timezone=.*#date.timezone=$cf_timezone#" /etc/php.ini && \ 70 | #sudo sed -i -e "s/^;cgi\.fix_pathinfo=.*/cgi.fix_pathinfo=0/" /etc/php.ini && \ 71 | sudo sed -i -e "s#^short_open_tag=.*#short_open_tag=On#" /etc/php.ini 72 | 73 | echo ">> Install Composer" 74 | curl -sSL https://getcomposer.org/installer | php 75 | sudo mv composer.phar /usr/local/bin/composer 76 | sudo chmod a+x /usr/local/bin/composer 77 | 78 | echo ">> Create deploy user" 79 | sudo useradd -g apache $cf_username 80 | sudo echo $cf_username:$cf_password | sudo chpasswd 81 | 82 | # copy ssh key 83 | sudo mkdir -p /home/$cf_username/.ssh 84 | sudo cp -f ./key/id_rsa /home/$cf_username/.ssh/id_rsa 85 | sudo cp -f ./key/id_rsa.pub /home/$cf_username/.ssh/authorized_keys 86 | sudo chmod 600 /home/$cf_username/.ssh/id_rsa 87 | sudo chmod 644 /home/$cf_username/.ssh/authorized_keys 88 | sudo chown -R $cf_username:apache /home/$cf_username/.ssh/ 89 | 90 | echo ">> Config Apache and vhost" 91 | touch $cf_deploy_path/shared/app/config/vhost_apache.conf 92 | sudo ln -ns $cf_deploy_path/shared/app/config/vhost_apache.conf /etc/httpd/conf.d/vhost_apache.conf 93 | sudo mkdir -p $cf_deploy_path/current/public 94 | sudo chown -R $cf_username:apache $cf_deploy_path 95 | 96 | echo ">> Enable basic authenticate" 97 | sudo htpasswd -cb /etc/httpd/.htpasswd $cf_username $cf_password 98 | sudo service httpd restart 99 | 100 | echo ">> Add deploy user to sudoers list" 101 | sudo touch /etc/sudoers.d/$cf_username 102 | sudo echo "$cf_username ALL=(ALL) NOPASSWD:/sbin/service httpd, /etc/init.d/httpd" > /etc/sudoers.d/$cf_username 103 | -------------------------------------------------------------------------------- /shared/app/config/app.php.tpl: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * For the full copyright and license information, please view the LICENSE.md 8 | * file that was distributed with this source code. 9 | */ 10 | 11 | return [ 12 | 'settings' => [ 13 | // Application settings 14 | 'displayErrorDetails' => {{app.debug}}, 15 | 16 | // Renderer settings 17 | 'renderer' => [ 18 | 'engine' => 'php', 19 | 'template_path' => VIEW_PATH, 20 | 'config' => [], 21 | ], 22 | 23 | // Monolog settings 24 | 'logger' => [ 25 | 'name' => 'app', 26 | 'path' => LOG_PATH . '/app.log', 27 | 'level' => Monolog\Logger::DEBUG, 28 | ], 29 | 30 | // DoctrineDBAL settings 31 | 'database' => [ 32 | 'meta' => [ 33 | 'entity_path' => [ 34 | 'src/Model/Entity' 35 | ], 36 | 'auto_generate_proxies' => true, 37 | 'proxy_dir' => CACHE_PATH . '/proxies', 38 | 'cache' => null, 39 | ], 40 | 'connection' => [ 41 | 'driver' => 'pdo_mysql', 42 | 'host' => {{app.mysql.host}}, 43 | 'port' => {{app.mysql.port}}, 44 | 'dbname' => {{app.mysql.dbname}}, 45 | 'user' => {{app.mysql.username}}, 46 | 'password' => {{app.mysql.password}}, 47 | ] 48 | ], 49 | ], 50 | ]; 51 | -------------------------------------------------------------------------------- /shared/app/config/vhost_apache.conf.tpl: -------------------------------------------------------------------------------- 1 | ServerName {{app.domain}}:80 2 | 3 | ServerAdmin webmaster@{{app.domain}} 4 | ServerName {{app.domain}} 5 | 6 | DocumentRoot {{deploy_path}}/current/public 7 | 8 | Options Indexes FollowSymLinks MultiViews 9 | AllowOverride All 10 | 11 | # Basic authenticate 12 | AuthType Basic 13 | AuthName "This is a protected site" 14 | AuthUserFile /etc/httpd/.htpasswd 15 | Require valid-user 16 | 17 | # 18 | # Require all granted 19 | # 20 | 21 | 22 | ErrorLog "|/usr/sbin/rotatelogs {{deploy_path}}/tmp/logs/httpd-error.log.%Y-%m-%d-%H_%M_%S 5M" 23 | 24 | # Possible values include: debug, info, notice, warn, error, crit, 25 | # alert, emerg. 26 | LogLevel warn 27 | 28 | CustomLog "|/usr/sbin/rotatelogs -l {{deploy_path}}/tmp/logs/httpd-access.log.%Y.%m.%d 86400" combined 29 | 30 | -------------------------------------------------------------------------------- /shared/app/config/vhost_nginx.conf.tpl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oanhnn/example-deployer-slim/aedbfacb67f2237abec892150ad93ab82cb2083c/shared/app/config/vhost_nginx.conf.tpl -------------------------------------------------------------------------------- /stage/dev.php: -------------------------------------------------------------------------------- 1 | user('dev') 5 | ->forwardAgent() 6 | ->stage(['dev']) 7 | ->set('deploy_path', '/var/www/apps/slim') 8 | ->set('branch', '3.x') 9 | 10 | ->set('app.debug', true) 11 | ->set('app.domain', 'slim-app.dev') 12 | 13 | ->set('app.mysql.host', '127.0.0.1') 14 | ->set('app.mysql.port', '3306') 15 | ->set('app.mysql.username', 'root') 16 | ->set('app.mysql.password', '') 17 | ->set('app.mysql.dbname', 'test') 18 | ; 19 | -------------------------------------------------------------------------------- /stage/servers.yml: -------------------------------------------------------------------------------- 1 | # list servers 2 | # ------------- 3 | dev-svr: 4 | host: 192.168.11.3 5 | port: 22 6 | user: dev 7 | # identity_file: 8 | # public_key: key/id_rsa.pub 9 | # private_key: key/id_rsa 10 | # password: passphrase 11 | forward_agent: ~ 12 | stage: dev 13 | deploy_path: /var/www/apps/slim 14 | branch: 3.x 15 | app: 16 | debug: true 17 | domain: slim-app.dev 18 | mysql: 19 | host: 127.0.0.1 20 | port: 3306 21 | username: root 22 | password: "" 23 | dbname: "test" 24 | --------------------------------------------------------------------------------