├── .env ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── bin ├── build.sh ├── console ├── react-worker.php └── road-runner-worker.php ├── composer.json ├── composer.lock ├── config ├── bootstrap.php ├── bundles.php ├── packages │ ├── dev │ │ ├── monolog.yaml │ │ └── routing.yaml │ ├── framework.yaml │ ├── prod │ │ └── monolog.yaml │ ├── routing.yaml │ ├── sensio_framework_extra.yaml │ └── test │ │ ├── framework.yaml │ │ ├── monolog.yaml │ │ └── routing.yaml ├── routes.yaml ├── routes │ └── annotations.yaml └── services.yaml ├── docker ├── nginx-unit │ ├── docker-compose.yml │ ├── nginx │ │ ├── docker.conf │ │ └── nginx.conf │ └── unit │ │ ├── Dockerfile │ │ ├── conf.json │ │ └── php.ini ├── php-fpm │ ├── docker-compose.yml │ ├── nginx │ │ ├── docker.conf │ │ └── nginx.conf │ └── php-fpm │ │ ├── Dockerfile │ │ ├── php-fpm.conf │ │ └── php.ini ├── php-ppm │ ├── docker-compose.yml │ ├── nginx │ │ ├── docker.conf │ │ └── nginx.conf │ └── php-cli │ │ ├── Dockerfile │ │ ├── config.json │ │ └── php.ini ├── react-php-reboot │ ├── docker-compose.yml │ ├── nginx │ │ ├── docker.conf │ │ └── nginx.conf │ └── php-cli │ │ ├── Dockerfile │ │ └── php.ini ├── react-php │ ├── docker-compose.yml │ ├── nginx │ │ ├── docker.conf │ │ └── nginx.conf │ └── php-cli │ │ ├── Dockerfile │ │ └── php.ini ├── road-runner-reboot │ ├── docker-compose.yml │ ├── nginx │ │ ├── docker.conf │ │ └── nginx.conf │ └── road-runner │ │ ├── .rr.yaml │ │ ├── Dockerfile │ │ └── php.ini └── road-runner │ ├── docker-compose.yml │ ├── nginx │ ├── docker.conf │ └── nginx.conf │ └── road-runner │ ├── .rr.yaml │ ├── Dockerfile │ └── php.ini ├── public └── index.php ├── src ├── Controller │ └── DefaultController.php └── Kernel.php ├── symfony.lock └── tests ├── charts ├── chart_100.html ├── chart_1000.html ├── chart_10000.html ├── chart_500.html ├── generate.php └── template.html ├── load.yaml.example └── monitoring.xml.example /.env: -------------------------------------------------------------------------------- 1 | APP_ENV=prod 2 | APP_SECRET=df235aefd6be18d4d188cb5bd5cb4961 3 | APP_TYPE=nginx-unit 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /tests/logs 3 | /tests/overload_token.txt 4 | /tests/load.yaml 5 | /tests/monitoring.xml 6 | /public/bundles/ 7 | /var/ 8 | /vendor/ 9 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:7.2-cli as build 2 | 3 | RUN apt-get update && apt-get upgrade -y \ 4 | unzip \ 5 | libmcrypt-dev \ 6 | zlib1g-dev \ 7 | && docker-php-ext-install \ 8 | iconv \ 9 | mbstring \ 10 | zip \ 11 | bcmath 12 | 13 | RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" 14 | RUN php composer-setup.php 15 | RUN mv composer.phar /usr/local/bin/composer 16 | RUN chmod +x /usr/local/bin/composer 17 | 18 | COPY . /app 19 | ENV APP_ENV prod 20 | RUN sh /app/bin/build.sh 21 | 22 | FROM alpine 23 | 24 | COPY --from=build /app /app 25 | RUN chmod -R 777 /app/var -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2019 Sukhachev Anton 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | "Software"), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PHP Load test 2 | 3 | * PHP FPM 4 | * PHP PPM 5 | * Nginx Unit 6 | * React PHP 7 | * Road-runner 8 | 9 | ### Application 10 | * PHP 7.2 11 | * Symfony 4 12 | 13 | ## Installation 14 | ### PHP FPM 15 | ```sh 16 | cd docker/php-fpm && docker-compose up 17 | ``` 18 | 19 | ### PHP PPM 20 | ```sh 21 | cd docker/php-ppm && docker-compose up 22 | ``` 23 | 24 | ### Nginx Unit 25 | ```sh 26 | cd docker/nginx-unit && docker-compose up 27 | ``` 28 | 29 | ### React PHP 30 | ```sh 31 | cd docker/react-php && docker-compose up --scale php=2 32 | ``` 33 | 34 | ### Road Runner 35 | ```sh 36 | cd docker/road-runner && docker-compose up 37 | ``` 38 | 39 | ## Example 40 | ```sh 41 | curl 'http://127.0.0.1:8000/' | python -m json.tool 42 | { 43 | "env": "prod", 44 | "type": "php-fpm", 45 | "pid": 8, 46 | "random_num": 37264, 47 | "php": { 48 | "version": "7.2.12", 49 | "date.timezone": "Europe/Paris", 50 | "display_errors": "", 51 | "error_log": "/proc/self/fd/2", 52 | "error_reporting": "32767", 53 | "log_errors": "1", 54 | "memory_limit": "256M", 55 | "opcache.enable": "1", 56 | "opcache.max_accelerated_files": "20000", 57 | "opcache.memory_consumption": "256", 58 | "opcache.validate_timestamps": "0", 59 | "realpath_cache_size": "4096K", 60 | "realpath_cache_ttl": "600", 61 | "short_open_tag": "" 62 | } 63 | } 64 | ``` 65 | 66 | ## Tests 67 | + copy tests/load.yaml from tests/load.yaml.example 68 | and replace $SERVER and $PORT variables in tests/load.yaml 69 | 70 | + copy tests/monitoring.xml from tests/monitoring.xml.example 71 | and replace $SERVER and $USERNAME variables in tests/monitoring.xml 72 | 73 | + get token from https://overload.yandex.net and put it to file tests/overload_token.txt 74 | 75 | + put ssh public key to target server 76 | 77 | + run yandex-tank: 78 | ```sh 79 | cd tests && docker run -v $(pwd):/var/loadtest -v $HOME/.ssh:/root/.ssh --net host -it direvius/yandex-tank 80 | ``` 81 | 82 | ## 100 rps 83 | ```yaml 84 | phantom: 85 | load_profile: 86 | load_type: rps 87 | schedule: line(1, 100, 60s) const(100, 540s) 88 | ``` 89 | 90 | ### Overload links 91 | * php-fpm https://overload.yandex.net/150666 92 | * php-ppm https://overload.yandex.net/150670 93 | * nginx-unit https://overload.yandex.net/150675 94 | * road-runner https://overload.yandex.net/150681 95 | * road-runner-reboot https://overload.yandex.net/151961 96 | * react-php https://overload.yandex.net/150697 97 | * react-php-reboot https://overload.yandex.net/152063 98 | 99 | ### Cumulative quantiles (ms) 100 | | | 95%(ms) | 90%(ms) | 80%(ms) | 50%(ms) | HTTP OK(%) | HTTP OK(count) | 101 | | ------------------ | ------- | ------- | ------- | ------- | ---------- | -------------- | 102 | | php-fpm | 9.9 | 6.3 | 4.35 | 3.59 | 100 | 57030 | 103 | | php-ppm | 9.4 | 6 | 3.88 | 3.16 | 100 | 57030 | 104 | | nginx-unit | 11 | 6.6 | 4.43 | 3.69 | 100 | 57030 | 105 | | road-runner | 8.1 | 5.1 | 3.53 | 2.92 | 100 | 57030 | 106 | | road-runner-reboot | 12 | 8.6 | 5.3 | 3.85 | 100 | 57030 | 107 | | react-php | 8.5 | 4.91 | 3.29 | 2.74 | 100 | 57030 | 108 | | react-php-reboot | 13 | 8.5 | 5.5 | 3.95 | 100 | 57030 | 109 | 110 | ### Monitoring 111 | | | cpu median(%) | cpu max(%) | memory median(MB) | memory max(MB) | 112 | | ------------------ | ------------- | ---------- | ----------------- | -------------- | 113 | | php-fpm | 9.15 | 12.58 | 880.32 | 907.97 | 114 | | php-ppm | 7.08 | 13.68 | 901.72 | 913.80 | 115 | | nginx-unit | 9.56 | 12.54 | 923.02 | 943.90 | 116 | | road-runner | 5.57 | 8.61 | 992.71 | 1,001.46 | 117 | | road-runner-reboot | 9.18 | 12.67 | 848.43 | 870.26 | 118 | | react-php | 4.53 | 6.58 | 1,004.68 | 1,009.91 | 119 | | react-php-reboot | 9.61 | 12.67 | 885.92 | 892.52 | 120 | 121 | 122 | ## 500 rps 123 | ```yaml 124 | 125 | phantom: 126 | load_profile: 127 | load_type: rps 128 | schedule: line(1, 500, 60s) const(500, 540s) 129 | ``` 130 | 131 | ### Overload links 132 | * php-fpm https://overload.yandex.net/150705 133 | * php-ppm https://overload.yandex.net/150710 134 | * nginx-unit https://overload.yandex.net/150711 135 | * road-runner https://overload.yandex.net/150715 136 | * road-runner-reboot https://overload.yandex.net/152011 137 | * react-php https://overload.yandex.net/150717 138 | * react-php-reboot https://overload.yandex.net/152064 139 | 140 | ### Cumulative quantiles (ms) 141 | | | 95%(ms) | 90%(ms) | 80%(ms) | 50%(ms) | HTTP OK(%) | HTTP OK(count) | 142 | | ------------------ | ------- | ------- | ------- | ------- | ---------- | -------------- | 143 | | php-fpm | 13 | 8.4 | 5.3 | 3.69 | 100 | 285030 | 144 | | php-ppm | 15 | 9 | 4.72 | 3.24 | 100 | 285030 | 145 | | nginx-unit | 12 | 8 | 5.5 | 3.93 | 100 | 285030 | 146 | | road-runner | 9.6 | 6 | 3.71 | 2.83 | 100 | 285030 | 147 | | road-runner-reboot | 14 | 11 | 7.1 | 4.45 | 100 | 285030 | 148 | | react-php | 9.3 | 5.8 | 3.57 | 2.68 | 100 | 285030 | 149 | | react-php-reboot | 15 | 12 | 7.2 | 4.21 | 100 | 285030 | 150 | 151 | ### Monitoring 152 | | | cpu median(%) | cpu max(%) | memory median(MB) | memory max(MB) | 153 | | ------------------ | ------------- | ---------- | ----------------- | -------------- | 154 | | php-fpm | 41.68 | 48.33 | 1,006.06 | 1,015.09 | 155 | | php-ppm | 33.90 | 48.90 | 1,046.32 | 1,055.00 | 156 | | nginx-unit | 42.13 | 47.92 | 1,006.67 | 1,015.73 | 157 | | road-runner | 24.08 | 28.06 | 1,035.86 | 1,044.58 | 158 | | road-runner-reboot | 46.23 | 52.04 | 939.63 | 948.08 | 159 | | react-php | 19.57 | 23.42 | 1,049.83 | 1,060.26 | 160 | | react-php-reboot | 41.30 | 47.89 | 957.01 | 958.56 | 161 | 162 | 163 | ## 1000 rps 164 | ```yaml 165 | phantom: 166 | load_profile: 167 | load_type: rps 168 | schedule: line(1, 1000, 60s) const(1000, 60s) 169 | ``` 170 | ### Overload links 171 | * php-fpm https://overload.yandex.net/150841 172 | * php-fpm-80 https://overload.yandex.net/153612 173 | * php-ppm https://overload.yandex.net/150842 174 | * nginx-unit https://overload.yandex.net/150843 175 | * road-runner https://overload.yandex.net/150844 176 | * road-runner-reboot https://overload.yandex.net/152068 177 | * react-php https://overload.yandex.net/150846 178 | * react-php-reboot https://overload.yandex.net/152065 179 | 180 | ### Cumulative quantiles (ms) 181 | | | 95%(ms) | 90%(ms) | 80%(ms) | 50%(ms) | HTTP OK(%) | HTTP OK(count) | 182 | | ------------------ | ------- | ------- | ------- | ------- | ---------- | -------------- | 183 | | php-fpm | 11050 | 11050 | 9040 | 195 | 80.67 | 72627 | 184 | | php-fpm-80 | 3150 | 1375 | 1165 | 152 | 99.85 | 89895 | 185 | | php-ppm | 2785 | 2740 | 2685 | 2545 | 100 | 90030 | 186 | | nginx-unit | 98 | 80 | 60 | 21 | 100 | 90030 | 187 | | road-runner | 27 | 15 | 7.1 | 3.21 | 100 | 90030 | 188 | | road-runner-reboot | 1110 | 1100 | 1085 | 1060 | 100 | 90030 | 189 | | react-php | 23 | 13 | 5.6 | 2.86 | 100 | 90030 | 190 | | react-php-reboot | 28 | 24 | 19 | 11 | 100 | 90030 | 191 | 192 | ### Monitoring 193 | | | cpu median(%) | cpu max(%) | memory median(MB) | memory max(MB) | 194 | | ------------------ | ------------- | ---------- | ----------------- | -------------- | 195 | | php-fpm | 12.66 | 78.25 | 990.16 | 1,006.56 | 196 | | php-fpm-80 | 83.78 | 91.28 | 746.01 | 937.24 | 197 | | php-ppm | 66.16 | 91.20 | 1,088.74 | 1,102.92 | 198 | | nginx-unit | 78.11 | 88.77 | 1,010.15 | 1,062.01 | 199 | | road-runner | 42.93 | 54.23 | 1,010.89 | 1,068.48 | 200 | | road-runner-reboot | 77.64 | 85.66 | 976.44 | 1,044.05 | 201 | | react-php | 36.39 | 46.31 | 1,018.03 | 1,088.23 | 202 | | react-php-reboot | 72.11 | 81.81 | 911.28 | 961.62 | 203 | 204 | 205 | ## 10000 rps 206 | ```yaml 207 | phantom: 208 | load_profile: 209 | load_type: rps 210 | schedule: line(1, 10000, 30s) const(10000, 30s) 211 | ``` 212 | 213 | ### Overload links 214 | * php-fpm https://overload.yandex.net/150849 215 | * php-fpm-80 https://overload.yandex.net/153615 216 | * php-ppm https://overload.yandex.net/150874 217 | * nginx-unit https://overload.yandex.net/150876 218 | * road-runner https://overload.yandex.net/150881 219 | * road-runner-reboot https://overload.yandex.net/152069 220 | * react-php https://overload.yandex.net/150885 221 | * react-php-reboot https://overload.yandex.net/152066 222 | 223 | ### Cumulative quantiles (ms) 224 | | | 95%(ms) | 90%(ms) | 80%(ms) | 50%(ms) | HTTP OK(%) | HTTP OK(count) | 225 | | ------------------ | ------- | ------- | ------- | ------- | ---------- | -------------- | 226 | | php-fpm | 11050 | 11050 | 11050 | 1880 | 70.466 | 317107 | 227 | | php-fpm-80 | 3260 | 3140 | 1360 | 1145 | 99.619 | 448301 | 228 | | php-ppm | 2755 | 2730 | 2695 | 2605 | 100 | 450015 | 229 | | nginx-unit | 1020 | 1010 | 1000 | 980 | 100 | 450015 | 230 | | road-runner | 640 | 630 | 615 | 580 | 100 | 450015 | 231 | | road-runner-reboot | 1130 | 1120 | 1110 | 1085 | 100 | 450015 | 232 | | react-php | 1890 | 1090 | 1045 | 58 | 99.996 | 449996 | 233 | | react-php-reboot | 3480 | 3070 | 1255 | 91 | 99.72 | 448753 | 234 | 235 | ### Monitoring 236 | | | cpu median(%) | cpu max(%) | memory median(MB) | memory max(MB) | 237 | | ------------------ | ------------- | ---------- | ----------------- | -------------- | 238 | | php-fpm | 5.57 | 79.35 | 984.47 | 998.78 | 239 | | php-fpm-80 | 85.05 | 92.19 | 936.64 | 943.93 | 240 | | php-ppm | 66.86 | 82.41 | 1,089.31 | 1,097.41 | 241 | | nginx-unit | 86.14 | 93.94 | 1,067.71 | 1,069.52 | 242 | | road-runner | 73.41 | 82.72 | 1,129.48 | 1,134.00 | 243 | | road-runner-reboot | 80.32 | 86.29 | 982.69 | 984.80 | 244 | | react-php | 73.76 | 82.18 | 1,101.71 | 1,105.06 | 245 | | react-php-reboot | 85.77 | 91.92 | 975.85 | 978.42 | 246 | 247 | ## Charts 248 | 249 | ### Test log directories 250 | ```sh 251 | test_logs 252 | /php-fpm 253 | /php-ppm 254 | /nginx-unit 255 | /road-runner 256 | /react-php 257 | ``` 258 | 259 | ### Generate charts 260 | ```sh 261 | php tests/charts/generate.php /path/to/test_logs /path/to/output/file.html 262 | Input dir: /path/to/test_logs 263 | Output file: tank_100.html 264 | Handling /path/to/test_logs/nginx-unit/monitoring.log... 265 | Handling /path/to/test_logs/nginx-unit/phout_DIv_wS.log... 266 | Handling /path/to/test_logs/php-fpm/monitoring.log... 267 | Handling /path/to/test_logs/php-fpm/phout_j5yRj3.log... 268 | Handling /path/to/test_logs/php-ppm/monitoring.log... 269 | Handling /path/to/test_logs/php-ppm/phout_aEAoEM.log... 270 | Handling /path/to/test_logs/react-php/monitoring.log... 271 | Handling /path/to/test_logs/react-php/phout_u50Gwi.log... 272 | Handling /path/to/test_logs/road-runner/monitoring.log... 273 | Handling /path/to/test_logs/road-runner/phout_RSKT30.log... 274 | Done! 275 | ``` 276 | -------------------------------------------------------------------------------- /bin/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | Fail() { 4 | echo "ERROR: $@" 1>&2 5 | exit 1 6 | } 7 | 8 | which realpath >/dev/null || Fail "realpath not found" 9 | which php >/dev/null || Fail "php not found" 10 | which composer >/dev/null || Fail "composer not found" 11 | 12 | cd "$(realpath "$(dirname "$0")"/..)" 13 | 14 | composer install --prefer-dist --no-interaction 15 | composer dump-autoload --optimize --no-dev --classmap-authoritative 16 | 17 | php bin/console cache:clear --no-warmup 18 | php bin/console cache:warmup -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | getParameterOption(['--env', '-e'], null, true)) { 19 | putenv('APP_ENV='.$_ENV['APP_ENV']); 20 | // force loading .env files when --env is defined 21 | $_SERVER['APP_ENV'] = null; 22 | } 23 | 24 | if ($input->hasParameterOption('--no-debug', true)) { 25 | putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); 26 | } 27 | 28 | require dirname(__DIR__).'/config/bootstrap.php'; 29 | 30 | if ($_SERVER['APP_DEBUG']) { 31 | umask(0000); 32 | 33 | if (class_exists(Debug::class)) { 34 | Debug::enable(); 35 | } 36 | } 37 | 38 | $kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); 39 | $application = new Application($kernel); 40 | $application->run($input); 41 | -------------------------------------------------------------------------------- /bin/react-worker.php: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | 3 | boot(); 31 | $rebootKernelAfterRequest = in_array('--reboot-kernel-after-request', $argv); 32 | 33 | /** @var \Psr\Log\LoggerInterface $logger */ 34 | $logger = $kernel->getContainer()->get('logger'); 35 | $server = new React\Http\Server(function (Psr\Http\Message\ServerRequestInterface $request) use ($kernel, $logger, $rebootKernelAfterRequest) { 36 | 37 | $method = $request->getMethod(); 38 | $headers = $request->getHeaders(); 39 | $content = $request->getBody(); 40 | $post = []; 41 | if (in_array(strtoupper($method), ['POST', 'PUT', 'DELETE', 'PATCH']) && 42 | isset($headers['Content-Type']) && (0 === strpos($headers['Content-Type'], 'application/x-www-form-urlencoded')) 43 | ) { 44 | parse_str($content, $post); 45 | } 46 | $sfRequest = new Symfony\Component\HttpFoundation\Request( 47 | $request->getQueryParams(), 48 | $post, 49 | [], 50 | $request->getCookieParams(), 51 | $request->getUploadedFiles(), 52 | [], 53 | $content 54 | ); 55 | $sfRequest->setMethod($method); 56 | $sfRequest->headers->replace($headers); 57 | $sfRequest->server->set('REQUEST_URI', $request->getUri()); 58 | 59 | if (isset($headers['Host'])) { 60 | $sfRequest->server->set('SERVER_NAME', current($headers['Host'])); 61 | } 62 | 63 | try { 64 | $sfResponse = $kernel->handle($sfRequest); 65 | } catch (\Exception $e) { 66 | $logger->error('Internal server error', ['error' => $e->getMessage(), 'trace' => $e->getTraceAsString()]); 67 | $sfResponse = new \Symfony\Component\HttpFoundation\Response('Internal server error', 500); 68 | } catch (\Throwable $e) { 69 | $logger->error('Internal server error', ['error' => $e->getMessage(), 'trace' => $e->getTraceAsString()]); 70 | $sfResponse = new \Symfony\Component\HttpFoundation\Response('Internal server error', 500); 71 | } 72 | 73 | $kernel->terminate($sfRequest, $sfResponse); 74 | if ($rebootKernelAfterRequest) { 75 | $kernel->reboot(null); 76 | } 77 | 78 | return new React\Http\Response( 79 | $sfResponse->getStatusCode(), 80 | $sfResponse->headers->all(), 81 | $sfResponse->getContent() 82 | ); 83 | }); 84 | 85 | $server->on('error', function (\Exception $e) use ($logger) { 86 | $logger->error('Internal server error', ['error' => $e->getMessage(), 'trace' => $e->getTraceAsString()]); 87 | }); 88 | 89 | $socket = new React\Socket\Server('tcp://0.0.0.0:9000', $loop); 90 | $server->listen($socket); 91 | 92 | $logger->info('Server running', ['addr' => 'tcp://0.0.0.0:9000']); 93 | 94 | $loop->run(); -------------------------------------------------------------------------------- /bin/road-runner-worker.php: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | 3 | boot(); 35 | $rebootKernelAfterRequest = in_array('--reboot-kernel-after-request', $argv); 36 | $relay = new SocketRelay('/tmp/road-runner.sock', null, SocketRelay::SOCK_UNIX); 37 | $psr7 = new PSR7Client(new Worker($relay)); 38 | $httpFoundationFactory = new HttpFoundationFactory(); 39 | $diactorosFactory = new DiactorosFactory(); 40 | 41 | while ($req = $psr7->acceptRequest()) { 42 | try { 43 | $request = $httpFoundationFactory->createRequest($req); 44 | $response = $kernel->handle($request); 45 | $psr7->respond($diactorosFactory->createResponse($response)); 46 | $kernel->terminate($request, $response); 47 | if($rebootKernelAfterRequest) { 48 | $kernel->reboot(null); 49 | } 50 | } catch (\Throwable $e) { 51 | $psr7->getWorker()->error((string)$e); 52 | } 53 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "project", 3 | "license": "proprietary", 4 | "require": { 5 | "php": "^7.1.3", 6 | "ext-ctype": "*", 7 | "ext-iconv": "*", 8 | "php-pm/httpkernel-adapter": "^1.0", 9 | "php-pm/php-pm": "dev-master as 1.0.x-dev", 10 | "react/http": "^0.8.3", 11 | "sensio/framework-extra-bundle": "^5.2", 12 | "spiral/roadrunner": "^1.2", 13 | "symfony/console": "4.1.*", 14 | "symfony/flex": "^1.1", 15 | "symfony/framework-bundle": "4.1.*", 16 | "symfony/monolog-bundle": "^3.3", 17 | "symfony/psr-http-message-bridge": "^1.1", 18 | "symfony/yaml": "4.1.*" 19 | }, 20 | "require-dev": { 21 | "symfony/dotenv": "4.1.*" 22 | }, 23 | "config": { 24 | "preferred-install": { 25 | "*": "dist" 26 | }, 27 | "sort-packages": true 28 | }, 29 | "autoload": { 30 | "psr-4": { 31 | "App\\": "src/" 32 | } 33 | }, 34 | "autoload-dev": { 35 | "psr-4": { 36 | "App\\Tests\\": "tests/" 37 | } 38 | }, 39 | "replace": { 40 | "paragonie/random_compat": "2.*", 41 | "symfony/polyfill-ctype": "*", 42 | "symfony/polyfill-iconv": "*", 43 | "symfony/polyfill-php71": "*", 44 | "symfony/polyfill-php70": "*", 45 | "symfony/polyfill-php56": "*" 46 | }, 47 | "scripts": { 48 | "auto-scripts": { 49 | "cache:clear": "symfony-cmd", 50 | "assets:install %PUBLIC_DIR%": "symfony-cmd" 51 | }, 52 | "post-install-cmd": [ 53 | "@auto-scripts" 54 | ], 55 | "post-update-cmd": [ 56 | "@auto-scripts" 57 | ] 58 | }, 59 | "conflict": { 60 | "symfony/symfony": "*" 61 | }, 62 | "extra": { 63 | "symfony": { 64 | "allow-contrib": false, 65 | "require": "4.1.*" 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /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#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "05d864fc04195bdcb6127218ea19d495", 8 | "packages": [ 9 | { 10 | "name": "doctrine/annotations", 11 | "version": "v1.6.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/annotations.git", 15 | "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", 20 | "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "doctrine/lexer": "1.*", 25 | "php": "^7.1" 26 | }, 27 | "require-dev": { 28 | "doctrine/cache": "1.*", 29 | "phpunit/phpunit": "^6.4" 30 | }, 31 | "type": "library", 32 | "extra": { 33 | "branch-alias": { 34 | "dev-master": "1.6.x-dev" 35 | } 36 | }, 37 | "autoload": { 38 | "psr-4": { 39 | "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" 40 | } 41 | }, 42 | "notification-url": "https://packagist.org/downloads/", 43 | "license": [ 44 | "MIT" 45 | ], 46 | "authors": [ 47 | { 48 | "name": "Roman Borschel", 49 | "email": "roman@code-factory.org" 50 | }, 51 | { 52 | "name": "Benjamin Eberlei", 53 | "email": "kontakt@beberlei.de" 54 | }, 55 | { 56 | "name": "Guilherme Blanco", 57 | "email": "guilhermeblanco@gmail.com" 58 | }, 59 | { 60 | "name": "Jonathan Wage", 61 | "email": "jonwage@gmail.com" 62 | }, 63 | { 64 | "name": "Johannes Schmitt", 65 | "email": "schmittjoh@gmail.com" 66 | } 67 | ], 68 | "description": "Docblock Annotations Parser", 69 | "homepage": "http://www.doctrine-project.org", 70 | "keywords": [ 71 | "annotations", 72 | "docblock", 73 | "parser" 74 | ], 75 | "time": "2017-12-06T07:11:42+00:00" 76 | }, 77 | { 78 | "name": "doctrine/cache", 79 | "version": "v1.8.0", 80 | "source": { 81 | "type": "git", 82 | "url": "https://github.com/doctrine/cache.git", 83 | "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57" 84 | }, 85 | "dist": { 86 | "type": "zip", 87 | "url": "https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57", 88 | "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57", 89 | "shasum": "" 90 | }, 91 | "require": { 92 | "php": "~7.1" 93 | }, 94 | "conflict": { 95 | "doctrine/common": ">2.2,<2.4" 96 | }, 97 | "require-dev": { 98 | "alcaeus/mongo-php-adapter": "^1.1", 99 | "doctrine/coding-standard": "^4.0", 100 | "mongodb/mongodb": "^1.1", 101 | "phpunit/phpunit": "^7.0", 102 | "predis/predis": "~1.0" 103 | }, 104 | "suggest": { 105 | "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" 106 | }, 107 | "type": "library", 108 | "extra": { 109 | "branch-alias": { 110 | "dev-master": "1.8.x-dev" 111 | } 112 | }, 113 | "autoload": { 114 | "psr-4": { 115 | "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" 116 | } 117 | }, 118 | "notification-url": "https://packagist.org/downloads/", 119 | "license": [ 120 | "MIT" 121 | ], 122 | "authors": [ 123 | { 124 | "name": "Roman Borschel", 125 | "email": "roman@code-factory.org" 126 | }, 127 | { 128 | "name": "Benjamin Eberlei", 129 | "email": "kontakt@beberlei.de" 130 | }, 131 | { 132 | "name": "Guilherme Blanco", 133 | "email": "guilhermeblanco@gmail.com" 134 | }, 135 | { 136 | "name": "Jonathan Wage", 137 | "email": "jonwage@gmail.com" 138 | }, 139 | { 140 | "name": "Johannes Schmitt", 141 | "email": "schmittjoh@gmail.com" 142 | } 143 | ], 144 | "description": "Caching library offering an object-oriented API for many cache backends", 145 | "homepage": "https://www.doctrine-project.org", 146 | "keywords": [ 147 | "cache", 148 | "caching" 149 | ], 150 | "time": "2018-08-21T18:01:43+00:00" 151 | }, 152 | { 153 | "name": "doctrine/collections", 154 | "version": "v1.5.0", 155 | "source": { 156 | "type": "git", 157 | "url": "https://github.com/doctrine/collections.git", 158 | "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf" 159 | }, 160 | "dist": { 161 | "type": "zip", 162 | "url": "https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf", 163 | "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf", 164 | "shasum": "" 165 | }, 166 | "require": { 167 | "php": "^7.1" 168 | }, 169 | "require-dev": { 170 | "doctrine/coding-standard": "~0.1@dev", 171 | "phpunit/phpunit": "^5.7" 172 | }, 173 | "type": "library", 174 | "extra": { 175 | "branch-alias": { 176 | "dev-master": "1.3.x-dev" 177 | } 178 | }, 179 | "autoload": { 180 | "psr-0": { 181 | "Doctrine\\Common\\Collections\\": "lib/" 182 | } 183 | }, 184 | "notification-url": "https://packagist.org/downloads/", 185 | "license": [ 186 | "MIT" 187 | ], 188 | "authors": [ 189 | { 190 | "name": "Roman Borschel", 191 | "email": "roman@code-factory.org" 192 | }, 193 | { 194 | "name": "Benjamin Eberlei", 195 | "email": "kontakt@beberlei.de" 196 | }, 197 | { 198 | "name": "Guilherme Blanco", 199 | "email": "guilhermeblanco@gmail.com" 200 | }, 201 | { 202 | "name": "Jonathan Wage", 203 | "email": "jonwage@gmail.com" 204 | }, 205 | { 206 | "name": "Johannes Schmitt", 207 | "email": "schmittjoh@gmail.com" 208 | } 209 | ], 210 | "description": "Collections Abstraction library", 211 | "homepage": "http://www.doctrine-project.org", 212 | "keywords": [ 213 | "array", 214 | "collections", 215 | "iterator" 216 | ], 217 | "time": "2017-07-22T10:37:32+00:00" 218 | }, 219 | { 220 | "name": "doctrine/common", 221 | "version": "v2.10.0", 222 | "source": { 223 | "type": "git", 224 | "url": "https://github.com/doctrine/common.git", 225 | "reference": "30e33f60f64deec87df728c02b107f82cdafad9d" 226 | }, 227 | "dist": { 228 | "type": "zip", 229 | "url": "https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d", 230 | "reference": "30e33f60f64deec87df728c02b107f82cdafad9d", 231 | "shasum": "" 232 | }, 233 | "require": { 234 | "doctrine/annotations": "^1.0", 235 | "doctrine/cache": "^1.0", 236 | "doctrine/collections": "^1.0", 237 | "doctrine/event-manager": "^1.0", 238 | "doctrine/inflector": "^1.0", 239 | "doctrine/lexer": "^1.0", 240 | "doctrine/persistence": "^1.1", 241 | "doctrine/reflection": "^1.0", 242 | "php": "^7.1" 243 | }, 244 | "require-dev": { 245 | "doctrine/coding-standard": "^1.0", 246 | "phpunit/phpunit": "^6.3", 247 | "squizlabs/php_codesniffer": "^3.0", 248 | "symfony/phpunit-bridge": "^4.0.5" 249 | }, 250 | "type": "library", 251 | "extra": { 252 | "branch-alias": { 253 | "dev-master": "2.10.x-dev" 254 | } 255 | }, 256 | "autoload": { 257 | "psr-4": { 258 | "Doctrine\\Common\\": "lib/Doctrine/Common" 259 | } 260 | }, 261 | "notification-url": "https://packagist.org/downloads/", 262 | "license": [ 263 | "MIT" 264 | ], 265 | "authors": [ 266 | { 267 | "name": "Roman Borschel", 268 | "email": "roman@code-factory.org" 269 | }, 270 | { 271 | "name": "Benjamin Eberlei", 272 | "email": "kontakt@beberlei.de" 273 | }, 274 | { 275 | "name": "Guilherme Blanco", 276 | "email": "guilhermeblanco@gmail.com" 277 | }, 278 | { 279 | "name": "Jonathan Wage", 280 | "email": "jonwage@gmail.com" 281 | }, 282 | { 283 | "name": "Johannes Schmitt", 284 | "email": "schmittjoh@gmail.com" 285 | }, 286 | { 287 | "name": "Marco Pivetta", 288 | "email": "ocramius@gmail.com" 289 | } 290 | ], 291 | "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", 292 | "homepage": "https://www.doctrine-project.org/projects/common.html", 293 | "keywords": [ 294 | "common", 295 | "doctrine", 296 | "php" 297 | ], 298 | "time": "2018-11-21T01:24:55+00:00" 299 | }, 300 | { 301 | "name": "doctrine/event-manager", 302 | "version": "v1.0.0", 303 | "source": { 304 | "type": "git", 305 | "url": "https://github.com/doctrine/event-manager.git", 306 | "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3" 307 | }, 308 | "dist": { 309 | "type": "zip", 310 | "url": "https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3", 311 | "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3", 312 | "shasum": "" 313 | }, 314 | "require": { 315 | "php": "^7.1" 316 | }, 317 | "conflict": { 318 | "doctrine/common": "<2.9@dev" 319 | }, 320 | "require-dev": { 321 | "doctrine/coding-standard": "^4.0", 322 | "phpunit/phpunit": "^7.0" 323 | }, 324 | "type": "library", 325 | "extra": { 326 | "branch-alias": { 327 | "dev-master": "1.0.x-dev" 328 | } 329 | }, 330 | "autoload": { 331 | "psr-4": { 332 | "Doctrine\\Common\\": "lib/Doctrine/Common" 333 | } 334 | }, 335 | "notification-url": "https://packagist.org/downloads/", 336 | "license": [ 337 | "MIT" 338 | ], 339 | "authors": [ 340 | { 341 | "name": "Roman Borschel", 342 | "email": "roman@code-factory.org" 343 | }, 344 | { 345 | "name": "Benjamin Eberlei", 346 | "email": "kontakt@beberlei.de" 347 | }, 348 | { 349 | "name": "Guilherme Blanco", 350 | "email": "guilhermeblanco@gmail.com" 351 | }, 352 | { 353 | "name": "Jonathan Wage", 354 | "email": "jonwage@gmail.com" 355 | }, 356 | { 357 | "name": "Johannes Schmitt", 358 | "email": "schmittjoh@gmail.com" 359 | }, 360 | { 361 | "name": "Marco Pivetta", 362 | "email": "ocramius@gmail.com" 363 | } 364 | ], 365 | "description": "Doctrine Event Manager component", 366 | "homepage": "https://www.doctrine-project.org/projects/event-manager.html", 367 | "keywords": [ 368 | "event", 369 | "eventdispatcher", 370 | "eventmanager" 371 | ], 372 | "time": "2018-06-11T11:59:03+00:00" 373 | }, 374 | { 375 | "name": "doctrine/inflector", 376 | "version": "v1.3.0", 377 | "source": { 378 | "type": "git", 379 | "url": "https://github.com/doctrine/inflector.git", 380 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a" 381 | }, 382 | "dist": { 383 | "type": "zip", 384 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", 385 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a", 386 | "shasum": "" 387 | }, 388 | "require": { 389 | "php": "^7.1" 390 | }, 391 | "require-dev": { 392 | "phpunit/phpunit": "^6.2" 393 | }, 394 | "type": "library", 395 | "extra": { 396 | "branch-alias": { 397 | "dev-master": "1.3.x-dev" 398 | } 399 | }, 400 | "autoload": { 401 | "psr-4": { 402 | "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" 403 | } 404 | }, 405 | "notification-url": "https://packagist.org/downloads/", 406 | "license": [ 407 | "MIT" 408 | ], 409 | "authors": [ 410 | { 411 | "name": "Roman Borschel", 412 | "email": "roman@code-factory.org" 413 | }, 414 | { 415 | "name": "Benjamin Eberlei", 416 | "email": "kontakt@beberlei.de" 417 | }, 418 | { 419 | "name": "Guilherme Blanco", 420 | "email": "guilhermeblanco@gmail.com" 421 | }, 422 | { 423 | "name": "Jonathan Wage", 424 | "email": "jonwage@gmail.com" 425 | }, 426 | { 427 | "name": "Johannes Schmitt", 428 | "email": "schmittjoh@gmail.com" 429 | } 430 | ], 431 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 432 | "homepage": "http://www.doctrine-project.org", 433 | "keywords": [ 434 | "inflection", 435 | "pluralize", 436 | "singularize", 437 | "string" 438 | ], 439 | "time": "2018-01-09T20:05:19+00:00" 440 | }, 441 | { 442 | "name": "doctrine/lexer", 443 | "version": "v1.0.1", 444 | "source": { 445 | "type": "git", 446 | "url": "https://github.com/doctrine/lexer.git", 447 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" 448 | }, 449 | "dist": { 450 | "type": "zip", 451 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", 452 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", 453 | "shasum": "" 454 | }, 455 | "require": { 456 | "php": ">=5.3.2" 457 | }, 458 | "type": "library", 459 | "extra": { 460 | "branch-alias": { 461 | "dev-master": "1.0.x-dev" 462 | } 463 | }, 464 | "autoload": { 465 | "psr-0": { 466 | "Doctrine\\Common\\Lexer\\": "lib/" 467 | } 468 | }, 469 | "notification-url": "https://packagist.org/downloads/", 470 | "license": [ 471 | "MIT" 472 | ], 473 | "authors": [ 474 | { 475 | "name": "Roman Borschel", 476 | "email": "roman@code-factory.org" 477 | }, 478 | { 479 | "name": "Guilherme Blanco", 480 | "email": "guilhermeblanco@gmail.com" 481 | }, 482 | { 483 | "name": "Johannes Schmitt", 484 | "email": "schmittjoh@gmail.com" 485 | } 486 | ], 487 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", 488 | "homepage": "http://www.doctrine-project.org", 489 | "keywords": [ 490 | "lexer", 491 | "parser" 492 | ], 493 | "time": "2014-09-09T13:34:57+00:00" 494 | }, 495 | { 496 | "name": "doctrine/persistence", 497 | "version": "v1.1.0", 498 | "source": { 499 | "type": "git", 500 | "url": "https://github.com/doctrine/persistence.git", 501 | "reference": "c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38" 502 | }, 503 | "dist": { 504 | "type": "zip", 505 | "url": "https://api.github.com/repos/doctrine/persistence/zipball/c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38", 506 | "reference": "c0f1c17602afc18b4cbd8e1c8125f264c9cf7d38", 507 | "shasum": "" 508 | }, 509 | "require": { 510 | "doctrine/annotations": "^1.0", 511 | "doctrine/cache": "^1.0", 512 | "doctrine/collections": "^1.0", 513 | "doctrine/event-manager": "^1.0", 514 | "doctrine/reflection": "^1.0", 515 | "php": "^7.1" 516 | }, 517 | "conflict": { 518 | "doctrine/common": "<2.10@dev" 519 | }, 520 | "require-dev": { 521 | "doctrine/coding-standard": "^5.0", 522 | "phpstan/phpstan": "^0.8", 523 | "phpunit/phpunit": "^7.0" 524 | }, 525 | "type": "library", 526 | "extra": { 527 | "branch-alias": { 528 | "dev-master": "1.1.x-dev" 529 | } 530 | }, 531 | "autoload": { 532 | "psr-4": { 533 | "Doctrine\\Common\\": "lib/Doctrine/Common" 534 | } 535 | }, 536 | "notification-url": "https://packagist.org/downloads/", 537 | "license": [ 538 | "MIT" 539 | ], 540 | "authors": [ 541 | { 542 | "name": "Roman Borschel", 543 | "email": "roman@code-factory.org" 544 | }, 545 | { 546 | "name": "Benjamin Eberlei", 547 | "email": "kontakt@beberlei.de" 548 | }, 549 | { 550 | "name": "Guilherme Blanco", 551 | "email": "guilhermeblanco@gmail.com" 552 | }, 553 | { 554 | "name": "Jonathan Wage", 555 | "email": "jonwage@gmail.com" 556 | }, 557 | { 558 | "name": "Johannes Schmitt", 559 | "email": "schmittjoh@gmail.com" 560 | }, 561 | { 562 | "name": "Marco Pivetta", 563 | "email": "ocramius@gmail.com" 564 | } 565 | ], 566 | "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", 567 | "homepage": "https://doctrine-project.org/projects/persistence.html", 568 | "keywords": [ 569 | "mapper", 570 | "object", 571 | "odm", 572 | "orm", 573 | "persistence" 574 | ], 575 | "time": "2018-11-21T00:33:13+00:00" 576 | }, 577 | { 578 | "name": "doctrine/reflection", 579 | "version": "v1.0.0", 580 | "source": { 581 | "type": "git", 582 | "url": "https://github.com/doctrine/reflection.git", 583 | "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6" 584 | }, 585 | "dist": { 586 | "type": "zip", 587 | "url": "https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6", 588 | "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6", 589 | "shasum": "" 590 | }, 591 | "require": { 592 | "doctrine/annotations": "^1.0", 593 | "ext-tokenizer": "*", 594 | "php": "^7.1" 595 | }, 596 | "require-dev": { 597 | "doctrine/coding-standard": "^4.0", 598 | "doctrine/common": "^2.8", 599 | "phpstan/phpstan": "^0.9.2", 600 | "phpstan/phpstan-phpunit": "^0.9.4", 601 | "phpunit/phpunit": "^7.0", 602 | "squizlabs/php_codesniffer": "^3.0" 603 | }, 604 | "type": "library", 605 | "extra": { 606 | "branch-alias": { 607 | "dev-master": "1.0.x-dev" 608 | } 609 | }, 610 | "autoload": { 611 | "psr-4": { 612 | "Doctrine\\Common\\": "lib/Doctrine/Common" 613 | } 614 | }, 615 | "notification-url": "https://packagist.org/downloads/", 616 | "license": [ 617 | "MIT" 618 | ], 619 | "authors": [ 620 | { 621 | "name": "Roman Borschel", 622 | "email": "roman@code-factory.org" 623 | }, 624 | { 625 | "name": "Benjamin Eberlei", 626 | "email": "kontakt@beberlei.de" 627 | }, 628 | { 629 | "name": "Guilherme Blanco", 630 | "email": "guilhermeblanco@gmail.com" 631 | }, 632 | { 633 | "name": "Jonathan Wage", 634 | "email": "jonwage@gmail.com" 635 | }, 636 | { 637 | "name": "Johannes Schmitt", 638 | "email": "schmittjoh@gmail.com" 639 | }, 640 | { 641 | "name": "Marco Pivetta", 642 | "email": "ocramius@gmail.com" 643 | } 644 | ], 645 | "description": "Doctrine Reflection component", 646 | "homepage": "https://www.doctrine-project.org/projects/reflection.html", 647 | "keywords": [ 648 | "reflection" 649 | ], 650 | "time": "2018-06-14T14:45:07+00:00" 651 | }, 652 | { 653 | "name": "evenement/evenement", 654 | "version": "v3.0.1", 655 | "source": { 656 | "type": "git", 657 | "url": "https://github.com/igorw/evenement.git", 658 | "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" 659 | }, 660 | "dist": { 661 | "type": "zip", 662 | "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", 663 | "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", 664 | "shasum": "" 665 | }, 666 | "require": { 667 | "php": ">=7.0" 668 | }, 669 | "require-dev": { 670 | "phpunit/phpunit": "^6.0" 671 | }, 672 | "type": "library", 673 | "autoload": { 674 | "psr-0": { 675 | "Evenement": "src" 676 | } 677 | }, 678 | "notification-url": "https://packagist.org/downloads/", 679 | "license": [ 680 | "MIT" 681 | ], 682 | "authors": [ 683 | { 684 | "name": "Igor Wiedler", 685 | "email": "igor@wiedler.ch" 686 | } 687 | ], 688 | "description": "Événement is a very simple event dispatching library for PHP", 689 | "keywords": [ 690 | "event-dispatcher", 691 | "event-emitter" 692 | ], 693 | "time": "2017-07-23T21:35:13+00:00" 694 | }, 695 | { 696 | "name": "http-interop/http-factory-diactoros", 697 | "version": "1.0.0", 698 | "source": { 699 | "type": "git", 700 | "url": "https://github.com/http-interop/http-factory-diactoros.git", 701 | "reference": "7d19904a7e1047d316211e4453a30f5bdd504294" 702 | }, 703 | "dist": { 704 | "type": "zip", 705 | "url": "https://api.github.com/repos/http-interop/http-factory-diactoros/zipball/7d19904a7e1047d316211e4453a30f5bdd504294", 706 | "reference": "7d19904a7e1047d316211e4453a30f5bdd504294", 707 | "shasum": "" 708 | }, 709 | "require": { 710 | "psr/http-factory": "^1.0", 711 | "zendframework/zend-diactoros": "^1.3" 712 | }, 713 | "provide": { 714 | "psr/http-factory-implementation": "^1.0" 715 | }, 716 | "require-dev": { 717 | "http-interop/http-factory-tests": "^0.5", 718 | "phpunit/phpunit": "^6.5" 719 | }, 720 | "type": "library", 721 | "autoload": { 722 | "psr-4": { 723 | "Http\\Factory\\Diactoros\\": "src/" 724 | } 725 | }, 726 | "notification-url": "https://packagist.org/downloads/", 727 | "license": [ 728 | "MIT" 729 | ], 730 | "authors": [ 731 | { 732 | "name": "PHP-FIG", 733 | "homepage": "http://www.php-fig.org/" 734 | } 735 | ], 736 | "description": "An HTTP Factory using Zend Diactoros", 737 | "keywords": [ 738 | "factory", 739 | "http", 740 | "psr-17", 741 | "psr-7" 742 | ], 743 | "time": "2018-07-31T19:31:26+00:00" 744 | }, 745 | { 746 | "name": "http-interop/http-middleware", 747 | "version": "0.5.0", 748 | "source": { 749 | "type": "git", 750 | "url": "https://github.com/http-interop/http-middleware.git", 751 | "reference": "b49e1f9f6c584e704317b563302e566b8ce11858" 752 | }, 753 | "dist": { 754 | "type": "zip", 755 | "url": "https://api.github.com/repos/http-interop/http-middleware/zipball/b49e1f9f6c584e704317b563302e566b8ce11858", 756 | "reference": "b49e1f9f6c584e704317b563302e566b8ce11858", 757 | "shasum": "" 758 | }, 759 | "require": { 760 | "php": ">=5.3.0", 761 | "psr/http-message": "^1.0" 762 | }, 763 | "type": "library", 764 | "extra": { 765 | "branch-alias": { 766 | "dev-master": "1.0.x-dev" 767 | } 768 | }, 769 | "autoload": { 770 | "psr-4": { 771 | "Interop\\Http\\Server\\": "src/" 772 | } 773 | }, 774 | "notification-url": "https://packagist.org/downloads/", 775 | "license": [ 776 | "MIT" 777 | ], 778 | "authors": [ 779 | { 780 | "name": "PHP-FIG", 781 | "homepage": "http://www.php-fig.org/" 782 | } 783 | ], 784 | "description": "Common interface for HTTP server-side middleware", 785 | "keywords": [ 786 | "http", 787 | "middleware", 788 | "psr", 789 | "psr-15", 790 | "psr-7", 791 | "request", 792 | "response" 793 | ], 794 | "abandoned": "http-interop/http-server-middleware", 795 | "time": "2017-09-18T15:27:03+00:00" 796 | }, 797 | { 798 | "name": "monolog/monolog", 799 | "version": "1.24.0", 800 | "source": { 801 | "type": "git", 802 | "url": "https://github.com/Seldaek/monolog.git", 803 | "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266" 804 | }, 805 | "dist": { 806 | "type": "zip", 807 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266", 808 | "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266", 809 | "shasum": "" 810 | }, 811 | "require": { 812 | "php": ">=5.3.0", 813 | "psr/log": "~1.0" 814 | }, 815 | "provide": { 816 | "psr/log-implementation": "1.0.0" 817 | }, 818 | "require-dev": { 819 | "aws/aws-sdk-php": "^2.4.9 || ^3.0", 820 | "doctrine/couchdb": "~1.0@dev", 821 | "graylog2/gelf-php": "~1.0", 822 | "jakub-onderka/php-parallel-lint": "0.9", 823 | "php-amqplib/php-amqplib": "~2.4", 824 | "php-console/php-console": "^3.1.3", 825 | "phpunit/phpunit": "~4.5", 826 | "phpunit/phpunit-mock-objects": "2.3.0", 827 | "ruflin/elastica": ">=0.90 <3.0", 828 | "sentry/sentry": "^0.13", 829 | "swiftmailer/swiftmailer": "^5.3|^6.0" 830 | }, 831 | "suggest": { 832 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 833 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 834 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 835 | "ext-mongo": "Allow sending log messages to a MongoDB server", 836 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 837 | "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", 838 | "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", 839 | "php-console/php-console": "Allow sending log messages to Google Chrome", 840 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 841 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server", 842 | "sentry/sentry": "Allow sending log messages to a Sentry server" 843 | }, 844 | "type": "library", 845 | "extra": { 846 | "branch-alias": { 847 | "dev-master": "2.0.x-dev" 848 | } 849 | }, 850 | "autoload": { 851 | "psr-4": { 852 | "Monolog\\": "src/Monolog" 853 | } 854 | }, 855 | "notification-url": "https://packagist.org/downloads/", 856 | "license": [ 857 | "MIT" 858 | ], 859 | "authors": [ 860 | { 861 | "name": "Jordi Boggiano", 862 | "email": "j.boggiano@seld.be", 863 | "homepage": "http://seld.be" 864 | } 865 | ], 866 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 867 | "homepage": "http://github.com/Seldaek/monolog", 868 | "keywords": [ 869 | "log", 870 | "logging", 871 | "psr-3" 872 | ], 873 | "time": "2018-11-05T09:00:11+00:00" 874 | }, 875 | { 876 | "name": "php-pm/httpkernel-adapter", 877 | "version": "1.0.5", 878 | "source": { 879 | "type": "git", 880 | "url": "https://github.com/php-pm/php-pm-httpkernel.git", 881 | "reference": "be94a1aa5507d9b8159bb9af8d5da06d7ce72a6d" 882 | }, 883 | "dist": { 884 | "type": "zip", 885 | "url": "https://api.github.com/repos/php-pm/php-pm-httpkernel/zipball/be94a1aa5507d9b8159bb9af8d5da06d7ce72a6d", 886 | "reference": "be94a1aa5507d9b8159bb9af8d5da06d7ce72a6d", 887 | "shasum": "" 888 | }, 889 | "require": { 890 | "php-pm/php-pm": "^1.0", 891 | "ringcentral/psr7": "^1.2", 892 | "symfony/http-foundation": "^2.6|^3.0|^4", 893 | "symfony/http-kernel": "^2.6|^3.0|^4" 894 | }, 895 | "require-dev": { 896 | "phpunit/phpunit": "^5.7" 897 | }, 898 | "type": "library", 899 | "autoload": { 900 | "psr-4": { 901 | "PHPPM\\": "" 902 | } 903 | }, 904 | "notification-url": "https://packagist.org/downloads/", 905 | "license": [ 906 | "MIT" 907 | ], 908 | "time": "2018-09-16T11:15:39+00:00" 909 | }, 910 | { 911 | "name": "php-pm/php-pm", 912 | "version": "dev-master", 913 | "source": { 914 | "type": "git", 915 | "url": "https://github.com/php-pm/php-pm.git", 916 | "reference": "8e06951404da298729c80d655d939074309e9691" 917 | }, 918 | "dist": { 919 | "type": "zip", 920 | "url": "https://api.github.com/repos/php-pm/php-pm/zipball/8e06951404da298729c80d655d939074309e9691", 921 | "reference": "8e06951404da298729c80d655d939074309e9691", 922 | "shasum": "" 923 | }, 924 | "require": { 925 | "http-interop/http-middleware": "^0.5", 926 | "monolog/monolog": "^1.3", 927 | "paragonie/random_compat": ">=2.0", 928 | "php": ">=5.6.0", 929 | "react/child-process": "^0.5", 930 | "react/event-loop": "^1.0", 931 | "react/http": "^0.8", 932 | "react/socket": "^1.0", 933 | "react/stream": "^1.0", 934 | "ringcentral/psr7": "^1.2", 935 | "symfony/console": "^2.6|^3.0|^4.0", 936 | "symfony/debug": "^2.6|^3.0|^4.0", 937 | "symfony/process": "^2.6|^3.0|^4.0" 938 | }, 939 | "require-dev": { 940 | "mockery/mockery": "^1.0", 941 | "phpunit/phpunit": "^5.7" 942 | }, 943 | "suggest": { 944 | "php-pm/httpkernel-adapter": "HttpKernel adapter for Symfony and Laravel frameworks" 945 | }, 946 | "bin": [ 947 | "bin/ppm" 948 | ], 949 | "type": "library", 950 | "autoload": { 951 | "psr-4": { 952 | "PHPPM\\": "src" 953 | }, 954 | "files": [ 955 | "src/functions.php" 956 | ] 957 | }, 958 | "notification-url": "https://packagist.org/downloads/", 959 | "license": [ 960 | "MIT" 961 | ], 962 | "description": "PHP-PM is a process manager, supercharger and load balancer for PHP applications.", 963 | "time": "2018-12-26T22:50:54+00:00" 964 | }, 965 | { 966 | "name": "psr/cache", 967 | "version": "1.0.1", 968 | "source": { 969 | "type": "git", 970 | "url": "https://github.com/php-fig/cache.git", 971 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" 972 | }, 973 | "dist": { 974 | "type": "zip", 975 | "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", 976 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", 977 | "shasum": "" 978 | }, 979 | "require": { 980 | "php": ">=5.3.0" 981 | }, 982 | "type": "library", 983 | "extra": { 984 | "branch-alias": { 985 | "dev-master": "1.0.x-dev" 986 | } 987 | }, 988 | "autoload": { 989 | "psr-4": { 990 | "Psr\\Cache\\": "src/" 991 | } 992 | }, 993 | "notification-url": "https://packagist.org/downloads/", 994 | "license": [ 995 | "MIT" 996 | ], 997 | "authors": [ 998 | { 999 | "name": "PHP-FIG", 1000 | "homepage": "http://www.php-fig.org/" 1001 | } 1002 | ], 1003 | "description": "Common interface for caching libraries", 1004 | "keywords": [ 1005 | "cache", 1006 | "psr", 1007 | "psr-6" 1008 | ], 1009 | "time": "2016-08-06T20:24:11+00:00" 1010 | }, 1011 | { 1012 | "name": "psr/container", 1013 | "version": "1.0.0", 1014 | "source": { 1015 | "type": "git", 1016 | "url": "https://github.com/php-fig/container.git", 1017 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 1018 | }, 1019 | "dist": { 1020 | "type": "zip", 1021 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1022 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1023 | "shasum": "" 1024 | }, 1025 | "require": { 1026 | "php": ">=5.3.0" 1027 | }, 1028 | "type": "library", 1029 | "extra": { 1030 | "branch-alias": { 1031 | "dev-master": "1.0.x-dev" 1032 | } 1033 | }, 1034 | "autoload": { 1035 | "psr-4": { 1036 | "Psr\\Container\\": "src/" 1037 | } 1038 | }, 1039 | "notification-url": "https://packagist.org/downloads/", 1040 | "license": [ 1041 | "MIT" 1042 | ], 1043 | "authors": [ 1044 | { 1045 | "name": "PHP-FIG", 1046 | "homepage": "http://www.php-fig.org/" 1047 | } 1048 | ], 1049 | "description": "Common Container Interface (PHP FIG PSR-11)", 1050 | "homepage": "https://github.com/php-fig/container", 1051 | "keywords": [ 1052 | "PSR-11", 1053 | "container", 1054 | "container-interface", 1055 | "container-interop", 1056 | "psr" 1057 | ], 1058 | "time": "2017-02-14T16:28:37+00:00" 1059 | }, 1060 | { 1061 | "name": "psr/http-factory", 1062 | "version": "1.0.0", 1063 | "source": { 1064 | "type": "git", 1065 | "url": "https://github.com/php-fig/http-factory.git", 1066 | "reference": "378bfe27931ecc54ff824a20d6f6bfc303bbd04c" 1067 | }, 1068 | "dist": { 1069 | "type": "zip", 1070 | "url": "https://api.github.com/repos/php-fig/http-factory/zipball/378bfe27931ecc54ff824a20d6f6bfc303bbd04c", 1071 | "reference": "378bfe27931ecc54ff824a20d6f6bfc303bbd04c", 1072 | "shasum": "" 1073 | }, 1074 | "require": { 1075 | "php": ">=7.0.0", 1076 | "psr/http-message": "^1.0" 1077 | }, 1078 | "type": "library", 1079 | "extra": { 1080 | "branch-alias": { 1081 | "dev-master": "1.0.x-dev" 1082 | } 1083 | }, 1084 | "autoload": { 1085 | "psr-4": { 1086 | "Psr\\Http\\Message\\": "src/" 1087 | } 1088 | }, 1089 | "notification-url": "https://packagist.org/downloads/", 1090 | "license": [ 1091 | "MIT" 1092 | ], 1093 | "authors": [ 1094 | { 1095 | "name": "PHP-FIG", 1096 | "homepage": "http://www.php-fig.org/" 1097 | } 1098 | ], 1099 | "description": "Common interfaces for PSR-7 HTTP message factories", 1100 | "keywords": [ 1101 | "factory", 1102 | "http", 1103 | "message", 1104 | "psr", 1105 | "psr-17", 1106 | "psr-7", 1107 | "request", 1108 | "response" 1109 | ], 1110 | "time": "2018-07-30T21:54:04+00:00" 1111 | }, 1112 | { 1113 | "name": "psr/http-message", 1114 | "version": "1.0.1", 1115 | "source": { 1116 | "type": "git", 1117 | "url": "https://github.com/php-fig/http-message.git", 1118 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 1119 | }, 1120 | "dist": { 1121 | "type": "zip", 1122 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 1123 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 1124 | "shasum": "" 1125 | }, 1126 | "require": { 1127 | "php": ">=5.3.0" 1128 | }, 1129 | "type": "library", 1130 | "extra": { 1131 | "branch-alias": { 1132 | "dev-master": "1.0.x-dev" 1133 | } 1134 | }, 1135 | "autoload": { 1136 | "psr-4": { 1137 | "Psr\\Http\\Message\\": "src/" 1138 | } 1139 | }, 1140 | "notification-url": "https://packagist.org/downloads/", 1141 | "license": [ 1142 | "MIT" 1143 | ], 1144 | "authors": [ 1145 | { 1146 | "name": "PHP-FIG", 1147 | "homepage": "http://www.php-fig.org/" 1148 | } 1149 | ], 1150 | "description": "Common interface for HTTP messages", 1151 | "homepage": "https://github.com/php-fig/http-message", 1152 | "keywords": [ 1153 | "http", 1154 | "http-message", 1155 | "psr", 1156 | "psr-7", 1157 | "request", 1158 | "response" 1159 | ], 1160 | "time": "2016-08-06T14:39:51+00:00" 1161 | }, 1162 | { 1163 | "name": "psr/log", 1164 | "version": "1.1.0", 1165 | "source": { 1166 | "type": "git", 1167 | "url": "https://github.com/php-fig/log.git", 1168 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" 1169 | }, 1170 | "dist": { 1171 | "type": "zip", 1172 | "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", 1173 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", 1174 | "shasum": "" 1175 | }, 1176 | "require": { 1177 | "php": ">=5.3.0" 1178 | }, 1179 | "type": "library", 1180 | "extra": { 1181 | "branch-alias": { 1182 | "dev-master": "1.0.x-dev" 1183 | } 1184 | }, 1185 | "autoload": { 1186 | "psr-4": { 1187 | "Psr\\Log\\": "Psr/Log/" 1188 | } 1189 | }, 1190 | "notification-url": "https://packagist.org/downloads/", 1191 | "license": [ 1192 | "MIT" 1193 | ], 1194 | "authors": [ 1195 | { 1196 | "name": "PHP-FIG", 1197 | "homepage": "http://www.php-fig.org/" 1198 | } 1199 | ], 1200 | "description": "Common interface for logging libraries", 1201 | "homepage": "https://github.com/php-fig/log", 1202 | "keywords": [ 1203 | "log", 1204 | "psr", 1205 | "psr-3" 1206 | ], 1207 | "time": "2018-11-20T15:27:04+00:00" 1208 | }, 1209 | { 1210 | "name": "psr/simple-cache", 1211 | "version": "1.0.1", 1212 | "source": { 1213 | "type": "git", 1214 | "url": "https://github.com/php-fig/simple-cache.git", 1215 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" 1216 | }, 1217 | "dist": { 1218 | "type": "zip", 1219 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1220 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1221 | "shasum": "" 1222 | }, 1223 | "require": { 1224 | "php": ">=5.3.0" 1225 | }, 1226 | "type": "library", 1227 | "extra": { 1228 | "branch-alias": { 1229 | "dev-master": "1.0.x-dev" 1230 | } 1231 | }, 1232 | "autoload": { 1233 | "psr-4": { 1234 | "Psr\\SimpleCache\\": "src/" 1235 | } 1236 | }, 1237 | "notification-url": "https://packagist.org/downloads/", 1238 | "license": [ 1239 | "MIT" 1240 | ], 1241 | "authors": [ 1242 | { 1243 | "name": "PHP-FIG", 1244 | "homepage": "http://www.php-fig.org/" 1245 | } 1246 | ], 1247 | "description": "Common interfaces for simple caching", 1248 | "keywords": [ 1249 | "cache", 1250 | "caching", 1251 | "psr", 1252 | "psr-16", 1253 | "simple-cache" 1254 | ], 1255 | "time": "2017-10-23T01:57:42+00:00" 1256 | }, 1257 | { 1258 | "name": "react/cache", 1259 | "version": "v0.5.0", 1260 | "source": { 1261 | "type": "git", 1262 | "url": "https://github.com/reactphp/cache.git", 1263 | "reference": "7d7da7fb7574d471904ba357b39bbf110ccdbf66" 1264 | }, 1265 | "dist": { 1266 | "type": "zip", 1267 | "url": "https://api.github.com/repos/reactphp/cache/zipball/7d7da7fb7574d471904ba357b39bbf110ccdbf66", 1268 | "reference": "7d7da7fb7574d471904ba357b39bbf110ccdbf66", 1269 | "shasum": "" 1270 | }, 1271 | "require": { 1272 | "php": ">=5.3.0", 1273 | "react/promise": "~2.0|~1.1" 1274 | }, 1275 | "require-dev": { 1276 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" 1277 | }, 1278 | "type": "library", 1279 | "autoload": { 1280 | "psr-4": { 1281 | "React\\Cache\\": "src/" 1282 | } 1283 | }, 1284 | "notification-url": "https://packagist.org/downloads/", 1285 | "license": [ 1286 | "MIT" 1287 | ], 1288 | "description": "Async, Promise-based cache interface for ReactPHP", 1289 | "keywords": [ 1290 | "cache", 1291 | "caching", 1292 | "promise", 1293 | "reactphp" 1294 | ], 1295 | "time": "2018-06-25T12:52:40+00:00" 1296 | }, 1297 | { 1298 | "name": "react/child-process", 1299 | "version": "v0.5.2", 1300 | "source": { 1301 | "type": "git", 1302 | "url": "https://github.com/reactphp/child-process.git", 1303 | "reference": "aae49d7f1340bafb695b9af3ce4421ea41a39620" 1304 | }, 1305 | "dist": { 1306 | "type": "zip", 1307 | "url": "https://api.github.com/repos/reactphp/child-process/zipball/aae49d7f1340bafb695b9af3ce4421ea41a39620", 1308 | "reference": "aae49d7f1340bafb695b9af3ce4421ea41a39620", 1309 | "shasum": "" 1310 | }, 1311 | "require": { 1312 | "evenement/evenement": "^3.0 || ^2.0 || ^1.0", 1313 | "php": ">=5.3.0", 1314 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", 1315 | "react/stream": "^1.0 || ^0.7.6" 1316 | }, 1317 | "require-dev": { 1318 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35", 1319 | "sebastian/environment": "^3.0 || ^2.0 || ^1.0" 1320 | }, 1321 | "type": "library", 1322 | "autoload": { 1323 | "psr-4": { 1324 | "React\\ChildProcess\\": "src" 1325 | } 1326 | }, 1327 | "notification-url": "https://packagist.org/downloads/", 1328 | "license": [ 1329 | "MIT" 1330 | ], 1331 | "description": "Event-driven library for executing child processes with ReactPHP.", 1332 | "keywords": [ 1333 | "event-driven", 1334 | "process", 1335 | "reactphp" 1336 | ], 1337 | "time": "2018-01-18T14:53:06+00:00" 1338 | }, 1339 | { 1340 | "name": "react/dns", 1341 | "version": "v0.4.16", 1342 | "source": { 1343 | "type": "git", 1344 | "url": "https://github.com/reactphp/dns.git", 1345 | "reference": "0a0bedfec72b38406413c6ea01e1c015bd0bf72b" 1346 | }, 1347 | "dist": { 1348 | "type": "zip", 1349 | "url": "https://api.github.com/repos/reactphp/dns/zipball/0a0bedfec72b38406413c6ea01e1c015bd0bf72b", 1350 | "reference": "0a0bedfec72b38406413c6ea01e1c015bd0bf72b", 1351 | "shasum": "" 1352 | }, 1353 | "require": { 1354 | "php": ">=5.3.0", 1355 | "react/cache": "^0.5 || ^0.4 || ^0.3", 1356 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", 1357 | "react/promise": "^2.1 || ^1.2.1", 1358 | "react/promise-timer": "^1.2", 1359 | "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.5" 1360 | }, 1361 | "require-dev": { 1362 | "clue/block-react": "^1.2", 1363 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" 1364 | }, 1365 | "type": "library", 1366 | "autoload": { 1367 | "psr-4": { 1368 | "React\\Dns\\": "src" 1369 | } 1370 | }, 1371 | "notification-url": "https://packagist.org/downloads/", 1372 | "license": [ 1373 | "MIT" 1374 | ], 1375 | "description": "Async DNS resolver for ReactPHP", 1376 | "keywords": [ 1377 | "async", 1378 | "dns", 1379 | "dns-resolver", 1380 | "reactphp" 1381 | ], 1382 | "time": "2018-11-11T11:21:13+00:00" 1383 | }, 1384 | { 1385 | "name": "react/event-loop", 1386 | "version": "v1.0.0", 1387 | "source": { 1388 | "type": "git", 1389 | "url": "https://github.com/reactphp/event-loop.git", 1390 | "reference": "0266aff7aa7b0613b1f38a723e14a0ebc55cfca3" 1391 | }, 1392 | "dist": { 1393 | "type": "zip", 1394 | "url": "https://api.github.com/repos/reactphp/event-loop/zipball/0266aff7aa7b0613b1f38a723e14a0ebc55cfca3", 1395 | "reference": "0266aff7aa7b0613b1f38a723e14a0ebc55cfca3", 1396 | "shasum": "" 1397 | }, 1398 | "require": { 1399 | "php": ">=5.3.0" 1400 | }, 1401 | "require-dev": { 1402 | "phpunit/phpunit": "~4.8.35 || ^5.7 || ^6.4" 1403 | }, 1404 | "suggest": { 1405 | "ext-event": "~1.0 for ExtEventLoop", 1406 | "ext-pcntl": "For signal handling support when using the StreamSelectLoop" 1407 | }, 1408 | "type": "library", 1409 | "autoload": { 1410 | "psr-4": { 1411 | "React\\EventLoop\\": "src" 1412 | } 1413 | }, 1414 | "notification-url": "https://packagist.org/downloads/", 1415 | "license": [ 1416 | "MIT" 1417 | ], 1418 | "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", 1419 | "keywords": [ 1420 | "asynchronous", 1421 | "event-loop" 1422 | ], 1423 | "time": "2018-07-11T14:37:46+00:00" 1424 | }, 1425 | { 1426 | "name": "react/http", 1427 | "version": "v0.8.3", 1428 | "source": { 1429 | "type": "git", 1430 | "url": "https://github.com/reactphp/http.git", 1431 | "reference": "f8bcdab2dc0ecd94f35ff9657a263028b96f0c46" 1432 | }, 1433 | "dist": { 1434 | "type": "zip", 1435 | "url": "https://api.github.com/repos/reactphp/http/zipball/f8bcdab2dc0ecd94f35ff9657a263028b96f0c46", 1436 | "reference": "f8bcdab2dc0ecd94f35ff9657a263028b96f0c46", 1437 | "shasum": "" 1438 | }, 1439 | "require": { 1440 | "evenement/evenement": "^3.0 || ^2.0 || ^1.0", 1441 | "php": ">=5.3.0", 1442 | "react/promise": "^2.3 || ^1.2.1", 1443 | "react/promise-stream": "^1.1", 1444 | "react/socket": "^1.0 || ^0.8.3", 1445 | "react/stream": "^1.0 || ^0.7.1", 1446 | "ringcentral/psr7": "^1.2" 1447 | }, 1448 | "require-dev": { 1449 | "clue/block-react": "^1.1", 1450 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" 1451 | }, 1452 | "type": "library", 1453 | "autoload": { 1454 | "psr-4": { 1455 | "React\\Http\\": "src" 1456 | } 1457 | }, 1458 | "notification-url": "https://packagist.org/downloads/", 1459 | "license": [ 1460 | "MIT" 1461 | ], 1462 | "description": "Event-driven, streaming plaintext HTTP and secure HTTPS server for ReactPHP", 1463 | "keywords": [ 1464 | "event-driven", 1465 | "http", 1466 | "https", 1467 | "reactphp", 1468 | "server", 1469 | "streaming" 1470 | ], 1471 | "time": "2018-04-11T15:03:27+00:00" 1472 | }, 1473 | { 1474 | "name": "react/promise", 1475 | "version": "v2.7.0", 1476 | "source": { 1477 | "type": "git", 1478 | "url": "https://github.com/reactphp/promise.git", 1479 | "reference": "f4edc2581617431aea50430749db55cc3fc031b3" 1480 | }, 1481 | "dist": { 1482 | "type": "zip", 1483 | "url": "https://api.github.com/repos/reactphp/promise/zipball/f4edc2581617431aea50430749db55cc3fc031b3", 1484 | "reference": "f4edc2581617431aea50430749db55cc3fc031b3", 1485 | "shasum": "" 1486 | }, 1487 | "require": { 1488 | "php": ">=5.4.0" 1489 | }, 1490 | "require-dev": { 1491 | "phpunit/phpunit": "~4.8" 1492 | }, 1493 | "type": "library", 1494 | "autoload": { 1495 | "psr-4": { 1496 | "React\\Promise\\": "src/" 1497 | }, 1498 | "files": [ 1499 | "src/functions_include.php" 1500 | ] 1501 | }, 1502 | "notification-url": "https://packagist.org/downloads/", 1503 | "license": [ 1504 | "MIT" 1505 | ], 1506 | "authors": [ 1507 | { 1508 | "name": "Jan Sorgalla", 1509 | "email": "jsorgalla@gmail.com" 1510 | } 1511 | ], 1512 | "description": "A lightweight implementation of CommonJS Promises/A for PHP", 1513 | "keywords": [ 1514 | "promise", 1515 | "promises" 1516 | ], 1517 | "time": "2018-06-13T15:59:06+00:00" 1518 | }, 1519 | { 1520 | "name": "react/promise-stream", 1521 | "version": "v1.1.1", 1522 | "source": { 1523 | "type": "git", 1524 | "url": "https://github.com/reactphp/promise-stream.git", 1525 | "reference": "00e269d611e9c9a29356aef64c07f7e513e73dc9" 1526 | }, 1527 | "dist": { 1528 | "type": "zip", 1529 | "url": "https://api.github.com/repos/reactphp/promise-stream/zipball/00e269d611e9c9a29356aef64c07f7e513e73dc9", 1530 | "reference": "00e269d611e9c9a29356aef64c07f7e513e73dc9", 1531 | "shasum": "" 1532 | }, 1533 | "require": { 1534 | "php": ">=5.3", 1535 | "react/promise": "^2.1 || ^1.2", 1536 | "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4 || ^0.3" 1537 | }, 1538 | "require-dev": { 1539 | "clue/block-react": "^1.0", 1540 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35", 1541 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3", 1542 | "react/promise-timer": "^1.0" 1543 | }, 1544 | "type": "library", 1545 | "autoload": { 1546 | "psr-4": { 1547 | "React\\Promise\\Stream\\": "src/" 1548 | }, 1549 | "files": [ 1550 | "src/functions_include.php" 1551 | ] 1552 | }, 1553 | "notification-url": "https://packagist.org/downloads/", 1554 | "license": [ 1555 | "MIT" 1556 | ], 1557 | "authors": [ 1558 | { 1559 | "name": "Christian Lück", 1560 | "email": "christian@lueck.tv" 1561 | } 1562 | ], 1563 | "description": "The missing link between Promise-land and Stream-land for ReactPHP", 1564 | "homepage": "https://github.com/reactphp/promise-stream", 1565 | "keywords": [ 1566 | "Buffer", 1567 | "async", 1568 | "promise", 1569 | "reactphp", 1570 | "stream", 1571 | "unwrap" 1572 | ], 1573 | "time": "2017-12-22T12:02:05+00:00" 1574 | }, 1575 | { 1576 | "name": "react/promise-timer", 1577 | "version": "v1.5.0", 1578 | "source": { 1579 | "type": "git", 1580 | "url": "https://github.com/reactphp/promise-timer.git", 1581 | "reference": "a11206938ca2394dc7bb368f5da25cd4533fa603" 1582 | }, 1583 | "dist": { 1584 | "type": "zip", 1585 | "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/a11206938ca2394dc7bb368f5da25cd4533fa603", 1586 | "reference": "a11206938ca2394dc7bb368f5da25cd4533fa603", 1587 | "shasum": "" 1588 | }, 1589 | "require": { 1590 | "php": ">=5.3", 1591 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", 1592 | "react/promise": "^2.7.0 || ^1.2.1" 1593 | }, 1594 | "require-dev": { 1595 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" 1596 | }, 1597 | "type": "library", 1598 | "autoload": { 1599 | "psr-4": { 1600 | "React\\Promise\\Timer\\": "src/" 1601 | }, 1602 | "files": [ 1603 | "src/functions.php" 1604 | ] 1605 | }, 1606 | "notification-url": "https://packagist.org/downloads/", 1607 | "license": [ 1608 | "MIT" 1609 | ], 1610 | "authors": [ 1611 | { 1612 | "name": "Christian Lück", 1613 | "email": "christian@lueck.tv" 1614 | } 1615 | ], 1616 | "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.", 1617 | "homepage": "https://github.com/reactphp/promise-timer", 1618 | "keywords": [ 1619 | "async", 1620 | "event-loop", 1621 | "promise", 1622 | "reactphp", 1623 | "timeout", 1624 | "timer" 1625 | ], 1626 | "time": "2018-06-13T16:45:37+00:00" 1627 | }, 1628 | { 1629 | "name": "react/socket", 1630 | "version": "v1.1.0", 1631 | "source": { 1632 | "type": "git", 1633 | "url": "https://github.com/reactphp/socket.git", 1634 | "reference": "34381d9282d12670eb56b45981aad82e033ed58f" 1635 | }, 1636 | "dist": { 1637 | "type": "zip", 1638 | "url": "https://api.github.com/repos/reactphp/socket/zipball/34381d9282d12670eb56b45981aad82e033ed58f", 1639 | "reference": "34381d9282d12670eb56b45981aad82e033ed58f", 1640 | "shasum": "" 1641 | }, 1642 | "require": { 1643 | "evenement/evenement": "^3.0 || ^2.0 || ^1.0", 1644 | "php": ">=5.3.0", 1645 | "react/dns": "^0.4.13", 1646 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", 1647 | "react/promise": "^2.6.0 || ^1.2.1", 1648 | "react/promise-timer": "^1.4.0", 1649 | "react/stream": "^1.0 || ^0.7.1" 1650 | }, 1651 | "require-dev": { 1652 | "clue/block-react": "^1.2", 1653 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" 1654 | }, 1655 | "type": "library", 1656 | "autoload": { 1657 | "psr-4": { 1658 | "React\\Socket\\": "src" 1659 | } 1660 | }, 1661 | "notification-url": "https://packagist.org/downloads/", 1662 | "license": [ 1663 | "MIT" 1664 | ], 1665 | "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", 1666 | "keywords": [ 1667 | "Connection", 1668 | "Socket", 1669 | "async", 1670 | "reactphp", 1671 | "stream" 1672 | ], 1673 | "time": "2018-10-01T12:20:53+00:00" 1674 | }, 1675 | { 1676 | "name": "react/stream", 1677 | "version": "v1.0.0", 1678 | "source": { 1679 | "type": "git", 1680 | "url": "https://github.com/reactphp/stream.git", 1681 | "reference": "fdd0140f42805d65bf9687636503db0b326d2244" 1682 | }, 1683 | "dist": { 1684 | "type": "zip", 1685 | "url": "https://api.github.com/repos/reactphp/stream/zipball/fdd0140f42805d65bf9687636503db0b326d2244", 1686 | "reference": "fdd0140f42805d65bf9687636503db0b326d2244", 1687 | "shasum": "" 1688 | }, 1689 | "require": { 1690 | "evenement/evenement": "^3.0 || ^2.0 || ^1.0", 1691 | "php": ">=5.3.8", 1692 | "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5" 1693 | }, 1694 | "require-dev": { 1695 | "clue/stream-filter": "~1.2", 1696 | "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35" 1697 | }, 1698 | "type": "library", 1699 | "autoload": { 1700 | "psr-4": { 1701 | "React\\Stream\\": "src" 1702 | } 1703 | }, 1704 | "notification-url": "https://packagist.org/downloads/", 1705 | "license": [ 1706 | "MIT" 1707 | ], 1708 | "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", 1709 | "keywords": [ 1710 | "event-driven", 1711 | "io", 1712 | "non-blocking", 1713 | "pipe", 1714 | "reactphp", 1715 | "readable", 1716 | "stream", 1717 | "writable" 1718 | ], 1719 | "time": "2018-07-11T14:38:16+00:00" 1720 | }, 1721 | { 1722 | "name": "ringcentral/psr7", 1723 | "version": "1.2.2", 1724 | "source": { 1725 | "type": "git", 1726 | "url": "https://github.com/ringcentral/psr7.git", 1727 | "reference": "dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c" 1728 | }, 1729 | "dist": { 1730 | "type": "zip", 1731 | "url": "https://api.github.com/repos/ringcentral/psr7/zipball/dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c", 1732 | "reference": "dcd84bbb49b96c616d1dcc8bfb9bef3f2cd53d1c", 1733 | "shasum": "" 1734 | }, 1735 | "require": { 1736 | "php": ">=5.3", 1737 | "psr/http-message": "~1.0" 1738 | }, 1739 | "provide": { 1740 | "psr/http-message-implementation": "1.0" 1741 | }, 1742 | "require-dev": { 1743 | "phpunit/phpunit": "~4.0" 1744 | }, 1745 | "type": "library", 1746 | "extra": { 1747 | "branch-alias": { 1748 | "dev-master": "1.0-dev" 1749 | } 1750 | }, 1751 | "autoload": { 1752 | "psr-4": { 1753 | "RingCentral\\Psr7\\": "src/" 1754 | }, 1755 | "files": [ 1756 | "src/functions_include.php" 1757 | ] 1758 | }, 1759 | "notification-url": "https://packagist.org/downloads/", 1760 | "license": [ 1761 | "MIT" 1762 | ], 1763 | "authors": [ 1764 | { 1765 | "name": "Michael Dowling", 1766 | "email": "mtdowling@gmail.com", 1767 | "homepage": "https://github.com/mtdowling" 1768 | } 1769 | ], 1770 | "description": "PSR-7 message implementation", 1771 | "keywords": [ 1772 | "http", 1773 | "message", 1774 | "stream", 1775 | "uri" 1776 | ], 1777 | "time": "2018-01-15T21:00:49+00:00" 1778 | }, 1779 | { 1780 | "name": "sensio/framework-extra-bundle", 1781 | "version": "v5.2.4", 1782 | "source": { 1783 | "type": "git", 1784 | "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", 1785 | "reference": "1fdf591c4b388e62dbb2579de89c1560b33f865d" 1786 | }, 1787 | "dist": { 1788 | "type": "zip", 1789 | "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/1fdf591c4b388e62dbb2579de89c1560b33f865d", 1790 | "reference": "1fdf591c4b388e62dbb2579de89c1560b33f865d", 1791 | "shasum": "" 1792 | }, 1793 | "require": { 1794 | "doctrine/common": "^2.2", 1795 | "symfony/config": "^3.3|^4.0", 1796 | "symfony/dependency-injection": "^3.3|^4.0", 1797 | "symfony/framework-bundle": "^3.4|^4.0", 1798 | "symfony/http-kernel": "^3.3|^4.0" 1799 | }, 1800 | "require-dev": { 1801 | "doctrine/doctrine-bundle": "^1.6", 1802 | "doctrine/orm": "^2.5", 1803 | "symfony/browser-kit": "^3.3|^4.0", 1804 | "symfony/dom-crawler": "^3.3|^4.0", 1805 | "symfony/expression-language": "^3.3|^4.0", 1806 | "symfony/finder": "^3.3|^4.0", 1807 | "symfony/monolog-bridge": "^3.0|^4.0", 1808 | "symfony/monolog-bundle": "^3.2", 1809 | "symfony/phpunit-bridge": "^3.4.19|^4.1.8", 1810 | "symfony/psr-http-message-bridge": "^0.3", 1811 | "symfony/security-bundle": "^3.3|^4.0", 1812 | "symfony/twig-bundle": "^3.3|^4.0", 1813 | "symfony/yaml": "^3.3|^4.0", 1814 | "twig/twig": "~1.12|~2.0", 1815 | "zendframework/zend-diactoros": "^1.3" 1816 | }, 1817 | "suggest": { 1818 | "symfony/expression-language": "", 1819 | "symfony/psr-http-message-bridge": "To use the PSR-7 converters", 1820 | "symfony/security-bundle": "" 1821 | }, 1822 | "type": "symfony-bundle", 1823 | "extra": { 1824 | "branch-alias": { 1825 | "dev-master": "5.2.x-dev" 1826 | } 1827 | }, 1828 | "autoload": { 1829 | "psr-4": { 1830 | "Sensio\\Bundle\\FrameworkExtraBundle\\": "" 1831 | } 1832 | }, 1833 | "notification-url": "https://packagist.org/downloads/", 1834 | "license": [ 1835 | "MIT" 1836 | ], 1837 | "authors": [ 1838 | { 1839 | "name": "Fabien Potencier", 1840 | "email": "fabien@symfony.com" 1841 | } 1842 | ], 1843 | "description": "This bundle provides a way to configure your controllers with annotations", 1844 | "keywords": [ 1845 | "annotations", 1846 | "controllers" 1847 | ], 1848 | "time": "2018-12-11T16:59:23+00:00" 1849 | }, 1850 | { 1851 | "name": "spiral/goridge", 1852 | "version": "v2.1.3", 1853 | "source": { 1854 | "type": "git", 1855 | "url": "https://github.com/spiral/goridge.git", 1856 | "reference": "1d9d4cc79ddfc73a0e92d9c77ebdf54abcade694" 1857 | }, 1858 | "dist": { 1859 | "type": "zip", 1860 | "url": "https://api.github.com/repos/spiral/goridge/zipball/1d9d4cc79ddfc73a0e92d9c77ebdf54abcade694", 1861 | "reference": "1d9d4cc79ddfc73a0e92d9c77ebdf54abcade694", 1862 | "shasum": "" 1863 | }, 1864 | "require": { 1865 | "php": ">=7.0" 1866 | }, 1867 | "require-dev": { 1868 | "phpunit/phpunit": "~6.0" 1869 | }, 1870 | "type": "goridge", 1871 | "autoload": { 1872 | "psr-4": { 1873 | "Spiral\\Goridge\\": "php-src/" 1874 | } 1875 | }, 1876 | "notification-url": "https://packagist.org/downloads/", 1877 | "license": [ 1878 | "MIT" 1879 | ], 1880 | "authors": [ 1881 | { 1882 | "name": "Anton Titov / Wolfy-J", 1883 | "email": "wolfy.jd@gmail.com" 1884 | } 1885 | ], 1886 | "description": "High-performance PHP-to-Golang RPC bridge", 1887 | "time": "2018-12-20T12:06:05+00:00" 1888 | }, 1889 | { 1890 | "name": "spiral/roadrunner", 1891 | "version": "v1.2.8", 1892 | "source": { 1893 | "type": "git", 1894 | "url": "https://github.com/spiral/roadrunner.git", 1895 | "reference": "4258f54f5b1ef25a692644d2bd58256092b7c23f" 1896 | }, 1897 | "dist": { 1898 | "type": "zip", 1899 | "url": "https://api.github.com/repos/spiral/roadrunner/zipball/4258f54f5b1ef25a692644d2bd58256092b7c23f", 1900 | "reference": "4258f54f5b1ef25a692644d2bd58256092b7c23f", 1901 | "shasum": "" 1902 | }, 1903 | "require": { 1904 | "http-interop/http-factory-diactoros": "^1.0", 1905 | "php": "^7.0", 1906 | "psr/http-factory": "^1.0", 1907 | "psr/http-message": "^1.0", 1908 | "spiral/goridge": "^2.0" 1909 | }, 1910 | "type": "server", 1911 | "autoload": { 1912 | "psr-4": { 1913 | "Spiral\\RoadRunner\\": "src/" 1914 | } 1915 | }, 1916 | "notification-url": "https://packagist.org/downloads/", 1917 | "license": [ 1918 | "MIT" 1919 | ], 1920 | "authors": [ 1921 | { 1922 | "name": "Anton Titov / Wolfy-J", 1923 | "email": "wolfy.jd@gmail.com" 1924 | } 1925 | ], 1926 | "description": "High-performance PHP load balancer and process manager library for Golang", 1927 | "time": "2018-12-26T12:11:55+00:00" 1928 | }, 1929 | { 1930 | "name": "symfony/cache", 1931 | "version": "v4.1.9", 1932 | "source": { 1933 | "type": "git", 1934 | "url": "https://github.com/symfony/cache.git", 1935 | "reference": "b3987f2444933c17d3aa58f1b04b5b91ec0cf9ae" 1936 | }, 1937 | "dist": { 1938 | "type": "zip", 1939 | "url": "https://api.github.com/repos/symfony/cache/zipball/b3987f2444933c17d3aa58f1b04b5b91ec0cf9ae", 1940 | "reference": "b3987f2444933c17d3aa58f1b04b5b91ec0cf9ae", 1941 | "shasum": "" 1942 | }, 1943 | "require": { 1944 | "php": "^7.1.3", 1945 | "psr/cache": "~1.0", 1946 | "psr/log": "~1.0", 1947 | "psr/simple-cache": "^1.0" 1948 | }, 1949 | "conflict": { 1950 | "symfony/var-dumper": "<3.4" 1951 | }, 1952 | "provide": { 1953 | "psr/cache-implementation": "1.0", 1954 | "psr/simple-cache-implementation": "1.0" 1955 | }, 1956 | "require-dev": { 1957 | "cache/integration-tests": "dev-master", 1958 | "doctrine/cache": "~1.6", 1959 | "doctrine/dbal": "~2.4", 1960 | "predis/predis": "~1.0" 1961 | }, 1962 | "type": "library", 1963 | "extra": { 1964 | "branch-alias": { 1965 | "dev-master": "4.1-dev" 1966 | } 1967 | }, 1968 | "autoload": { 1969 | "psr-4": { 1970 | "Symfony\\Component\\Cache\\": "" 1971 | }, 1972 | "exclude-from-classmap": [ 1973 | "/Tests/" 1974 | ] 1975 | }, 1976 | "notification-url": "https://packagist.org/downloads/", 1977 | "license": [ 1978 | "MIT" 1979 | ], 1980 | "authors": [ 1981 | { 1982 | "name": "Nicolas Grekas", 1983 | "email": "p@tchwork.com" 1984 | }, 1985 | { 1986 | "name": "Symfony Community", 1987 | "homepage": "https://symfony.com/contributors" 1988 | } 1989 | ], 1990 | "description": "Symfony Cache component with PSR-6, PSR-16, and tags", 1991 | "homepage": "https://symfony.com", 1992 | "keywords": [ 1993 | "caching", 1994 | "psr6" 1995 | ], 1996 | "time": "2018-12-06T10:58:36+00:00" 1997 | }, 1998 | { 1999 | "name": "symfony/config", 2000 | "version": "v4.1.9", 2001 | "source": { 2002 | "type": "git", 2003 | "url": "https://github.com/symfony/config.git", 2004 | "reference": "7e415fa42def2c89be6cfbd8286c616e86664b81" 2005 | }, 2006 | "dist": { 2007 | "type": "zip", 2008 | "url": "https://api.github.com/repos/symfony/config/zipball/7e415fa42def2c89be6cfbd8286c616e86664b81", 2009 | "reference": "7e415fa42def2c89be6cfbd8286c616e86664b81", 2010 | "shasum": "" 2011 | }, 2012 | "require": { 2013 | "php": "^7.1.3", 2014 | "symfony/filesystem": "~3.4|~4.0", 2015 | "symfony/polyfill-ctype": "~1.8" 2016 | }, 2017 | "conflict": { 2018 | "symfony/finder": "<3.4" 2019 | }, 2020 | "require-dev": { 2021 | "symfony/dependency-injection": "~3.4|~4.0", 2022 | "symfony/event-dispatcher": "~3.4|~4.0", 2023 | "symfony/finder": "~3.4|~4.0", 2024 | "symfony/yaml": "~3.4|~4.0" 2025 | }, 2026 | "suggest": { 2027 | "symfony/yaml": "To use the yaml reference dumper" 2028 | }, 2029 | "type": "library", 2030 | "extra": { 2031 | "branch-alias": { 2032 | "dev-master": "4.1-dev" 2033 | } 2034 | }, 2035 | "autoload": { 2036 | "psr-4": { 2037 | "Symfony\\Component\\Config\\": "" 2038 | }, 2039 | "exclude-from-classmap": [ 2040 | "/Tests/" 2041 | ] 2042 | }, 2043 | "notification-url": "https://packagist.org/downloads/", 2044 | "license": [ 2045 | "MIT" 2046 | ], 2047 | "authors": [ 2048 | { 2049 | "name": "Fabien Potencier", 2050 | "email": "fabien@symfony.com" 2051 | }, 2052 | { 2053 | "name": "Symfony Community", 2054 | "homepage": "https://symfony.com/contributors" 2055 | } 2056 | ], 2057 | "description": "Symfony Config Component", 2058 | "homepage": "https://symfony.com", 2059 | "time": "2018-11-26T10:26:29+00:00" 2060 | }, 2061 | { 2062 | "name": "symfony/console", 2063 | "version": "v4.1.9", 2064 | "source": { 2065 | "type": "git", 2066 | "url": "https://github.com/symfony/console.git", 2067 | "reference": "c74f4d1988dfcd8760273e53551694da32b056d0" 2068 | }, 2069 | "dist": { 2070 | "type": "zip", 2071 | "url": "https://api.github.com/repos/symfony/console/zipball/c74f4d1988dfcd8760273e53551694da32b056d0", 2072 | "reference": "c74f4d1988dfcd8760273e53551694da32b056d0", 2073 | "shasum": "" 2074 | }, 2075 | "require": { 2076 | "php": "^7.1.3", 2077 | "symfony/polyfill-mbstring": "~1.0" 2078 | }, 2079 | "conflict": { 2080 | "symfony/dependency-injection": "<3.4", 2081 | "symfony/process": "<3.3" 2082 | }, 2083 | "require-dev": { 2084 | "psr/log": "~1.0", 2085 | "symfony/config": "~3.4|~4.0", 2086 | "symfony/dependency-injection": "~3.4|~4.0", 2087 | "symfony/event-dispatcher": "~3.4|~4.0", 2088 | "symfony/lock": "~3.4|~4.0", 2089 | "symfony/process": "~3.4|~4.0" 2090 | }, 2091 | "suggest": { 2092 | "psr/log-implementation": "For using the console logger", 2093 | "symfony/event-dispatcher": "", 2094 | "symfony/lock": "", 2095 | "symfony/process": "" 2096 | }, 2097 | "type": "library", 2098 | "extra": { 2099 | "branch-alias": { 2100 | "dev-master": "4.1-dev" 2101 | } 2102 | }, 2103 | "autoload": { 2104 | "psr-4": { 2105 | "Symfony\\Component\\Console\\": "" 2106 | }, 2107 | "exclude-from-classmap": [ 2108 | "/Tests/" 2109 | ] 2110 | }, 2111 | "notification-url": "https://packagist.org/downloads/", 2112 | "license": [ 2113 | "MIT" 2114 | ], 2115 | "authors": [ 2116 | { 2117 | "name": "Fabien Potencier", 2118 | "email": "fabien@symfony.com" 2119 | }, 2120 | { 2121 | "name": "Symfony Community", 2122 | "homepage": "https://symfony.com/contributors" 2123 | } 2124 | ], 2125 | "description": "Symfony Console Component", 2126 | "homepage": "https://symfony.com", 2127 | "time": "2018-11-26T14:00:40+00:00" 2128 | }, 2129 | { 2130 | "name": "symfony/contracts", 2131 | "version": "v1.0.2", 2132 | "source": { 2133 | "type": "git", 2134 | "url": "https://github.com/symfony/contracts.git", 2135 | "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" 2136 | }, 2137 | "dist": { 2138 | "type": "zip", 2139 | "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", 2140 | "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", 2141 | "shasum": "" 2142 | }, 2143 | "require": { 2144 | "php": "^7.1.3" 2145 | }, 2146 | "require-dev": { 2147 | "psr/cache": "^1.0", 2148 | "psr/container": "^1.0" 2149 | }, 2150 | "suggest": { 2151 | "psr/cache": "When using the Cache contracts", 2152 | "psr/container": "When using the Service contracts", 2153 | "symfony/cache-contracts-implementation": "", 2154 | "symfony/service-contracts-implementation": "", 2155 | "symfony/translation-contracts-implementation": "" 2156 | }, 2157 | "type": "library", 2158 | "extra": { 2159 | "branch-alias": { 2160 | "dev-master": "1.0-dev" 2161 | } 2162 | }, 2163 | "autoload": { 2164 | "psr-4": { 2165 | "Symfony\\Contracts\\": "" 2166 | }, 2167 | "exclude-from-classmap": [ 2168 | "**/Tests/" 2169 | ] 2170 | }, 2171 | "notification-url": "https://packagist.org/downloads/", 2172 | "license": [ 2173 | "MIT" 2174 | ], 2175 | "authors": [ 2176 | { 2177 | "name": "Nicolas Grekas", 2178 | "email": "p@tchwork.com" 2179 | }, 2180 | { 2181 | "name": "Symfony Community", 2182 | "homepage": "https://symfony.com/contributors" 2183 | } 2184 | ], 2185 | "description": "A set of abstractions extracted out of the Symfony components", 2186 | "homepage": "https://symfony.com", 2187 | "keywords": [ 2188 | "abstractions", 2189 | "contracts", 2190 | "decoupling", 2191 | "interfaces", 2192 | "interoperability", 2193 | "standards" 2194 | ], 2195 | "time": "2018-12-05T08:06:11+00:00" 2196 | }, 2197 | { 2198 | "name": "symfony/debug", 2199 | "version": "v4.1.9", 2200 | "source": { 2201 | "type": "git", 2202 | "url": "https://github.com/symfony/debug.git", 2203 | "reference": "533c656e1263bbe41891feb3b192ae9635d0c398" 2204 | }, 2205 | "dist": { 2206 | "type": "zip", 2207 | "url": "https://api.github.com/repos/symfony/debug/zipball/533c656e1263bbe41891feb3b192ae9635d0c398", 2208 | "reference": "533c656e1263bbe41891feb3b192ae9635d0c398", 2209 | "shasum": "" 2210 | }, 2211 | "require": { 2212 | "php": "^7.1.3", 2213 | "psr/log": "~1.0" 2214 | }, 2215 | "conflict": { 2216 | "symfony/http-kernel": "<3.4" 2217 | }, 2218 | "require-dev": { 2219 | "symfony/http-kernel": "~3.4|~4.0" 2220 | }, 2221 | "type": "library", 2222 | "extra": { 2223 | "branch-alias": { 2224 | "dev-master": "4.1-dev" 2225 | } 2226 | }, 2227 | "autoload": { 2228 | "psr-4": { 2229 | "Symfony\\Component\\Debug\\": "" 2230 | }, 2231 | "exclude-from-classmap": [ 2232 | "/Tests/" 2233 | ] 2234 | }, 2235 | "notification-url": "https://packagist.org/downloads/", 2236 | "license": [ 2237 | "MIT" 2238 | ], 2239 | "authors": [ 2240 | { 2241 | "name": "Fabien Potencier", 2242 | "email": "fabien@symfony.com" 2243 | }, 2244 | { 2245 | "name": "Symfony Community", 2246 | "homepage": "https://symfony.com/contributors" 2247 | } 2248 | ], 2249 | "description": "Symfony Debug Component", 2250 | "homepage": "https://symfony.com", 2251 | "time": "2018-11-28T18:21:59+00:00" 2252 | }, 2253 | { 2254 | "name": "symfony/dependency-injection", 2255 | "version": "v4.1.9", 2256 | "source": { 2257 | "type": "git", 2258 | "url": "https://github.com/symfony/dependency-injection.git", 2259 | "reference": "3fac676e06205374189deee0680ebc28a5da725b" 2260 | }, 2261 | "dist": { 2262 | "type": "zip", 2263 | "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/3fac676e06205374189deee0680ebc28a5da725b", 2264 | "reference": "3fac676e06205374189deee0680ebc28a5da725b", 2265 | "shasum": "" 2266 | }, 2267 | "require": { 2268 | "php": "^7.1.3", 2269 | "psr/container": "^1.0" 2270 | }, 2271 | "conflict": { 2272 | "symfony/config": "<4.1.1", 2273 | "symfony/finder": "<3.4", 2274 | "symfony/proxy-manager-bridge": "<3.4", 2275 | "symfony/yaml": "<3.4" 2276 | }, 2277 | "provide": { 2278 | "psr/container-implementation": "1.0" 2279 | }, 2280 | "require-dev": { 2281 | "symfony/config": "~4.1", 2282 | "symfony/expression-language": "~3.4|~4.0", 2283 | "symfony/yaml": "~3.4|~4.0" 2284 | }, 2285 | "suggest": { 2286 | "symfony/config": "", 2287 | "symfony/expression-language": "For using expressions in service container configuration", 2288 | "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", 2289 | "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", 2290 | "symfony/yaml": "" 2291 | }, 2292 | "type": "library", 2293 | "extra": { 2294 | "branch-alias": { 2295 | "dev-master": "4.1-dev" 2296 | } 2297 | }, 2298 | "autoload": { 2299 | "psr-4": { 2300 | "Symfony\\Component\\DependencyInjection\\": "" 2301 | }, 2302 | "exclude-from-classmap": [ 2303 | "/Tests/" 2304 | ] 2305 | }, 2306 | "notification-url": "https://packagist.org/downloads/", 2307 | "license": [ 2308 | "MIT" 2309 | ], 2310 | "authors": [ 2311 | { 2312 | "name": "Fabien Potencier", 2313 | "email": "fabien@symfony.com" 2314 | }, 2315 | { 2316 | "name": "Symfony Community", 2317 | "homepage": "https://symfony.com/contributors" 2318 | } 2319 | ], 2320 | "description": "Symfony DependencyInjection Component", 2321 | "homepage": "https://symfony.com", 2322 | "time": "2018-12-02T15:58:55+00:00" 2323 | }, 2324 | { 2325 | "name": "symfony/event-dispatcher", 2326 | "version": "v4.1.9", 2327 | "source": { 2328 | "type": "git", 2329 | "url": "https://github.com/symfony/event-dispatcher.git", 2330 | "reference": "c4a3b5d70c05e5e7de4f22a3e840cdb173ccd7bf" 2331 | }, 2332 | "dist": { 2333 | "type": "zip", 2334 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c4a3b5d70c05e5e7de4f22a3e840cdb173ccd7bf", 2335 | "reference": "c4a3b5d70c05e5e7de4f22a3e840cdb173ccd7bf", 2336 | "shasum": "" 2337 | }, 2338 | "require": { 2339 | "php": "^7.1.3" 2340 | }, 2341 | "conflict": { 2342 | "symfony/dependency-injection": "<3.4" 2343 | }, 2344 | "require-dev": { 2345 | "psr/log": "~1.0", 2346 | "symfony/config": "~3.4|~4.0", 2347 | "symfony/dependency-injection": "~3.4|~4.0", 2348 | "symfony/expression-language": "~3.4|~4.0", 2349 | "symfony/stopwatch": "~3.4|~4.0" 2350 | }, 2351 | "suggest": { 2352 | "symfony/dependency-injection": "", 2353 | "symfony/http-kernel": "" 2354 | }, 2355 | "type": "library", 2356 | "extra": { 2357 | "branch-alias": { 2358 | "dev-master": "4.1-dev" 2359 | } 2360 | }, 2361 | "autoload": { 2362 | "psr-4": { 2363 | "Symfony\\Component\\EventDispatcher\\": "" 2364 | }, 2365 | "exclude-from-classmap": [ 2366 | "/Tests/" 2367 | ] 2368 | }, 2369 | "notification-url": "https://packagist.org/downloads/", 2370 | "license": [ 2371 | "MIT" 2372 | ], 2373 | "authors": [ 2374 | { 2375 | "name": "Fabien Potencier", 2376 | "email": "fabien@symfony.com" 2377 | }, 2378 | { 2379 | "name": "Symfony Community", 2380 | "homepage": "https://symfony.com/contributors" 2381 | } 2382 | ], 2383 | "description": "Symfony EventDispatcher Component", 2384 | "homepage": "https://symfony.com", 2385 | "time": "2018-12-01T08:51:37+00:00" 2386 | }, 2387 | { 2388 | "name": "symfony/filesystem", 2389 | "version": "v4.1.9", 2390 | "source": { 2391 | "type": "git", 2392 | "url": "https://github.com/symfony/filesystem.git", 2393 | "reference": "71cc7693940bdad4dac4b038acd46b4f1ae7d2ca" 2394 | }, 2395 | "dist": { 2396 | "type": "zip", 2397 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/71cc7693940bdad4dac4b038acd46b4f1ae7d2ca", 2398 | "reference": "71cc7693940bdad4dac4b038acd46b4f1ae7d2ca", 2399 | "shasum": "" 2400 | }, 2401 | "require": { 2402 | "php": "^7.1.3", 2403 | "symfony/polyfill-ctype": "~1.8" 2404 | }, 2405 | "type": "library", 2406 | "extra": { 2407 | "branch-alias": { 2408 | "dev-master": "4.1-dev" 2409 | } 2410 | }, 2411 | "autoload": { 2412 | "psr-4": { 2413 | "Symfony\\Component\\Filesystem\\": "" 2414 | }, 2415 | "exclude-from-classmap": [ 2416 | "/Tests/" 2417 | ] 2418 | }, 2419 | "notification-url": "https://packagist.org/downloads/", 2420 | "license": [ 2421 | "MIT" 2422 | ], 2423 | "authors": [ 2424 | { 2425 | "name": "Fabien Potencier", 2426 | "email": "fabien@symfony.com" 2427 | }, 2428 | { 2429 | "name": "Symfony Community", 2430 | "homepage": "https://symfony.com/contributors" 2431 | } 2432 | ], 2433 | "description": "Symfony Filesystem Component", 2434 | "homepage": "https://symfony.com", 2435 | "time": "2018-11-11T19:51:29+00:00" 2436 | }, 2437 | { 2438 | "name": "symfony/finder", 2439 | "version": "v4.1.9", 2440 | "source": { 2441 | "type": "git", 2442 | "url": "https://github.com/symfony/finder.git", 2443 | "reference": "68fbdcafe915db67adb13fddaec4532e684f6689" 2444 | }, 2445 | "dist": { 2446 | "type": "zip", 2447 | "url": "https://api.github.com/repos/symfony/finder/zipball/68fbdcafe915db67adb13fddaec4532e684f6689", 2448 | "reference": "68fbdcafe915db67adb13fddaec4532e684f6689", 2449 | "shasum": "" 2450 | }, 2451 | "require": { 2452 | "php": "^7.1.3" 2453 | }, 2454 | "type": "library", 2455 | "extra": { 2456 | "branch-alias": { 2457 | "dev-master": "4.1-dev" 2458 | } 2459 | }, 2460 | "autoload": { 2461 | "psr-4": { 2462 | "Symfony\\Component\\Finder\\": "" 2463 | }, 2464 | "exclude-from-classmap": [ 2465 | "/Tests/" 2466 | ] 2467 | }, 2468 | "notification-url": "https://packagist.org/downloads/", 2469 | "license": [ 2470 | "MIT" 2471 | ], 2472 | "authors": [ 2473 | { 2474 | "name": "Fabien Potencier", 2475 | "email": "fabien@symfony.com" 2476 | }, 2477 | { 2478 | "name": "Symfony Community", 2479 | "homepage": "https://symfony.com/contributors" 2480 | } 2481 | ], 2482 | "description": "Symfony Finder Component", 2483 | "homepage": "https://symfony.com", 2484 | "time": "2018-11-11T19:51:29+00:00" 2485 | }, 2486 | { 2487 | "name": "symfony/flex", 2488 | "version": "v1.1.8", 2489 | "source": { 2490 | "type": "git", 2491 | "url": "https://github.com/symfony/flex.git", 2492 | "reference": "955774ecf07b10230bb5b44e150ba078b45f68fa" 2493 | }, 2494 | "dist": { 2495 | "type": "zip", 2496 | "url": "https://api.github.com/repos/symfony/flex/zipball/955774ecf07b10230bb5b44e150ba078b45f68fa", 2497 | "reference": "955774ecf07b10230bb5b44e150ba078b45f68fa", 2498 | "shasum": "" 2499 | }, 2500 | "require": { 2501 | "composer-plugin-api": "^1.0", 2502 | "php": "^7.0" 2503 | }, 2504 | "require-dev": { 2505 | "composer/composer": "^1.0.2", 2506 | "symfony/phpunit-bridge": "^3.2.8" 2507 | }, 2508 | "type": "composer-plugin", 2509 | "extra": { 2510 | "branch-alias": { 2511 | "dev-master": "1.1-dev" 2512 | }, 2513 | "class": "Symfony\\Flex\\Flex" 2514 | }, 2515 | "autoload": { 2516 | "psr-4": { 2517 | "Symfony\\Flex\\": "src" 2518 | } 2519 | }, 2520 | "notification-url": "https://packagist.org/downloads/", 2521 | "license": [ 2522 | "MIT" 2523 | ], 2524 | "authors": [ 2525 | { 2526 | "name": "Fabien Potencier", 2527 | "email": "fabien.potencier@gmail.com" 2528 | } 2529 | ], 2530 | "description": "Composer plugin for Symfony", 2531 | "time": "2018-11-15T06:11:38+00:00" 2532 | }, 2533 | { 2534 | "name": "symfony/framework-bundle", 2535 | "version": "v4.1.9", 2536 | "source": { 2537 | "type": "git", 2538 | "url": "https://github.com/symfony/framework-bundle.git", 2539 | "reference": "69ca34da81175992fad55af05d346d699db4fdca" 2540 | }, 2541 | "dist": { 2542 | "type": "zip", 2543 | "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/69ca34da81175992fad55af05d346d699db4fdca", 2544 | "reference": "69ca34da81175992fad55af05d346d699db4fdca", 2545 | "shasum": "" 2546 | }, 2547 | "require": { 2548 | "ext-xml": "*", 2549 | "php": "^7.1.3", 2550 | "symfony/cache": "~3.4|~4.0", 2551 | "symfony/config": "~3.4|~4.0", 2552 | "symfony/dependency-injection": "^4.1.1", 2553 | "symfony/event-dispatcher": "^4.1", 2554 | "symfony/filesystem": "~3.4|~4.0", 2555 | "symfony/finder": "~3.4|~4.0", 2556 | "symfony/http-foundation": "^4.1", 2557 | "symfony/http-kernel": "^4.1", 2558 | "symfony/polyfill-mbstring": "~1.0", 2559 | "symfony/routing": "^4.1" 2560 | }, 2561 | "conflict": { 2562 | "phpdocumentor/reflection-docblock": "<3.0", 2563 | "phpdocumentor/type-resolver": "<0.2.1", 2564 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", 2565 | "symfony/asset": "<3.4", 2566 | "symfony/console": "<3.4", 2567 | "symfony/form": "<4.1", 2568 | "symfony/messenger": ">=4.2", 2569 | "symfony/property-info": "<3.4", 2570 | "symfony/serializer": "<4.1", 2571 | "symfony/stopwatch": "<3.4", 2572 | "symfony/translation": "<3.4", 2573 | "symfony/twig-bridge": "<4.1.1", 2574 | "symfony/validator": "<4.1", 2575 | "symfony/workflow": "<4.1" 2576 | }, 2577 | "require-dev": { 2578 | "doctrine/annotations": "~1.0", 2579 | "doctrine/cache": "~1.0", 2580 | "fig/link-util": "^1.0", 2581 | "phpdocumentor/reflection-docblock": "^3.0|^4.0", 2582 | "symfony/asset": "~3.4|~4.0", 2583 | "symfony/browser-kit": "~3.4|~4.0", 2584 | "symfony/console": "~3.4|~4.0", 2585 | "symfony/css-selector": "~3.4|~4.0", 2586 | "symfony/dom-crawler": "~3.4|~4.0", 2587 | "symfony/expression-language": "~3.4|~4.0", 2588 | "symfony/form": "^4.1", 2589 | "symfony/lock": "~3.4|~4.0", 2590 | "symfony/messenger": "^4.1", 2591 | "symfony/polyfill-intl-icu": "~1.0", 2592 | "symfony/process": "~3.4|~4.0", 2593 | "symfony/property-info": "~3.4|~4.0", 2594 | "symfony/security": "~3.4|~4.0", 2595 | "symfony/security-core": "~3.4|~4.0", 2596 | "symfony/security-csrf": "~3.4|~4.0", 2597 | "symfony/serializer": "^4.1", 2598 | "symfony/stopwatch": "~3.4|~4.0", 2599 | "symfony/templating": "~3.4|~4.0", 2600 | "symfony/translation": "~3.4|~4.0", 2601 | "symfony/validator": "^4.1", 2602 | "symfony/var-dumper": "~3.4|~4.0", 2603 | "symfony/web-link": "~3.4|~4.0", 2604 | "symfony/workflow": "^4.1", 2605 | "symfony/yaml": "~3.4|~4.0", 2606 | "twig/twig": "~1.34|~2.4" 2607 | }, 2608 | "suggest": { 2609 | "ext-apcu": "For best performance of the system caches", 2610 | "symfony/console": "For using the console commands", 2611 | "symfony/form": "For using forms", 2612 | "symfony/property-info": "For using the property_info service", 2613 | "symfony/serializer": "For using the serializer service", 2614 | "symfony/validator": "For using validation", 2615 | "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", 2616 | "symfony/yaml": "For using the debug:config and lint:yaml commands" 2617 | }, 2618 | "type": "symfony-bundle", 2619 | "extra": { 2620 | "branch-alias": { 2621 | "dev-master": "4.1-dev" 2622 | } 2623 | }, 2624 | "autoload": { 2625 | "psr-4": { 2626 | "Symfony\\Bundle\\FrameworkBundle\\": "" 2627 | }, 2628 | "exclude-from-classmap": [ 2629 | "/Tests/" 2630 | ] 2631 | }, 2632 | "notification-url": "https://packagist.org/downloads/", 2633 | "license": [ 2634 | "MIT" 2635 | ], 2636 | "authors": [ 2637 | { 2638 | "name": "Fabien Potencier", 2639 | "email": "fabien@symfony.com" 2640 | }, 2641 | { 2642 | "name": "Symfony Community", 2643 | "homepage": "https://symfony.com/contributors" 2644 | } 2645 | ], 2646 | "description": "Symfony FrameworkBundle", 2647 | "homepage": "https://symfony.com", 2648 | "time": "2018-12-03T18:01:20+00:00" 2649 | }, 2650 | { 2651 | "name": "symfony/http-foundation", 2652 | "version": "v4.1.9", 2653 | "source": { 2654 | "type": "git", 2655 | "url": "https://github.com/symfony/http-foundation.git", 2656 | "reference": "26062b9527b6797fc6239ed698c9c0a3c5e891e0" 2657 | }, 2658 | "dist": { 2659 | "type": "zip", 2660 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/26062b9527b6797fc6239ed698c9c0a3c5e891e0", 2661 | "reference": "26062b9527b6797fc6239ed698c9c0a3c5e891e0", 2662 | "shasum": "" 2663 | }, 2664 | "require": { 2665 | "php": "^7.1.3", 2666 | "symfony/polyfill-mbstring": "~1.1" 2667 | }, 2668 | "require-dev": { 2669 | "predis/predis": "~1.0", 2670 | "symfony/expression-language": "~3.4|~4.0" 2671 | }, 2672 | "type": "library", 2673 | "extra": { 2674 | "branch-alias": { 2675 | "dev-master": "4.1-dev" 2676 | } 2677 | }, 2678 | "autoload": { 2679 | "psr-4": { 2680 | "Symfony\\Component\\HttpFoundation\\": "" 2681 | }, 2682 | "exclude-from-classmap": [ 2683 | "/Tests/" 2684 | ] 2685 | }, 2686 | "notification-url": "https://packagist.org/downloads/", 2687 | "license": [ 2688 | "MIT" 2689 | ], 2690 | "authors": [ 2691 | { 2692 | "name": "Fabien Potencier", 2693 | "email": "fabien@symfony.com" 2694 | }, 2695 | { 2696 | "name": "Symfony Community", 2697 | "homepage": "https://symfony.com/contributors" 2698 | } 2699 | ], 2700 | "description": "Symfony HttpFoundation Component", 2701 | "homepage": "https://symfony.com", 2702 | "time": "2018-11-26T10:26:29+00:00" 2703 | }, 2704 | { 2705 | "name": "symfony/http-kernel", 2706 | "version": "v4.1.9", 2707 | "source": { 2708 | "type": "git", 2709 | "url": "https://github.com/symfony/http-kernel.git", 2710 | "reference": "303dd494fbb6476a57bd4156e177971d9982c894" 2711 | }, 2712 | "dist": { 2713 | "type": "zip", 2714 | "url": "https://api.github.com/repos/symfony/http-kernel/zipball/303dd494fbb6476a57bd4156e177971d9982c894", 2715 | "reference": "303dd494fbb6476a57bd4156e177971d9982c894", 2716 | "shasum": "" 2717 | }, 2718 | "require": { 2719 | "php": "^7.1.3", 2720 | "psr/log": "~1.0", 2721 | "symfony/debug": "~3.4|~4.0", 2722 | "symfony/event-dispatcher": "~4.1", 2723 | "symfony/http-foundation": "^4.1.1", 2724 | "symfony/polyfill-ctype": "~1.8" 2725 | }, 2726 | "conflict": { 2727 | "symfony/config": "<3.4", 2728 | "symfony/dependency-injection": "<4.1", 2729 | "symfony/var-dumper": "<4.1.1", 2730 | "twig/twig": "<1.34|<2.4,>=2" 2731 | }, 2732 | "provide": { 2733 | "psr/log-implementation": "1.0" 2734 | }, 2735 | "require-dev": { 2736 | "psr/cache": "~1.0", 2737 | "symfony/browser-kit": "~3.4|~4.0", 2738 | "symfony/config": "~3.4|~4.0", 2739 | "symfony/console": "~3.4|~4.0", 2740 | "symfony/css-selector": "~3.4|~4.0", 2741 | "symfony/dependency-injection": "^4.1", 2742 | "symfony/dom-crawler": "~3.4|~4.0", 2743 | "symfony/expression-language": "~3.4|~4.0", 2744 | "symfony/finder": "~3.4|~4.0", 2745 | "symfony/process": "~3.4|~4.0", 2746 | "symfony/routing": "~3.4|~4.0", 2747 | "symfony/stopwatch": "~3.4|~4.0", 2748 | "symfony/templating": "~3.4|~4.0", 2749 | "symfony/translation": "~3.4|~4.0", 2750 | "symfony/var-dumper": "^4.1.1" 2751 | }, 2752 | "suggest": { 2753 | "symfony/browser-kit": "", 2754 | "symfony/config": "", 2755 | "symfony/console": "", 2756 | "symfony/dependency-injection": "", 2757 | "symfony/var-dumper": "" 2758 | }, 2759 | "type": "library", 2760 | "extra": { 2761 | "branch-alias": { 2762 | "dev-master": "4.1-dev" 2763 | } 2764 | }, 2765 | "autoload": { 2766 | "psr-4": { 2767 | "Symfony\\Component\\HttpKernel\\": "" 2768 | }, 2769 | "exclude-from-classmap": [ 2770 | "/Tests/" 2771 | ] 2772 | }, 2773 | "notification-url": "https://packagist.org/downloads/", 2774 | "license": [ 2775 | "MIT" 2776 | ], 2777 | "authors": [ 2778 | { 2779 | "name": "Fabien Potencier", 2780 | "email": "fabien@symfony.com" 2781 | }, 2782 | { 2783 | "name": "Symfony Community", 2784 | "homepage": "https://symfony.com/contributors" 2785 | } 2786 | ], 2787 | "description": "Symfony HttpKernel Component", 2788 | "homepage": "https://symfony.com", 2789 | "time": "2018-12-06T17:34:50+00:00" 2790 | }, 2791 | { 2792 | "name": "symfony/monolog-bridge", 2793 | "version": "v4.2.0", 2794 | "source": { 2795 | "type": "git", 2796 | "url": "https://github.com/symfony/monolog-bridge.git", 2797 | "reference": "95538500b45bb96d4bf90c7fdfe615318a777dea" 2798 | }, 2799 | "dist": { 2800 | "type": "zip", 2801 | "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/95538500b45bb96d4bf90c7fdfe615318a777dea", 2802 | "reference": "95538500b45bb96d4bf90c7fdfe615318a777dea", 2803 | "shasum": "" 2804 | }, 2805 | "require": { 2806 | "monolog/monolog": "~1.19", 2807 | "php": "^7.1.3", 2808 | "symfony/contracts": "^1.0", 2809 | "symfony/http-kernel": "~3.4|~4.0" 2810 | }, 2811 | "conflict": { 2812 | "symfony/console": "<3.4", 2813 | "symfony/http-foundation": "<3.4" 2814 | }, 2815 | "require-dev": { 2816 | "symfony/console": "~3.4|~4.0", 2817 | "symfony/event-dispatcher": "~3.4|~4.0", 2818 | "symfony/security-core": "~3.4|~4.0", 2819 | "symfony/var-dumper": "~3.4|~4.0" 2820 | }, 2821 | "suggest": { 2822 | "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", 2823 | "symfony/event-dispatcher": "Needed when using log messages in console commands.", 2824 | "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", 2825 | "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." 2826 | }, 2827 | "type": "symfony-bridge", 2828 | "extra": { 2829 | "branch-alias": { 2830 | "dev-master": "4.2-dev" 2831 | } 2832 | }, 2833 | "autoload": { 2834 | "psr-4": { 2835 | "Symfony\\Bridge\\Monolog\\": "" 2836 | }, 2837 | "exclude-from-classmap": [ 2838 | "/Tests/" 2839 | ] 2840 | }, 2841 | "notification-url": "https://packagist.org/downloads/", 2842 | "license": [ 2843 | "MIT" 2844 | ], 2845 | "authors": [ 2846 | { 2847 | "name": "Fabien Potencier", 2848 | "email": "fabien@symfony.com" 2849 | }, 2850 | { 2851 | "name": "Symfony Community", 2852 | "homepage": "https://symfony.com/contributors" 2853 | } 2854 | ], 2855 | "description": "Symfony Monolog Bridge", 2856 | "homepage": "https://symfony.com", 2857 | "time": "2018-11-26T10:55:26+00:00" 2858 | }, 2859 | { 2860 | "name": "symfony/monolog-bundle", 2861 | "version": "v3.3.1", 2862 | "source": { 2863 | "type": "git", 2864 | "url": "https://github.com/symfony/monolog-bundle.git", 2865 | "reference": "572e143afc03419a75ab002c80a2fd99299195ff" 2866 | }, 2867 | "dist": { 2868 | "type": "zip", 2869 | "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/572e143afc03419a75ab002c80a2fd99299195ff", 2870 | "reference": "572e143afc03419a75ab002c80a2fd99299195ff", 2871 | "shasum": "" 2872 | }, 2873 | "require": { 2874 | "monolog/monolog": "~1.22", 2875 | "php": ">=5.6", 2876 | "symfony/config": "~2.7|~3.3|~4.0", 2877 | "symfony/dependency-injection": "~2.7|~3.4.10|^4.0.10", 2878 | "symfony/http-kernel": "~2.7|~3.3|~4.0", 2879 | "symfony/monolog-bridge": "~2.7|~3.3|~4.0" 2880 | }, 2881 | "require-dev": { 2882 | "symfony/console": "~2.7|~3.3|~4.0", 2883 | "symfony/phpunit-bridge": "^3.3|^4.0", 2884 | "symfony/yaml": "~2.7|~3.3|~4.0" 2885 | }, 2886 | "type": "symfony-bundle", 2887 | "extra": { 2888 | "branch-alias": { 2889 | "dev-master": "3.x-dev" 2890 | } 2891 | }, 2892 | "autoload": { 2893 | "psr-4": { 2894 | "Symfony\\Bundle\\MonologBundle\\": "" 2895 | }, 2896 | "exclude-from-classmap": [ 2897 | "/Tests/" 2898 | ] 2899 | }, 2900 | "notification-url": "https://packagist.org/downloads/", 2901 | "license": [ 2902 | "MIT" 2903 | ], 2904 | "authors": [ 2905 | { 2906 | "name": "Symfony Community", 2907 | "homepage": "http://symfony.com/contributors" 2908 | }, 2909 | { 2910 | "name": "Fabien Potencier", 2911 | "email": "fabien@symfony.com" 2912 | } 2913 | ], 2914 | "description": "Symfony MonologBundle", 2915 | "homepage": "http://symfony.com", 2916 | "keywords": [ 2917 | "log", 2918 | "logging" 2919 | ], 2920 | "time": "2018-11-04T09:58:13+00:00" 2921 | }, 2922 | { 2923 | "name": "symfony/polyfill-mbstring", 2924 | "version": "v1.10.0", 2925 | "source": { 2926 | "type": "git", 2927 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2928 | "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" 2929 | }, 2930 | "dist": { 2931 | "type": "zip", 2932 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", 2933 | "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", 2934 | "shasum": "" 2935 | }, 2936 | "require": { 2937 | "php": ">=5.3.3" 2938 | }, 2939 | "suggest": { 2940 | "ext-mbstring": "For best performance" 2941 | }, 2942 | "type": "library", 2943 | "extra": { 2944 | "branch-alias": { 2945 | "dev-master": "1.9-dev" 2946 | } 2947 | }, 2948 | "autoload": { 2949 | "psr-4": { 2950 | "Symfony\\Polyfill\\Mbstring\\": "" 2951 | }, 2952 | "files": [ 2953 | "bootstrap.php" 2954 | ] 2955 | }, 2956 | "notification-url": "https://packagist.org/downloads/", 2957 | "license": [ 2958 | "MIT" 2959 | ], 2960 | "authors": [ 2961 | { 2962 | "name": "Nicolas Grekas", 2963 | "email": "p@tchwork.com" 2964 | }, 2965 | { 2966 | "name": "Symfony Community", 2967 | "homepage": "https://symfony.com/contributors" 2968 | } 2969 | ], 2970 | "description": "Symfony polyfill for the Mbstring extension", 2971 | "homepage": "https://symfony.com", 2972 | "keywords": [ 2973 | "compatibility", 2974 | "mbstring", 2975 | "polyfill", 2976 | "portable", 2977 | "shim" 2978 | ], 2979 | "time": "2018-09-21T13:07:52+00:00" 2980 | }, 2981 | { 2982 | "name": "symfony/process", 2983 | "version": "v4.1.9", 2984 | "source": { 2985 | "type": "git", 2986 | "url": "https://github.com/symfony/process.git", 2987 | "reference": "471f6e24172366a97365baaae588ddaafbba9b20" 2988 | }, 2989 | "dist": { 2990 | "type": "zip", 2991 | "url": "https://api.github.com/repos/symfony/process/zipball/471f6e24172366a97365baaae588ddaafbba9b20", 2992 | "reference": "471f6e24172366a97365baaae588ddaafbba9b20", 2993 | "shasum": "" 2994 | }, 2995 | "require": { 2996 | "php": "^7.1.3" 2997 | }, 2998 | "type": "library", 2999 | "extra": { 3000 | "branch-alias": { 3001 | "dev-master": "4.1-dev" 3002 | } 3003 | }, 3004 | "autoload": { 3005 | "psr-4": { 3006 | "Symfony\\Component\\Process\\": "" 3007 | }, 3008 | "exclude-from-classmap": [ 3009 | "/Tests/" 3010 | ] 3011 | }, 3012 | "notification-url": "https://packagist.org/downloads/", 3013 | "license": [ 3014 | "MIT" 3015 | ], 3016 | "authors": [ 3017 | { 3018 | "name": "Fabien Potencier", 3019 | "email": "fabien@symfony.com" 3020 | }, 3021 | { 3022 | "name": "Symfony Community", 3023 | "homepage": "https://symfony.com/contributors" 3024 | } 3025 | ], 3026 | "description": "Symfony Process Component", 3027 | "homepage": "https://symfony.com", 3028 | "time": "2018-11-20T16:14:00+00:00" 3029 | }, 3030 | { 3031 | "name": "symfony/psr-http-message-bridge", 3032 | "version": "v1.1.0", 3033 | "source": { 3034 | "type": "git", 3035 | "url": "https://github.com/symfony/psr-http-message-bridge.git", 3036 | "reference": "53c15a6a7918e6c2ab16ae370ea607fb40cab196" 3037 | }, 3038 | "dist": { 3039 | "type": "zip", 3040 | "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/53c15a6a7918e6c2ab16ae370ea607fb40cab196", 3041 | "reference": "53c15a6a7918e6c2ab16ae370ea607fb40cab196", 3042 | "shasum": "" 3043 | }, 3044 | "require": { 3045 | "php": "^5.3.3 || ^7.0", 3046 | "psr/http-message": "^1.0", 3047 | "symfony/http-foundation": "^2.3.42 || ^3.4 || ^4.0" 3048 | }, 3049 | "require-dev": { 3050 | "symfony/phpunit-bridge": "^3.4 || 4.0" 3051 | }, 3052 | "suggest": { 3053 | "psr/http-factory-implementation": "To use the PSR-17 factory", 3054 | "psr/http-message-implementation": "To use the HttpFoundation factory", 3055 | "zendframework/zend-diactoros": "To use the Zend Diactoros factory" 3056 | }, 3057 | "type": "symfony-bridge", 3058 | "extra": { 3059 | "branch-alias": { 3060 | "dev-master": "1.1-dev" 3061 | } 3062 | }, 3063 | "autoload": { 3064 | "psr-4": { 3065 | "Symfony\\Bridge\\PsrHttpMessage\\": "" 3066 | } 3067 | }, 3068 | "notification-url": "https://packagist.org/downloads/", 3069 | "license": [ 3070 | "MIT" 3071 | ], 3072 | "authors": [ 3073 | { 3074 | "name": "Symfony Community", 3075 | "homepage": "http://symfony.com/contributors" 3076 | }, 3077 | { 3078 | "name": "Fabien Potencier", 3079 | "email": "fabien@symfony.com" 3080 | } 3081 | ], 3082 | "description": "PSR HTTP message bridge", 3083 | "homepage": "http://symfony.com", 3084 | "keywords": [ 3085 | "http", 3086 | "http-message", 3087 | "psr-7" 3088 | ], 3089 | "time": "2018-08-30T16:28:28+00:00" 3090 | }, 3091 | { 3092 | "name": "symfony/routing", 3093 | "version": "v4.1.9", 3094 | "source": { 3095 | "type": "git", 3096 | "url": "https://github.com/symfony/routing.git", 3097 | "reference": "cda9b423e3457b5915687f8dab5679c1fd03fd80" 3098 | }, 3099 | "dist": { 3100 | "type": "zip", 3101 | "url": "https://api.github.com/repos/symfony/routing/zipball/cda9b423e3457b5915687f8dab5679c1fd03fd80", 3102 | "reference": "cda9b423e3457b5915687f8dab5679c1fd03fd80", 3103 | "shasum": "" 3104 | }, 3105 | "require": { 3106 | "php": "^7.1.3" 3107 | }, 3108 | "conflict": { 3109 | "symfony/config": "<3.4", 3110 | "symfony/dependency-injection": "<3.4", 3111 | "symfony/yaml": "<3.4" 3112 | }, 3113 | "require-dev": { 3114 | "doctrine/annotations": "~1.0", 3115 | "psr/log": "~1.0", 3116 | "symfony/config": "~3.4|~4.0", 3117 | "symfony/dependency-injection": "~3.4|~4.0", 3118 | "symfony/expression-language": "~3.4|~4.0", 3119 | "symfony/http-foundation": "~3.4|~4.0", 3120 | "symfony/yaml": "~3.4|~4.0" 3121 | }, 3122 | "suggest": { 3123 | "doctrine/annotations": "For using the annotation loader", 3124 | "symfony/config": "For using the all-in-one router or any loader", 3125 | "symfony/dependency-injection": "For loading routes from a service", 3126 | "symfony/expression-language": "For using expression matching", 3127 | "symfony/http-foundation": "For using a Symfony Request object", 3128 | "symfony/yaml": "For using the YAML loader" 3129 | }, 3130 | "type": "library", 3131 | "extra": { 3132 | "branch-alias": { 3133 | "dev-master": "4.1-dev" 3134 | } 3135 | }, 3136 | "autoload": { 3137 | "psr-4": { 3138 | "Symfony\\Component\\Routing\\": "" 3139 | }, 3140 | "exclude-from-classmap": [ 3141 | "/Tests/" 3142 | ] 3143 | }, 3144 | "notification-url": "https://packagist.org/downloads/", 3145 | "license": [ 3146 | "MIT" 3147 | ], 3148 | "authors": [ 3149 | { 3150 | "name": "Fabien Potencier", 3151 | "email": "fabien@symfony.com" 3152 | }, 3153 | { 3154 | "name": "Symfony Community", 3155 | "homepage": "https://symfony.com/contributors" 3156 | } 3157 | ], 3158 | "description": "Symfony Routing Component", 3159 | "homepage": "https://symfony.com", 3160 | "keywords": [ 3161 | "router", 3162 | "routing", 3163 | "uri", 3164 | "url" 3165 | ], 3166 | "time": "2018-12-03T21:38:57+00:00" 3167 | }, 3168 | { 3169 | "name": "symfony/yaml", 3170 | "version": "v4.1.9", 3171 | "source": { 3172 | "type": "git", 3173 | "url": "https://github.com/symfony/yaml.git", 3174 | "reference": "fe87e3b24d15ec8948f0280ee867a65ca44fdbaa" 3175 | }, 3176 | "dist": { 3177 | "type": "zip", 3178 | "url": "https://api.github.com/repos/symfony/yaml/zipball/fe87e3b24d15ec8948f0280ee867a65ca44fdbaa", 3179 | "reference": "fe87e3b24d15ec8948f0280ee867a65ca44fdbaa", 3180 | "shasum": "" 3181 | }, 3182 | "require": { 3183 | "php": "^7.1.3", 3184 | "symfony/polyfill-ctype": "~1.8" 3185 | }, 3186 | "conflict": { 3187 | "symfony/console": "<3.4" 3188 | }, 3189 | "require-dev": { 3190 | "symfony/console": "~3.4|~4.0" 3191 | }, 3192 | "suggest": { 3193 | "symfony/console": "For validating YAML files using the lint command" 3194 | }, 3195 | "type": "library", 3196 | "extra": { 3197 | "branch-alias": { 3198 | "dev-master": "4.1-dev" 3199 | } 3200 | }, 3201 | "autoload": { 3202 | "psr-4": { 3203 | "Symfony\\Component\\Yaml\\": "" 3204 | }, 3205 | "exclude-from-classmap": [ 3206 | "/Tests/" 3207 | ] 3208 | }, 3209 | "notification-url": "https://packagist.org/downloads/", 3210 | "license": [ 3211 | "MIT" 3212 | ], 3213 | "authors": [ 3214 | { 3215 | "name": "Fabien Potencier", 3216 | "email": "fabien@symfony.com" 3217 | }, 3218 | { 3219 | "name": "Symfony Community", 3220 | "homepage": "https://symfony.com/contributors" 3221 | } 3222 | ], 3223 | "description": "Symfony Yaml Component", 3224 | "homepage": "https://symfony.com", 3225 | "time": "2018-11-11T19:51:29+00:00" 3226 | }, 3227 | { 3228 | "name": "zendframework/zend-diactoros", 3229 | "version": "1.8.6", 3230 | "source": { 3231 | "type": "git", 3232 | "url": "https://github.com/zendframework/zend-diactoros.git", 3233 | "reference": "20da13beba0dde8fb648be3cc19765732790f46e" 3234 | }, 3235 | "dist": { 3236 | "type": "zip", 3237 | "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/20da13beba0dde8fb648be3cc19765732790f46e", 3238 | "reference": "20da13beba0dde8fb648be3cc19765732790f46e", 3239 | "shasum": "" 3240 | }, 3241 | "require": { 3242 | "php": "^5.6 || ^7.0", 3243 | "psr/http-message": "^1.0" 3244 | }, 3245 | "provide": { 3246 | "psr/http-message-implementation": "1.0" 3247 | }, 3248 | "require-dev": { 3249 | "ext-dom": "*", 3250 | "ext-libxml": "*", 3251 | "php-http/psr7-integration-tests": "dev-master", 3252 | "phpunit/phpunit": "^5.7.16 || ^6.0.8 || ^7.2.7", 3253 | "zendframework/zend-coding-standard": "~1.0" 3254 | }, 3255 | "type": "library", 3256 | "extra": { 3257 | "branch-alias": { 3258 | "dev-master": "1.8.x-dev", 3259 | "dev-develop": "1.9.x-dev", 3260 | "dev-release-2.0": "2.0.x-dev" 3261 | } 3262 | }, 3263 | "autoload": { 3264 | "files": [ 3265 | "src/functions/create_uploaded_file.php", 3266 | "src/functions/marshal_headers_from_sapi.php", 3267 | "src/functions/marshal_method_from_sapi.php", 3268 | "src/functions/marshal_protocol_version_from_sapi.php", 3269 | "src/functions/marshal_uri_from_sapi.php", 3270 | "src/functions/normalize_server.php", 3271 | "src/functions/normalize_uploaded_files.php", 3272 | "src/functions/parse_cookie_header.php" 3273 | ], 3274 | "psr-4": { 3275 | "Zend\\Diactoros\\": "src/" 3276 | } 3277 | }, 3278 | "notification-url": "https://packagist.org/downloads/", 3279 | "license": [ 3280 | "BSD-2-Clause" 3281 | ], 3282 | "description": "PSR HTTP Message implementations", 3283 | "homepage": "https://github.com/zendframework/zend-diactoros", 3284 | "keywords": [ 3285 | "http", 3286 | "psr", 3287 | "psr-7" 3288 | ], 3289 | "time": "2018-09-05T19:29:37+00:00" 3290 | } 3291 | ], 3292 | "packages-dev": [ 3293 | { 3294 | "name": "symfony/dotenv", 3295 | "version": "v4.1.9", 3296 | "source": { 3297 | "type": "git", 3298 | "url": "https://github.com/symfony/dotenv.git", 3299 | "reference": "963fc7f36f81315e31831d6cd96c9578ec184059" 3300 | }, 3301 | "dist": { 3302 | "type": "zip", 3303 | "url": "https://api.github.com/repos/symfony/dotenv/zipball/963fc7f36f81315e31831d6cd96c9578ec184059", 3304 | "reference": "963fc7f36f81315e31831d6cd96c9578ec184059", 3305 | "shasum": "" 3306 | }, 3307 | "require": { 3308 | "php": "^7.1.3" 3309 | }, 3310 | "require-dev": { 3311 | "symfony/process": "~3.4|~4.0" 3312 | }, 3313 | "type": "library", 3314 | "extra": { 3315 | "branch-alias": { 3316 | "dev-master": "4.1-dev" 3317 | } 3318 | }, 3319 | "autoload": { 3320 | "psr-4": { 3321 | "Symfony\\Component\\Dotenv\\": "" 3322 | }, 3323 | "exclude-from-classmap": [ 3324 | "/Tests/" 3325 | ] 3326 | }, 3327 | "notification-url": "https://packagist.org/downloads/", 3328 | "license": [ 3329 | "MIT" 3330 | ], 3331 | "authors": [ 3332 | { 3333 | "name": "Fabien Potencier", 3334 | "email": "fabien@symfony.com" 3335 | }, 3336 | { 3337 | "name": "Symfony Community", 3338 | "homepage": "https://symfony.com/contributors" 3339 | } 3340 | ], 3341 | "description": "Registers environment variables from a .env file", 3342 | "homepage": "https://symfony.com", 3343 | "keywords": [ 3344 | "dotenv", 3345 | "env", 3346 | "environment" 3347 | ], 3348 | "time": "2018-11-26T10:26:29+00:00" 3349 | } 3350 | ], 3351 | "aliases": [ 3352 | { 3353 | "alias": "1.0.x-dev", 3354 | "alias_normalized": "1.0.9999999.9999999-dev", 3355 | "version": "9999999-dev", 3356 | "package": "php-pm/php-pm" 3357 | } 3358 | ], 3359 | "minimum-stability": "stable", 3360 | "stability-flags": { 3361 | "php-pm/php-pm": 20 3362 | }, 3363 | "prefer-stable": false, 3364 | "prefer-lowest": false, 3365 | "platform": { 3366 | "php": "^7.1.3", 3367 | "ext-ctype": "*", 3368 | "ext-iconv": "*" 3369 | }, 3370 | "platform-dev": [] 3371 | } 3372 | -------------------------------------------------------------------------------- /config/bootstrap.php: -------------------------------------------------------------------------------- 1 | loadEnv($path); 21 | } else { 22 | // fallback code in case your Dotenv component is not 4.2 or higher (when loadEnv() was added) 23 | 24 | if (file_exists($path) || !file_exists($p = "$path.dist")) { 25 | $dotenv->load($path); 26 | } else { 27 | $dotenv->load($p); 28 | } 29 | 30 | if (null === $env = $_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) { 31 | $dotenv->populate(array('APP_ENV' => $env = 'dev')); 32 | } 33 | 34 | if ('test' !== $env && file_exists($p = "$path.local")) { 35 | $dotenv->load($p); 36 | $env = $_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? $env; 37 | } 38 | 39 | if (file_exists($p = "$path.$env")) { 40 | $dotenv->load($p); 41 | } 42 | 43 | if (file_exists($p = "$path.$env.local")) { 44 | $dotenv->load($p); 45 | } 46 | } 47 | } 48 | 49 | $_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $_SERVER['APP_ENV'] ?: $_ENV['APP_ENV'] ?: 'dev'; 50 | $_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; 51 | $_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; 52 | -------------------------------------------------------------------------------- /config/bundles.php: -------------------------------------------------------------------------------- 1 | ['all' => true], 5 | Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], 6 | Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], 7 | ]; 8 | -------------------------------------------------------------------------------- /config/packages/dev/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: stream 5 | path: "php://stderr" 6 | level: debug 7 | console: 8 | type: console -------------------------------------------------------------------------------- /config/packages/dev/routing.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | router: 3 | strict_requirements: true 4 | -------------------------------------------------------------------------------- /config/packages/framework.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | secret: '%env(APP_SECRET)%' 3 | #default_locale: en 4 | #csrf_protection: true 5 | #http_method_override: true 6 | 7 | # Enables session support. Note that the session will ONLY be started if you read or write from it. 8 | # Remove or comment this section to explicitly disable session support. 9 | session: 10 | handler_id: ~ 11 | 12 | #esi: true 13 | #fragments: true 14 | php_errors: 15 | log: true 16 | 17 | cache: 18 | # Put the unique name of your app here: the prefix seed 19 | # is used to compute stable namespaces for cache keys. 20 | #prefix_seed: your_vendor_name/app_name 21 | 22 | # The app cache caches to the filesystem by default. 23 | # Other options include: 24 | 25 | # Redis 26 | #app: cache.adapter.redis 27 | #default_redis_provider: redis://localhost 28 | 29 | # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) 30 | #app: cache.adapter.apcu 31 | -------------------------------------------------------------------------------- /config/packages/prod/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: stream 5 | path: "php://stderr" 6 | level: error 7 | console: 8 | type: console -------------------------------------------------------------------------------- /config/packages/routing.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | router: 3 | strict_requirements: ~ 4 | -------------------------------------------------------------------------------- /config/packages/sensio_framework_extra.yaml: -------------------------------------------------------------------------------- 1 | sensio_framework_extra: 2 | router: 3 | annotations: false 4 | -------------------------------------------------------------------------------- /config/packages/test/framework.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | test: true 3 | session: 4 | storage_id: session.storage.mock_file 5 | -------------------------------------------------------------------------------- /config/packages/test/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | type: stream 4 | path: "php://stderr" 5 | level: debug 6 | console: 7 | type: console -------------------------------------------------------------------------------- /config/packages/test/routing.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | router: 3 | strict_requirements: true 4 | -------------------------------------------------------------------------------- /config/routes.yaml: -------------------------------------------------------------------------------- 1 | #index: 2 | # path: / 3 | # controller: App\Controller\DefaultController::index 4 | -------------------------------------------------------------------------------- /config/routes/annotations.yaml: -------------------------------------------------------------------------------- 1 | controllers: 2 | resource: ../../src/Controller/ 3 | type: annotation 4 | -------------------------------------------------------------------------------- /config/services.yaml: -------------------------------------------------------------------------------- 1 | # This file is the entry point to configure your own services. 2 | # Files in the packages/ subdirectory configure your dependencies. 3 | 4 | # Put parameters here that don't need to change on each machine where the app is deployed 5 | # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration 6 | parameters: 7 | 8 | services: 9 | # default configuration for services in *this* file 10 | _defaults: 11 | autowire: true # Automatically injects dependencies in your services. 12 | autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. 13 | public: false # Allows optimizing the container by removing unused services; this also means 14 | # fetching services directly from the container via $container->get() won't work. 15 | # The best practice is to be explicit about your dependencies anyway. 16 | 17 | # makes classes in src/ available to be used as services 18 | # this creates a service per class whose id is the fully-qualified class name 19 | App\: 20 | resource: '../src/*' 21 | exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' 22 | 23 | # controllers are imported separately to make sure services can be injected 24 | # as action arguments even if you don't extend any base controller class 25 | App\Controller\: 26 | resource: '../src/Controller' 27 | tags: ['controller.service_arguments'] 28 | 29 | # add more service definitions when explicit configuration is needed 30 | # please note that last definitions always *replace* previous ones 31 | 32 | logger: 33 | alias: 'monolog.logger' 34 | public: true -------------------------------------------------------------------------------- /docker/nginx-unit/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | 5 | nginx: 6 | image: nginx:latest 7 | ports: 8 | - 8000:80 9 | volumes: 10 | - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro 11 | - ./nginx/docker.conf:/etc/nginx/conf.d/default.conf:ro 12 | depends_on: 13 | - unit 14 | - app 15 | ulimits: 16 | nproc: 819200 17 | nofile: 819200 18 | 19 | unit: 20 | image: mrsuh/php-load-test-nginx-unit:1.0.0 21 | expose: 22 | - 8300 23 | volumes: 24 | - app-volume:/app:cached 25 | 26 | app: 27 | image: mrsuh/php-load-test-app:1.0.0 28 | volumes: 29 | - app-volume:/app 30 | 31 | volumes: 32 | app-volume: -------------------------------------------------------------------------------- /docker/nginx-unit/nginx/docker.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | root /app/public; 4 | 5 | location / { 6 | proxy_pass http://unit:8300; 7 | } 8 | } -------------------------------------------------------------------------------- /docker/nginx-unit/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | worker_rlimit_nofile 819200; 4 | 5 | error_log /dev/stdout crit; 6 | pid /var/run/nginx.pid; 7 | 8 | events { 9 | worker_connections 65335; 10 | use epoll; 11 | multi_accept off; 12 | accept_mutex off; 13 | } 14 | 15 | http { 16 | include /etc/nginx/mime.types; 17 | default_type application/octet-stream; 18 | 19 | access_log off; 20 | 21 | sendfile on; 22 | tcp_nopush on; 23 | tcp_nodelay on; 24 | 25 | proxy_max_temp_file_size 0; 26 | proxy_connect_timeout 5s; 27 | 28 | gzip on; 29 | gzip_min_length 10240; 30 | gzip_types application/json; 31 | gzip_vary on; 32 | 33 | reset_timedout_connection on; 34 | 35 | client_body_timeout 5; 36 | send_timeout 2; 37 | keepalive_timeout 5; 38 | 39 | include /etc/nginx/conf.d/*.conf; 40 | } -------------------------------------------------------------------------------- /docker/nginx-unit/unit/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM centos:7 2 | 3 | RUN yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm 4 | 5 | RUN yum -y update 6 | RUN yum -y install net-tools 7 | 8 | RUN yum -y install unit php-unit php72-unit-php 9 | RUN yum -y install php72 \ 10 | php72-php-cli \ 11 | php72-php-xml \ 12 | php72-php-intl \ 13 | php72-php-iconv \ 14 | php72-php-zip \ 15 | php72-php-bcmath \ 16 | php72-php-mbstring \ 17 | php72-php-common \ 18 | php72-php-opcache 19 | 20 | COPY ./conf.json /var/lib/unit/ 21 | COPY ./php.ini /usr/local/etc/php/php.ini 22 | 23 | RUN mkdir /run/unit 24 | RUN touch /run/unit/unit.pid 25 | 26 | CMD ["/usr/sbin/unitd", "--no-daemon", "--control", "0.0.0.0:8080", "--log", "/var/log/unit/unit.log", "--state", "/var/lib/unit"] -------------------------------------------------------------------------------- /docker/nginx-unit/unit/conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "listeners": { 3 | "*:8300": { 4 | "application": "example_php" 5 | } 6 | }, 7 | "applications": { 8 | "example_php": { 9 | "type": "php", 10 | "processes": 2, 11 | "root": "/app/public", 12 | "index": "index.php", 13 | "script": "index.php", 14 | "environment": { 15 | "TIMEZONE": "Europe/Paris", 16 | "APP_ENV": "prod", 17 | "APP_TYPE": "nginx-unit" 18 | }, 19 | "options": { 20 | "file": "/usr/local/etc/php/php.ini" 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /docker/nginx-unit/unit/php.ini: -------------------------------------------------------------------------------- 1 | date.timezone = ${TIMEZONE} 2 | short_open_tag = Off 3 | log_errors = On 4 | error_reporting = E_ALL 5 | display_errors = Off 6 | error_log = /proc/self/fd/2 7 | memory_limit = 256M 8 | 9 | ; Optimizations for Symfony, as documented on http://symfony.com/doc/current/performance.html 10 | 11 | opcache.enable=1 12 | opcache.enable_cli=1 13 | ; maximum memory that OPcache can use to store compiled PHP files 14 | opcache.memory_consumption=256 15 | ; maximum number of files that can be stored in the cache 16 | opcache.max_accelerated_files=20000 17 | opcache.validate_timestamps=0 18 | ; maximum memory allocated to store the results 19 | realpath_cache_size=4096K 20 | ; save the results for 10 minutes (600 seconds) 21 | realpath_cache_ttl=600 22 | 23 | ; Nginx Unit 24 | variables_order=EGPCS -------------------------------------------------------------------------------- /docker/php-fpm/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | 5 | nginx: 6 | image: nginx:latest 7 | ports: 8 | - 8000:80 9 | volumes: 10 | - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro 11 | - ./nginx/docker.conf:/etc/nginx/conf.d/default.conf:ro 12 | - app-volume:/app:cached 13 | depends_on: 14 | - php 15 | - app 16 | ulimits: 17 | nproc: 819200 18 | nofile: 819200 19 | 20 | php: 21 | image: mrsuh/php-load-test-php-fpm:1.0.0 22 | hostname: php 23 | working_dir: /app 24 | expose: 25 | - 9000 26 | environment: 27 | TIMEZONE: Europe/Paris 28 | APP_ENV: prod 29 | APP_TYPE: php-fpm 30 | volumes: 31 | - app-volume:/app:cached 32 | 33 | app: 34 | image: mrsuh/php-load-test-app:1.0.0 35 | volumes: 36 | - app-volume:/app 37 | 38 | volumes: 39 | app-volume: -------------------------------------------------------------------------------- /docker/php-fpm/nginx/docker.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | root /app/public; 4 | 5 | location / { 6 | try_files $uri /index.php$is_args$args; 7 | } 8 | 9 | location ~ ^/index\.php(/|$) { 10 | fastcgi_pass php:9000; 11 | fastcgi_split_path_info ^(.+\.php)(/.*)$; 12 | include fastcgi_params; 13 | fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 14 | fastcgi_param DOCUMENT_ROOT $realpath_root; 15 | internal; 16 | } 17 | } -------------------------------------------------------------------------------- /docker/php-fpm/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | worker_rlimit_nofile 819200; 4 | 5 | error_log /dev/stdout crit; 6 | pid /var/run/nginx.pid; 7 | 8 | events { 9 | worker_connections 65335; 10 | use epoll; 11 | multi_accept off; 12 | accept_mutex off; 13 | } 14 | 15 | http { 16 | include /etc/nginx/mime.types; 17 | default_type application/octet-stream; 18 | 19 | access_log off; 20 | 21 | sendfile on; 22 | tcp_nopush on; 23 | tcp_nodelay on; 24 | 25 | proxy_max_temp_file_size 0; 26 | proxy_connect_timeout 5s; 27 | 28 | gzip on; 29 | gzip_min_length 10240; 30 | gzip_types application/json; 31 | gzip_vary on; 32 | 33 | reset_timedout_connection on; 34 | 35 | client_body_timeout 5; 36 | send_timeout 2; 37 | keepalive_timeout 5; 38 | 39 | include /etc/nginx/conf.d/*.conf; 40 | } -------------------------------------------------------------------------------- /docker/php-fpm/php-fpm/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:7.2-fpm 2 | 3 | RUN apt-get update && apt-get install -y \ 4 | libmcrypt-dev \ 5 | zlib1g-dev \ 6 | libicu-dev \ 7 | && docker-php-ext-install \ 8 | intl \ 9 | opcache \ 10 | pcntl \ 11 | iconv \ 12 | mbstring \ 13 | zip \ 14 | bcmath \ 15 | && docker-php-ext-enable \ 16 | intl \ 17 | opcache \ 18 | pcntl \ 19 | iconv \ 20 | mbstring \ 21 | zip \ 22 | bcmath 23 | 24 | RUN usermod -u 1000 www-data 25 | 26 | COPY ./php-fpm.conf /usr/local/etc/php-fpm.conf 27 | COPY ./php.ini /usr/local/etc/php/php.ini -------------------------------------------------------------------------------- /docker/php-fpm/php-fpm/php-fpm.conf: -------------------------------------------------------------------------------- 1 | [global] 2 | 3 | error_log = /proc/self/fd/2 4 | daemonize = no 5 | 6 | [www] 7 | 8 | access.log = /proc/self/fd/2 9 | 10 | user = www-data 11 | group = www-data 12 | 13 | listen = 0.0.0.0:9000 14 | 15 | pm = dynamic 16 | pm.max_children = 80 17 | 18 | clear_env = no 19 | 20 | catch_workers_output = yes -------------------------------------------------------------------------------- /docker/php-fpm/php-fpm/php.ini: -------------------------------------------------------------------------------- 1 | date.timezone = ${TIMEZONE} 2 | short_open_tag = Off 3 | log_errors = On 4 | error_reporting = E_ALL 5 | display_errors = Off 6 | error_log = /proc/self/fd/2 7 | memory_limit = 256M 8 | 9 | ; Optimizations for Symfony, as documented on http://symfony.com/doc/current/performance.html 10 | 11 | opcache.enable=1 12 | opcache.enable_cli=1 13 | ; maximum memory that OPcache can use to store compiled PHP files 14 | opcache.memory_consumption=256 15 | ; maximum number of files that can be stored in the cache 16 | opcache.max_accelerated_files=20000 17 | opcache.validate_timestamps=0 18 | ; maximum memory allocated to store the results 19 | realpath_cache_size=4096K 20 | ; save the results for 10 minutes (600 seconds) 21 | realpath_cache_ttl=600 -------------------------------------------------------------------------------- /docker/php-ppm/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | 5 | nginx: 6 | image: nginx:latest 7 | ports: 8 | - 8000:80 9 | volumes: 10 | - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro 11 | - ./nginx/docker.conf:/etc/nginx/conf.d/default.conf:ro 12 | - app-volume:/app:cached 13 | depends_on: 14 | - php 15 | - app 16 | ulimits: 17 | nproc: 819200 18 | nofile: 819200 19 | 20 | php: 21 | image: mrsuh/php-load-test-php-cli:1.0.0 22 | hostname: php 23 | working_dir: /app 24 | expose: 25 | - 9000 26 | environment: 27 | TIMEZONE: Europe/Paris 28 | APP_ENV: prod 29 | APP_TYPE: php-ppm 30 | volumes: 31 | - app-volume:/app:cached 32 | - ./php-cli/config.json:/app/config.json 33 | command: 34 | - /app/vendor/bin/ppm 35 | - start 36 | - --config=/app/config.json 37 | app: 38 | image: mrsuh/php-load-test-app:1.0.0 39 | volumes: 40 | - app-volume:/app 41 | 42 | volumes: 43 | app-volume: -------------------------------------------------------------------------------- /docker/php-ppm/nginx/docker.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | root /app/public; 4 | 5 | location / { 6 | proxy_pass http://php:9000; 7 | } 8 | } -------------------------------------------------------------------------------- /docker/php-ppm/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | worker_rlimit_nofile 819200; 4 | 5 | error_log /dev/stdout crit; 6 | pid /var/run/nginx.pid; 7 | 8 | events { 9 | worker_connections 65335; 10 | use epoll; 11 | multi_accept off; 12 | accept_mutex off; 13 | } 14 | 15 | http { 16 | include /etc/nginx/mime.types; 17 | default_type application/octet-stream; 18 | 19 | access_log off; 20 | 21 | sendfile on; 22 | tcp_nopush on; 23 | tcp_nodelay on; 24 | 25 | proxy_max_temp_file_size 0; 26 | proxy_connect_timeout 5s; 27 | 28 | gzip on; 29 | gzip_min_length 10240; 30 | gzip_types application/json; 31 | gzip_vary on; 32 | 33 | reset_timedout_connection on; 34 | 35 | client_body_timeout 5; 36 | send_timeout 2; 37 | keepalive_timeout 5; 38 | 39 | include /etc/nginx/conf.d/*.conf; 40 | } -------------------------------------------------------------------------------- /docker/php-ppm/php-cli/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:7.2-cli 2 | 3 | RUN apt-get update && apt-get install -y \ 4 | libmcrypt-dev \ 5 | zlib1g-dev \ 6 | libicu-dev \ 7 | && docker-php-ext-install \ 8 | intl \ 9 | opcache \ 10 | pcntl \ 11 | iconv \ 12 | mbstring \ 13 | zip \ 14 | bcmath \ 15 | posix \ 16 | && docker-php-ext-enable \ 17 | intl \ 18 | opcache \ 19 | pcntl \ 20 | iconv \ 21 | mbstring \ 22 | zip \ 23 | bcmath \ 24 | posix 25 | 26 | RUN usermod -u 1000 www-data 27 | 28 | COPY ./php.ini /usr/local/etc/php/php.ini -------------------------------------------------------------------------------- /docker/php-ppm/php-cli/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "bootstrap": "symfony", 3 | "app-env": "prod", 4 | "logging": 0, 5 | "debug": 0, 6 | "workers": 2, 7 | "max-requests": 5000, 8 | "max-execution-time": 5, 9 | "reload-timeout": 3, 10 | "host": "tcp://0.0.0.0", 11 | "port": 9000, 12 | "memory-limit": "256M" 13 | } -------------------------------------------------------------------------------- /docker/php-ppm/php-cli/php.ini: -------------------------------------------------------------------------------- 1 | date.timezone = ${TIMEZONE} 2 | short_open_tag = Off 3 | log_errors = On 4 | error_reporting = E_ALL 5 | display_errors = Off 6 | error_log = /proc/self/fd/2 7 | memory_limit = 256M 8 | 9 | ; Optimizations for Symfony, as documented on http://symfony.com/doc/current/performance.html 10 | 11 | opcache.enable=1 12 | opcache.enable_cli=1 13 | ; maximum memory that OPcache can use to store compiled PHP files 14 | opcache.memory_consumption=256 15 | ; maximum number of files that can be stored in the cache 16 | opcache.max_accelerated_files=20000 17 | opcache.validate_timestamps=0 18 | ; maximum memory allocated to store the results 19 | realpath_cache_size=4096K 20 | ; save the results for 10 minutes (600 seconds) 21 | realpath_cache_ttl=600 -------------------------------------------------------------------------------- /docker/react-php-reboot/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | 5 | nginx: 6 | image: nginx:latest 7 | ports: 8 | - 8000:80 9 | volumes: 10 | - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro 11 | - ./nginx/docker.conf:/etc/nginx/conf.d/default.conf:ro 12 | depends_on: 13 | - php 14 | - app 15 | ulimits: 16 | nproc: 819200 17 | nofile: 819200 18 | 19 | php: 20 | image: mrsuh/php-load-test-php-cli:1.0.0 21 | working_dir: /app 22 | environment: 23 | TIMEZONE: Europe/Paris 24 | APP_ENV: prod 25 | APP_TYPE: react-php-reboot 26 | volumes: 27 | - app-volume:/app:cached 28 | expose: 29 | - 9000 30 | command: 31 | - /app/bin/react-worker.php 32 | - --reboot-kernel-after-request 33 | 34 | app: 35 | image: mrsuh/php-load-test-app:1.0.0 36 | volumes: 37 | - app-volume:/app 38 | 39 | volumes: 40 | app-volume: -------------------------------------------------------------------------------- /docker/react-php-reboot/nginx/docker.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | root /app/public; 4 | 5 | resolver 127.0.0.11 valid=5s; 6 | set $upstream http://php:9000; 7 | location / { 8 | proxy_pass $upstream; 9 | } 10 | } -------------------------------------------------------------------------------- /docker/react-php-reboot/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | worker_rlimit_nofile 819200; 4 | 5 | error_log /dev/stdout crit; 6 | pid /var/run/nginx.pid; 7 | 8 | events { 9 | worker_connections 65335; 10 | use epoll; 11 | multi_accept off; 12 | accept_mutex off; 13 | } 14 | 15 | http { 16 | include /etc/nginx/mime.types; 17 | default_type application/octet-stream; 18 | 19 | access_log off; 20 | 21 | sendfile on; 22 | tcp_nopush on; 23 | tcp_nodelay on; 24 | 25 | proxy_max_temp_file_size 0; 26 | proxy_connect_timeout 5s; 27 | 28 | gzip on; 29 | gzip_min_length 10240; 30 | gzip_types application/json; 31 | gzip_vary on; 32 | 33 | reset_timedout_connection on; 34 | 35 | client_body_timeout 5; 36 | send_timeout 2; 37 | keepalive_timeout 5; 38 | 39 | include /etc/nginx/conf.d/*.conf; 40 | } -------------------------------------------------------------------------------- /docker/react-php-reboot/php-cli/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:7.2-cli 2 | 3 | RUN apt-get update && apt-get install -y \ 4 | libmcrypt-dev \ 5 | zlib1g-dev \ 6 | libicu-dev \ 7 | && docker-php-ext-install \ 8 | intl \ 9 | opcache \ 10 | pcntl \ 11 | iconv \ 12 | mbstring \ 13 | zip \ 14 | bcmath \ 15 | && docker-php-ext-enable \ 16 | intl \ 17 | opcache \ 18 | pcntl \ 19 | iconv \ 20 | mbstring \ 21 | zip \ 22 | bcmath 23 | 24 | RUN usermod -u 1000 www-data 25 | 26 | COPY ./php.ini /usr/local/etc/php/php.ini -------------------------------------------------------------------------------- /docker/react-php-reboot/php-cli/php.ini: -------------------------------------------------------------------------------- 1 | date.timezone = ${TIMEZONE} 2 | short_open_tag = Off 3 | log_errors = On 4 | error_reporting = E_ALL 5 | display_errors = Off 6 | error_log = /proc/self/fd/2 7 | memory_limit = 256M 8 | 9 | ; Optimizations for Symfony, as documented on http://symfony.com/doc/current/performance.html 10 | 11 | opcache.enable=1 12 | opcache.enable_cli=1 13 | ; maximum memory that OPcache can use to store compiled PHP files 14 | opcache.memory_consumption=256 15 | ; maximum number of files that can be stored in the cache 16 | opcache.max_accelerated_files=20000 17 | opcache.validate_timestamps=0 18 | ; maximum memory allocated to store the results 19 | realpath_cache_size=4096K 20 | ; save the results for 10 minutes (600 seconds) 21 | realpath_cache_ttl=600 -------------------------------------------------------------------------------- /docker/react-php/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | 5 | nginx: 6 | image: nginx:latest 7 | ports: 8 | - 8000:80 9 | volumes: 10 | - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro 11 | - ./nginx/docker.conf:/etc/nginx/conf.d/default.conf:ro 12 | depends_on: 13 | - php 14 | - app 15 | ulimits: 16 | nproc: 819200 17 | nofile: 819200 18 | 19 | php: 20 | image: mrsuh/php-load-test-php-cli:1.0.0 21 | working_dir: /app 22 | environment: 23 | TIMEZONE: Europe/Paris 24 | APP_ENV: prod 25 | APP_TYPE: react-php 26 | volumes: 27 | - app-volume:/app:cached 28 | expose: 29 | - 9000 30 | command: 31 | - /app/bin/react-worker.php 32 | 33 | app: 34 | image: mrsuh/php-load-test-app:1.0.0 35 | volumes: 36 | - app-volume:/app 37 | 38 | volumes: 39 | app-volume: -------------------------------------------------------------------------------- /docker/react-php/nginx/docker.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | root /app/public; 4 | 5 | resolver 127.0.0.11 valid=5s; 6 | set $upstream http://php:9000; 7 | location / { 8 | proxy_pass $upstream; 9 | } 10 | } -------------------------------------------------------------------------------- /docker/react-php/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | worker_rlimit_nofile 819200; 4 | 5 | error_log /dev/stdout crit; 6 | pid /var/run/nginx.pid; 7 | 8 | events { 9 | worker_connections 65335; 10 | use epoll; 11 | multi_accept off; 12 | accept_mutex off; 13 | } 14 | 15 | http { 16 | include /etc/nginx/mime.types; 17 | default_type application/octet-stream; 18 | 19 | access_log off; 20 | 21 | sendfile on; 22 | tcp_nopush on; 23 | tcp_nodelay on; 24 | 25 | proxy_max_temp_file_size 0; 26 | proxy_connect_timeout 5s; 27 | 28 | gzip on; 29 | gzip_min_length 10240; 30 | gzip_types application/json; 31 | gzip_vary on; 32 | 33 | reset_timedout_connection on; 34 | 35 | client_body_timeout 5; 36 | send_timeout 2; 37 | keepalive_timeout 5; 38 | 39 | include /etc/nginx/conf.d/*.conf; 40 | } -------------------------------------------------------------------------------- /docker/react-php/php-cli/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:7.2-cli 2 | 3 | RUN apt-get update && apt-get install -y \ 4 | libmcrypt-dev \ 5 | zlib1g-dev \ 6 | libicu-dev \ 7 | && docker-php-ext-install \ 8 | intl \ 9 | opcache \ 10 | pcntl \ 11 | iconv \ 12 | mbstring \ 13 | zip \ 14 | bcmath \ 15 | && docker-php-ext-enable \ 16 | intl \ 17 | opcache \ 18 | pcntl \ 19 | iconv \ 20 | mbstring \ 21 | zip \ 22 | bcmath 23 | 24 | RUN usermod -u 1000 www-data 25 | 26 | COPY ./php.ini /usr/local/etc/php/php.ini -------------------------------------------------------------------------------- /docker/react-php/php-cli/php.ini: -------------------------------------------------------------------------------- 1 | date.timezone = ${TIMEZONE} 2 | short_open_tag = Off 3 | log_errors = On 4 | error_reporting = E_ALL 5 | display_errors = Off 6 | error_log = /proc/self/fd/2 7 | memory_limit = 256M 8 | 9 | ; Optimizations for Symfony, as documented on http://symfony.com/doc/current/performance.html 10 | 11 | opcache.enable=1 12 | opcache.enable_cli=1 13 | ; maximum memory that OPcache can use to store compiled PHP files 14 | opcache.memory_consumption=256 15 | ; maximum number of files that can be stored in the cache 16 | opcache.max_accelerated_files=20000 17 | opcache.validate_timestamps=0 18 | ; maximum memory allocated to store the results 19 | realpath_cache_size=4096K 20 | ; save the results for 10 minutes (600 seconds) 21 | realpath_cache_ttl=600 -------------------------------------------------------------------------------- /docker/road-runner-reboot/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | 5 | nginx: 6 | image: nginx:latest 7 | ports: 8 | - 8000:80 9 | volumes: 10 | - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro 11 | - ./nginx/docker.conf:/etc/nginx/conf.d/default.conf:ro 12 | depends_on: 13 | - road-runner 14 | - app 15 | ulimits: 16 | nproc: 819200 17 | nofile: 819200 18 | 19 | road-runner: 20 | image: mrsuh/php-load-test-roadrunner:1.0.0 21 | working_dir: /roadrunner 22 | environment: 23 | APP_ENV: prod 24 | APP_TYPE: road-runner-reboot 25 | volumes: 26 | - app-volume:/app:cached 27 | expose: 28 | - 9000 29 | 30 | app: 31 | image: mrsuh/php-load-test-app:1.0.0 32 | volumes: 33 | - app-volume:/app 34 | 35 | volumes: 36 | app-volume: -------------------------------------------------------------------------------- /docker/road-runner-reboot/nginx/docker.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | root /app/public; 4 | 5 | location / { 6 | proxy_pass http://road-runner:9000; 7 | } 8 | } -------------------------------------------------------------------------------- /docker/road-runner-reboot/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | worker_rlimit_nofile 819200; 4 | 5 | error_log /dev/stdout crit; 6 | pid /var/run/nginx.pid; 7 | 8 | events { 9 | worker_connections 65335; 10 | use epoll; 11 | multi_accept off; 12 | accept_mutex off; 13 | } 14 | 15 | http { 16 | include /etc/nginx/mime.types; 17 | default_type application/octet-stream; 18 | 19 | access_log off; 20 | 21 | sendfile on; 22 | tcp_nopush on; 23 | tcp_nodelay on; 24 | 25 | proxy_max_temp_file_size 0; 26 | proxy_connect_timeout 5s; 27 | 28 | gzip on; 29 | gzip_min_length 10240; 30 | gzip_types application/json; 31 | gzip_vary on; 32 | 33 | reset_timedout_connection on; 34 | 35 | client_body_timeout 5; 36 | send_timeout 2; 37 | keepalive_timeout 5; 38 | 39 | include /etc/nginx/conf.d/*.conf; 40 | } -------------------------------------------------------------------------------- /docker/road-runner-reboot/road-runner/.rr.yaml: -------------------------------------------------------------------------------- 1 | http: 2 | address: 0.0.0.0:9000 3 | workers: 4 | command: "php /app/bin/road-runner-worker.php --reboot-kernel-after-request" 5 | relay: "unix:///tmp/road-runner.sock" 6 | pool: 7 | numWorkers: 2 8 | destroyTimeout: 3 -------------------------------------------------------------------------------- /docker/road-runner-reboot/road-runner/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.11 as build 2 | 3 | RUN apt-get update && apt-get install -y git 4 | RUN git clone https://github.com/spiral/roadrunner.git /roadrunner 5 | RUN cd /roadrunner && make 6 | 7 | FROM php:7.2-cli 8 | 9 | RUN apt-get update && apt-get install -y \ 10 | libmcrypt-dev \ 11 | zlib1g-dev \ 12 | libicu-dev \ 13 | && docker-php-ext-install \ 14 | intl \ 15 | opcache \ 16 | pcntl \ 17 | iconv \ 18 | mbstring \ 19 | zip \ 20 | bcmath \ 21 | sockets \ 22 | && docker-php-ext-enable \ 23 | intl \ 24 | opcache \ 25 | pcntl \ 26 | iconv \ 27 | mbstring \ 28 | zip \ 29 | bcmath \ 30 | sockets 31 | 32 | RUN usermod -u 1000 www-data 33 | 34 | COPY --from=build /roadrunner/rr /roadrunner/rr 35 | COPY ./php.ini /usr/local/etc/php/php.ini 36 | COPY ./.rr.yaml /roadrunner 37 | 38 | EXPOSE 9000 39 | 40 | CMD ["/roadrunner/rr", "serve"] 41 | 42 | 43 | -------------------------------------------------------------------------------- /docker/road-runner-reboot/road-runner/php.ini: -------------------------------------------------------------------------------- 1 | date.timezone = ${TIMEZONE} 2 | short_open_tag = Off 3 | log_errors = On 4 | error_reporting = E_ALL 5 | display_errors = stderr 6 | error_log = /proc/self/fd/2 7 | memory_limit = 256M 8 | 9 | ; Optimizations for Symfony, as documented on http://symfony.com/doc/current/performance.html 10 | 11 | opcache.enable=1 12 | opcache.enable_cli=1 13 | ; maximum memory that OPcache can use to store compiled PHP files 14 | opcache.memory_consumption=256 15 | ; maximum number of files that can be stored in the cache 16 | opcache.max_accelerated_files=20000 17 | opcache.validate_timestamps=0 18 | ; maximum memory allocated to store the results 19 | realpath_cache_size=4096K 20 | ; save the results for 10 minutes (600 seconds) 21 | realpath_cache_ttl=600 -------------------------------------------------------------------------------- /docker/road-runner/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | 5 | nginx: 6 | image: nginx:latest 7 | ports: 8 | - 8000:80 9 | volumes: 10 | - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro 11 | - ./nginx/docker.conf:/etc/nginx/conf.d/default.conf:ro 12 | depends_on: 13 | - road-runner 14 | - app 15 | ulimits: 16 | nproc: 819200 17 | nofile: 819200 18 | 19 | road-runner: 20 | image: mrsuh/php-load-test-roadrunner:1.0.0 21 | working_dir: /roadrunner 22 | environment: 23 | APP_ENV: prod 24 | APP_TYPE: road-runner 25 | volumes: 26 | - app-volume:/app:cached 27 | expose: 28 | - 9000 29 | 30 | app: 31 | image: mrsuh/php-load-test-app:1.0.0 32 | volumes: 33 | - app-volume:/app 34 | 35 | volumes: 36 | app-volume: -------------------------------------------------------------------------------- /docker/road-runner/nginx/docker.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80 default_server; 3 | root /app/public; 4 | 5 | location / { 6 | proxy_pass http://road-runner:9000; 7 | } 8 | } -------------------------------------------------------------------------------- /docker/road-runner/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes auto; 3 | worker_rlimit_nofile 819200; 4 | 5 | error_log /dev/stdout crit; 6 | pid /var/run/nginx.pid; 7 | 8 | events { 9 | worker_connections 65335; 10 | use epoll; 11 | multi_accept off; 12 | accept_mutex off; 13 | } 14 | 15 | http { 16 | include /etc/nginx/mime.types; 17 | default_type application/octet-stream; 18 | 19 | access_log off; 20 | 21 | sendfile on; 22 | tcp_nopush on; 23 | tcp_nodelay on; 24 | 25 | proxy_max_temp_file_size 0; 26 | proxy_connect_timeout 5s; 27 | 28 | gzip on; 29 | gzip_min_length 10240; 30 | gzip_types application/json; 31 | gzip_vary on; 32 | 33 | reset_timedout_connection on; 34 | 35 | client_body_timeout 5; 36 | send_timeout 2; 37 | keepalive_timeout 5; 38 | 39 | include /etc/nginx/conf.d/*.conf; 40 | } -------------------------------------------------------------------------------- /docker/road-runner/road-runner/.rr.yaml: -------------------------------------------------------------------------------- 1 | http: 2 | address: 0.0.0.0:9000 3 | workers: 4 | command: "php /app/bin/road-runner-worker.php" 5 | relay: "unix:///tmp/road-runner.sock" 6 | pool: 7 | numWorkers: 2 8 | destroyTimeout: 3 -------------------------------------------------------------------------------- /docker/road-runner/road-runner/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.11 as build 2 | 3 | RUN apt-get update && apt-get install -y git 4 | RUN git clone https://github.com/spiral/roadrunner.git /roadrunner 5 | RUN cd /roadrunner && make 6 | 7 | FROM php:7.2-cli 8 | 9 | RUN apt-get update && apt-get install -y \ 10 | libmcrypt-dev \ 11 | zlib1g-dev \ 12 | libicu-dev \ 13 | && docker-php-ext-install \ 14 | intl \ 15 | opcache \ 16 | pcntl \ 17 | iconv \ 18 | mbstring \ 19 | zip \ 20 | bcmath \ 21 | sockets \ 22 | && docker-php-ext-enable \ 23 | intl \ 24 | opcache \ 25 | pcntl \ 26 | iconv \ 27 | mbstring \ 28 | zip \ 29 | bcmath \ 30 | sockets 31 | 32 | RUN usermod -u 1000 www-data 33 | 34 | COPY --from=build /roadrunner/rr /roadrunner/rr 35 | COPY ./php.ini /usr/local/etc/php/php.ini 36 | COPY ./.rr.yaml /roadrunner 37 | 38 | EXPOSE 9000 39 | 40 | CMD ["/roadrunner/rr", "serve"] 41 | 42 | 43 | -------------------------------------------------------------------------------- /docker/road-runner/road-runner/php.ini: -------------------------------------------------------------------------------- 1 | date.timezone = ${TIMEZONE} 2 | short_open_tag = Off 3 | log_errors = On 4 | error_reporting = E_ALL 5 | display_errors = stderr 6 | error_log = /proc/self/fd/2 7 | memory_limit = 256M 8 | 9 | ; Optimizations for Symfony, as documented on http://symfony.com/doc/current/performance.html 10 | 11 | opcache.enable=1 12 | opcache.enable_cli=1 13 | ; maximum memory that OPcache can use to store compiled PHP files 14 | opcache.memory_consumption=256 15 | ; maximum number of files that can be stored in the cache 16 | opcache.max_accelerated_files=20000 17 | opcache.validate_timestamps=0 18 | ; maximum memory allocated to store the results 19 | realpath_cache_size=4096K 20 | ; save the results for 10 minutes (600 seconds) 21 | realpath_cache_ttl=600 -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | handle($request); 26 | $response->send(); 27 | $kernel->terminate($request, $response); 28 | -------------------------------------------------------------------------------- /src/Controller/DefaultController.php: -------------------------------------------------------------------------------- 1 | num) { 18 | $this->num = random_int(0, 100000); 19 | } 20 | 21 | return new JsonResponse([ 22 | 'random_num' => $this->num, 23 | 'env' => getenv('APP_ENV'), 24 | 'type' => getenv('APP_TYPE'), 25 | 'pid' => getmypid(), 26 | 'php' => [ 27 | 'version' => phpversion(), 28 | 'date.timezone' => ini_get('date.timezone'), 29 | 'short_open_tag' => ini_get('short_open_tag'), 30 | 'log_errors' => ini_get('log_errors'), 31 | 'error_reporting' => ini_get('error_reporting'), 32 | 'display_errors' => ini_get('display_errors'), 33 | 'error_log' => ini_get('error_log'), 34 | 'memory_limit' => ini_get('memory_limit'), 35 | 'opcache.enable' => ini_get('opcache.enable'), 36 | 'opcache.memory_consumption' => ini_get('opcache.memory_consumption'), 37 | 'opcache.max_accelerated_files' => ini_get('opcache.max_accelerated_files'), 38 | 'opcache.validate_timestamps' => ini_get('opcache.validate_timestamps'), 39 | 'realpath_cache_size' => ini_get('realpath_cache_size'), 40 | 'realpath_cache_ttl' => ini_get('realpath_cache_ttl') 41 | ] 42 | ]); 43 | } 44 | } -------------------------------------------------------------------------------- /src/Kernel.php: -------------------------------------------------------------------------------- 1 | environment === 'prod') { 21 | return '/dev/shm/symfony-app/cache/' . $this->environment; 22 | } else { 23 | return $this->getProjectDir() . '/var/cache/' . $this->environment; 24 | } 25 | } 26 | 27 | public function getLogDir() 28 | { 29 | return $this->getProjectDir().'/var/log'; 30 | } 31 | 32 | public function registerBundles() 33 | { 34 | $contents = require $this->getProjectDir().'/config/bundles.php'; 35 | foreach ($contents as $class => $envs) { 36 | if ($envs[$this->environment] ?? $envs['all'] ?? false) { 37 | yield new $class(); 38 | } 39 | } 40 | } 41 | 42 | protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader) 43 | { 44 | $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); 45 | // Feel free to remove the "container.autowiring.strict_mode" parameter 46 | // if you are using symfony/dependency-injection 4.0+ as it's the default behavior 47 | $container->setParameter('container.autowiring.strict_mode', true); 48 | $container->setParameter('container.dumper.inline_class_loader', true); 49 | $confDir = $this->getProjectDir().'/config'; 50 | 51 | $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob'); 52 | $loader->load($confDir.'/{packages}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob'); 53 | $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob'); 54 | $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); 55 | } 56 | 57 | protected function configureRoutes(RouteCollectionBuilder $routes) 58 | { 59 | $confDir = $this->getProjectDir().'/config'; 60 | 61 | $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob'); 62 | $routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob'); 63 | $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob'); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /symfony.lock: -------------------------------------------------------------------------------- 1 | { 2 | "doctrine/annotations": { 3 | "version": "1.0", 4 | "recipe": { 5 | "repo": "github.com/symfony/recipes", 6 | "branch": "master", 7 | "version": "1.0", 8 | "ref": "cb4152ebcadbe620ea2261da1a1c5a9b8cea7672" 9 | } 10 | }, 11 | "doctrine/cache": { 12 | "version": "v1.8.0" 13 | }, 14 | "doctrine/collections": { 15 | "version": "v1.5.0" 16 | }, 17 | "doctrine/common": { 18 | "version": "v2.10.0" 19 | }, 20 | "doctrine/event-manager": { 21 | "version": "v1.0.0" 22 | }, 23 | "doctrine/inflector": { 24 | "version": "v1.3.0" 25 | }, 26 | "doctrine/lexer": { 27 | "version": "v1.0.1" 28 | }, 29 | "doctrine/persistence": { 30 | "version": "v1.1.0" 31 | }, 32 | "doctrine/reflection": { 33 | "version": "v1.0.0" 34 | }, 35 | "evenement/evenement": { 36 | "version": "v3.0.1" 37 | }, 38 | "http-interop/http-factory-diactoros": { 39 | "version": "1.0.0" 40 | }, 41 | "http-interop/http-middleware": { 42 | "version": "0.5.0" 43 | }, 44 | "monolog/monolog": { 45 | "version": "1.24.0" 46 | }, 47 | "php-pm/httpkernel-adapter": { 48 | "version": "1.0.5" 49 | }, 50 | "php-pm/php-pm": { 51 | "version": "1.0.5" 52 | }, 53 | "psr/cache": { 54 | "version": "1.0.1" 55 | }, 56 | "psr/container": { 57 | "version": "1.0.0" 58 | }, 59 | "psr/http-factory": { 60 | "version": "1.0.0" 61 | }, 62 | "psr/http-message": { 63 | "version": "1.0.1" 64 | }, 65 | "psr/log": { 66 | "version": "1.0.2" 67 | }, 68 | "psr/simple-cache": { 69 | "version": "1.0.1" 70 | }, 71 | "react/cache": { 72 | "version": "v0.5.0" 73 | }, 74 | "react/child-process": { 75 | "version": "v0.5.2" 76 | }, 77 | "react/dns": { 78 | "version": "v0.4.15" 79 | }, 80 | "react/event-loop": { 81 | "version": "v1.0.0" 82 | }, 83 | "react/http": { 84 | "version": "v0.8.3" 85 | }, 86 | "react/promise": { 87 | "version": "v2.7.0" 88 | }, 89 | "react/promise-stream": { 90 | "version": "v1.1.1" 91 | }, 92 | "react/promise-timer": { 93 | "version": "v1.5.0" 94 | }, 95 | "react/socket": { 96 | "version": "v1.0.0" 97 | }, 98 | "react/stream": { 99 | "version": "v1.0.0" 100 | }, 101 | "ringcentral/psr7": { 102 | "version": "1.2.2" 103 | }, 104 | "sensio/framework-extra-bundle": { 105 | "version": "5.2", 106 | "recipe": { 107 | "repo": "github.com/symfony/recipes", 108 | "branch": "master", 109 | "version": "5.2", 110 | "ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b" 111 | } 112 | }, 113 | "spiral/goridge": { 114 | "version": "v2.1.2" 115 | }, 116 | "spiral/roadrunner": { 117 | "version": "v1.2.6" 118 | }, 119 | "symfony/cache": { 120 | "version": "v4.1.4" 121 | }, 122 | "symfony/config": { 123 | "version": "v4.1.4" 124 | }, 125 | "symfony/console": { 126 | "version": "3.3", 127 | "recipe": { 128 | "repo": "github.com/symfony/recipes", 129 | "branch": "master", 130 | "version": "3.3", 131 | "ref": "e3868d2f4a5104f19f844fe551099a00c6562527" 132 | } 133 | }, 134 | "symfony/contracts": { 135 | "version": "v1.0.1" 136 | }, 137 | "symfony/debug": { 138 | "version": "v4.1.4" 139 | }, 140 | "symfony/dependency-injection": { 141 | "version": "v4.1.4" 142 | }, 143 | "symfony/dotenv": { 144 | "version": "v4.1.4" 145 | }, 146 | "symfony/event-dispatcher": { 147 | "version": "v4.1.4" 148 | }, 149 | "symfony/filesystem": { 150 | "version": "v4.1.4" 151 | }, 152 | "symfony/finder": { 153 | "version": "v4.1.4" 154 | }, 155 | "symfony/flex": { 156 | "version": "1.0", 157 | "recipe": { 158 | "repo": "github.com/symfony/recipes", 159 | "branch": "master", 160 | "version": "1.0", 161 | "ref": "e921bdbfe20cdefa3b82f379d1cd36df1bc8d115" 162 | } 163 | }, 164 | "symfony/framework-bundle": { 165 | "version": "3.3", 166 | "recipe": { 167 | "repo": "github.com/symfony/recipes", 168 | "branch": "master", 169 | "version": "3.3", 170 | "ref": "1717e67afa995e4f01a25ba9ae7aca5b2327bcaa" 171 | } 172 | }, 173 | "symfony/http-foundation": { 174 | "version": "v4.1.4" 175 | }, 176 | "symfony/http-kernel": { 177 | "version": "v4.1.4" 178 | }, 179 | "symfony/monolog-bridge": { 180 | "version": "v4.2.0" 181 | }, 182 | "symfony/monolog-bundle": { 183 | "version": "3.1", 184 | "recipe": { 185 | "repo": "github.com/symfony/recipes", 186 | "branch": "master", 187 | "version": "3.1", 188 | "ref": "18ebf5a940573a20de06f9c4060101eeb438cf3d" 189 | } 190 | }, 191 | "symfony/polyfill-mbstring": { 192 | "version": "v1.9.0" 193 | }, 194 | "symfony/process": { 195 | "version": "v4.1.9" 196 | }, 197 | "symfony/psr-http-message-bridge": { 198 | "version": "v1.1.0" 199 | }, 200 | "symfony/routing": { 201 | "version": "4.0", 202 | "recipe": { 203 | "repo": "github.com/symfony/recipes", 204 | "branch": "master", 205 | "version": "4.0", 206 | "ref": "5f514d9d3b8a8aac3d62ae6a86b18b90ed0c7826" 207 | } 208 | }, 209 | "symfony/yaml": { 210 | "version": "v4.1.4" 211 | }, 212 | "zendframework/zend-diactoros": { 213 | "version": "1.8.6" 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /tests/charts/generate.php: -------------------------------------------------------------------------------- 1 | name; 15 | } 16 | 17 | /** 18 | * @param mixed $name 19 | * @return Chart 20 | */ 21 | public function setName($name) 22 | { 23 | $this->name = $name; 24 | 25 | return $this; 26 | } 27 | 28 | /** 29 | * @return mixed 30 | */ 31 | public function getColor() 32 | { 33 | return $this->color; 34 | } 35 | 36 | /** 37 | * @param mixed $color 38 | * @return Chart 39 | */ 40 | public function setColor($color) 41 | { 42 | $this->color = $color; 43 | 44 | return $this; 45 | } 46 | 47 | /** 48 | * @return mixed 49 | */ 50 | public function getData() 51 | { 52 | return $this->data; 53 | } 54 | 55 | /** 56 | * @param mixed $data 57 | * @return Chart 58 | */ 59 | public function setData($data) 60 | { 61 | $this->data = $data; 62 | 63 | return $this; 64 | } 65 | } 66 | 67 | class ChartBuilder 68 | { 69 | const TEMPLATE = " 70 | \n
71 | \n"; 74 | 75 | /** @var Chart[] */ 76 | private $id; 77 | private $charts; 78 | private $title; 79 | private $subtitle; 80 | private $xTitle; 81 | private $yTitle; 82 | 83 | public function __construct() 84 | { 85 | $this->id = uniqid('id-', true); 86 | $this->charts = []; 87 | } 88 | 89 | public function addChart(Chart $chart): void 90 | { 91 | $this->charts[] = $chart; 92 | } 93 | 94 | /** 95 | * @param mixed $title 96 | * @return ChartBuilder 97 | */ 98 | public function setTitle($title) 99 | { 100 | $this->title = $title; 101 | 102 | return $this; 103 | } 104 | 105 | /** 106 | * @param mixed $subtitle 107 | * @return ChartBuilder 108 | */ 109 | public function setSubtitle($subtitle) 110 | { 111 | $this->subtitle = $subtitle; 112 | 113 | return $this; 114 | } 115 | 116 | /** 117 | * @param mixed $xTitle 118 | * @return ChartBuilder 119 | */ 120 | public function setXTitle($xTitle) 121 | { 122 | $this->xTitle = $xTitle; 123 | 124 | return $this; 125 | } 126 | 127 | /** 128 | * @param mixed $yTitle 129 | * @return ChartBuilder 130 | */ 131 | public function setYTitle($yTitle) 132 | { 133 | $this->yTitle = $yTitle; 134 | 135 | return $this; 136 | } 137 | 138 | public function build(): string 139 | { 140 | $chart = [ 141 | 'chart' => ['type' => 'line'], 142 | 'title' => ['text' => $this->title], 143 | 'subtitle' => ['text' => $this->subtitle], 144 | 'yAxis' => ['title' => ['text' => $this->yTitle]], 145 | 'xAxis' => ['title' => ['text' => $this->xTitle], 'labels' => ['enabled' => false]], 146 | 'plotOptions' => ['line' => [ 147 | 'dataLabels' => ['enabled' => false], 148 | 'marker' => ['enabled' => false], 149 | 'enableMouseTracking' => true 150 | ]], 151 | 'series' => [] 152 | ]; 153 | 154 | foreach ($this->charts as $ch) { 155 | $chart['series'][] = [ 156 | 'name' => $ch->getName(), 157 | 'color' => $ch->getColor(), 158 | 'data' => $ch->getData(), 159 | ]; 160 | } 161 | 162 | return sprintf(self::TEMPLATE, $this->id, $this->id, json_encode($chart)); 163 | } 164 | } 165 | 166 | function parseMonitoringFile(string $filePath) 167 | { 168 | $fd = fopen($filePath, 'r'); 169 | $data = []; 170 | while (!feof($fd)) { 171 | $line = fgets($fd); 172 | 173 | if (empty($line)) { 174 | continue; 175 | } 176 | 177 | $log = parseMonitoringLine($line); 178 | 179 | if (empty($log)) { 180 | continue; 181 | } 182 | 183 | $timestamp = $log['timestamp']; 184 | if (!array_key_exists($timestamp, $data)) { 185 | $data[$timestamp] = []; 186 | } 187 | foreach ($log['data'] as $key => $d) { 188 | $data[$timestamp][] = $d['metrics']; 189 | } 190 | } 191 | 192 | fclose($fd); 193 | 194 | return $data; 195 | } 196 | 197 | function parseMonitoringLine(string $line): array 198 | { 199 | $parsed = json_decode($line, true); 200 | if (!is_array($parsed) || !isset($parsed[0])) { 201 | return []; 202 | } 203 | 204 | return $parsed[0]; 205 | } 206 | 207 | function parsePhantomFile(string $filePath) 208 | { 209 | $fd = fopen($filePath, 'r'); 210 | $data = []; 211 | while (!feof($fd)) { 212 | $line = fgets($fd); 213 | 214 | if (empty($line)) { 215 | continue; 216 | } 217 | 218 | $log = parsePhantomLine($line); 219 | 220 | if ($log['netCode'] !== 0 || $log['protoCode'] !== 200) { 221 | continue; 222 | } 223 | 224 | $requestTime = (int)$log['time']; 225 | if (!array_key_exists($requestTime, $data)) { 226 | $data[$requestTime] = []; 227 | } 228 | 229 | $data[$requestTime][] = $log['intervalReal'] / 1000; 230 | } 231 | 232 | fclose($fd); 233 | 234 | return $data; 235 | } 236 | 237 | function parsePhantomLine(string $line): array 238 | { 239 | $parsed = []; 240 | 241 | $line = preg_replace('/[\s\t]/', ' ', trim($line)); 242 | $explode = explode(' ', $line); 243 | 244 | if (count($explode) !== 12) { 245 | return []; 246 | } 247 | 248 | $parsed['time'] = (float)$explode[0]; 249 | $parsed['tag'] = $explode[1]; 250 | $parsed['intervalReal'] = (int)$explode[2]; 251 | $parsed['connectTime'] = (int)$explode[3]; 252 | $parsed['sendTime'] = (int)$explode[4]; 253 | $parsed['latency'] = (int)$explode[5]; 254 | $parsed['receiveTime'] = (int)$explode[6]; 255 | $parsed['intervalEvent'] = (int)$explode[7]; 256 | $parsed['sizeOut'] = (int)$explode[8]; 257 | $parsed['sizeIn'] = (int)$explode[9]; 258 | $parsed['netCode'] = (int)$explode[10]; 259 | $parsed['protoCode'] = (int)$explode[11]; 260 | 261 | return $parsed; 262 | } 263 | 264 | function getColorByName(string $name) 265 | { 266 | switch ($name) { 267 | case 'php-fpm': 268 | return 'blue'; 269 | case 'php-fpm-80': 270 | return 'navy'; 271 | case 'php-ppm': 272 | return 'red'; 273 | case 'nginx-unit': 274 | return 'green'; 275 | case 'road-runner': 276 | return 'purple'; 277 | case 'road-runner-reboot': 278 | return 'magenta'; 279 | case 'react-php': 280 | return 'yellow'; 281 | case 'react-php-reboot': 282 | return 'orange'; 283 | } 284 | 285 | return 'white'; 286 | } 287 | 288 | function normalizeData(array &$data) 289 | { 290 | array_shift($data); 291 | array_shift($data); 292 | } 293 | 294 | if (!isset($argv[1])) { 295 | exit(1); 296 | } 297 | 298 | $dir = $argv[1]; 299 | if (!is_dir($dir)) { 300 | exit(1); 301 | } 302 | 303 | $outFile = __DIR__ . '/chart.html'; 304 | if (isset($argv[2])) { 305 | $outFile = $argv[2]; 306 | } 307 | 308 | echo 'Input dir: ' . $dir . PHP_EOL; 309 | echo 'Output file: ' . $outFile . PHP_EOL; 310 | 311 | $phantom = []; 312 | $monitoring = []; 313 | foreach (scandir($dir) as $dirName) { 314 | 315 | $subDir = $dir . '/' . $dirName; 316 | if (!is_dir($subDir)) { 317 | continue; 318 | } 319 | 320 | foreach (scandir($subDir) as $fileName) { 321 | $filePath = $subDir . '/' . $fileName; 322 | 323 | if (!is_file($filePath)) { 324 | continue; 325 | } 326 | 327 | if (1 === preg_match('/^monitoring\.log$/', $fileName)) { 328 | echo 'Handling ' . $filePath . '...' . PHP_EOL; 329 | $monitoring[$dirName] = parseMonitoringFile($filePath); 330 | continue; 331 | } 332 | 333 | if (1 === preg_match('/^phout_.*\.log$/', $fileName)) { 334 | echo 'Handling ' . $filePath . '...' . PHP_EOL; 335 | $phantom[$dirName] = parsePhantomFile($filePath); 336 | continue; 337 | } 338 | } 339 | } 340 | 341 | file_put_contents($outFile, file_get_contents(__DIR__ . '/template.html')); 342 | 343 | $responseChart = new ChartBuilder(); 344 | $responseChart->setTitle('Response time'); 345 | $responseChart->setXTitle('Time'); 346 | $responseChart->setYTitle('Response (ms)'); 347 | foreach ($phantom as $dirName => $data) { 348 | $chartData = []; 349 | foreach ($data as $timestamp => $requestDurations) { 350 | $chartData[] = (int)(array_sum($requestDurations) / count($requestDurations)); 351 | } 352 | 353 | normalizeData($chartData); 354 | 355 | $responseChart->addChart( 356 | (new Chart()) 357 | ->setName($dirName) 358 | ->setColor(getColorByName($dirName)) 359 | ->setData($chartData) 360 | ); 361 | } 362 | file_put_contents($outFile, $responseChart->build(), FILE_APPEND); 363 | 364 | $cpuChart = new ChartBuilder(); 365 | $cpuChart->setTitle('CPU usage'); 366 | $cpuChart->setXTitle('Time'); 367 | $cpuChart->setYTitle('CPU (%)'); 368 | 369 | $memChart = new ChartBuilder(); 370 | $memChart->setTitle('Memory usage'); 371 | $memChart->setXTitle('Time'); 372 | $memChart->setYTitle('Memory (MB)'); 373 | 374 | foreach ($monitoring as $dirName => $data) { 375 | $cpu = []; 376 | $mem = []; 377 | foreach ($data as $timestamp => $d) { 378 | $cpuSum = 0; 379 | $memSum = 0; 380 | foreach ($d as $item) { 381 | $cpuSum += ($item['custom:cpu-cpu-total_usage_system'] + $item['custom:cpu-cpu-total_usage_user']); 382 | $memSum += $item['Memory_used'] / 1024 / 1024; 383 | } 384 | 385 | $count = count($d); 386 | $cpu[] = $cpuSum / $count; 387 | $mem[] = $memSum / $count; 388 | } 389 | 390 | normalizeData($cpu); 391 | $cpuChart->addChart( 392 | (new Chart()) 393 | ->setName($dirName) 394 | ->setColor(getColorByName($dirName)) 395 | ->setData($cpu) 396 | ); 397 | 398 | normalizeData($mem); 399 | $memChart->addChart( 400 | (new Chart()) 401 | ->setName($dirName) 402 | ->setColor(getColorByName($dirName)) 403 | ->setData($mem) 404 | ); 405 | } 406 | 407 | file_put_contents($outFile, $cpuChart->build(), FILE_APPEND); 408 | file_put_contents($outFile, $memChart->build(), FILE_APPEND); 409 | 410 | echo 'Done!' . PHP_EOL; 411 | 412 | -------------------------------------------------------------------------------- /tests/load.yaml.example: -------------------------------------------------------------------------------- 1 | phantom: 2 | address: $SERVER:$PORT 3 | uris: 4 | - / 5 | load_profile: 6 | load_type: rps 7 | schedule: line(1, 1000, 600s) 8 | console: 9 | enabled: true 10 | telegraf: 11 | config: 'monitoring.xml' 12 | enabled: true 13 | kill_old: false 14 | package: yandextank.plugins.Telegraf 15 | ssh_timeout: 30s 16 | overload: 17 | enabled: true 18 | package: yandextank.plugins.DataUploader 19 | token_file: 'overload_token.txt' 20 | -------------------------------------------------------------------------------- /tests/monitoring.xml.example: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | --------------------------------------------------------------------------------