From 16590b2dbb11cf89567d12ab27242f537429df39 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 24 Nov 2018 08:43:48 +0100 Subject: [PATCH] Prepared project to support both swoole and regular app servers with fast cgi --- composer.json | 1 + config/autoload/swoole.global.php | 14 +++ config/config.php | 5 +- config/pipeline.php | 6 ++ config/routes.php | 6 ++ data/infra/swoole.Dockerfile | 95 +++++++++++++++++++ docker-compose.override.yml.dist | 6 ++ docker-compose.yml | 12 +++ indocker | 2 +- .../Common/src/Factory/TranslatorFactory.php | 2 +- 10 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 config/autoload/swoole.global.php create mode 100644 config/pipeline.php create mode 100644 config/routes.php create mode 100644 data/infra/swoole.Dockerfile diff --git a/composer.json b/composer.json index 3d325b03..8c79a730 100644 --- a/composer.json +++ b/composer.json @@ -42,6 +42,7 @@ "zendframework/zend-expressive-fastroute": "^3.0", "zendframework/zend-expressive-helpers": "^5.0", "zendframework/zend-expressive-platesrenderer": "^2.0", + "zendframework/zend-expressive-swoole": "^2.0", "zendframework/zend-i18n": "^2.7", "zendframework/zend-inputfilter": "^2.8", "zendframework/zend-paginator": "^2.6", diff --git a/config/autoload/swoole.global.php b/config/autoload/swoole.global.php new file mode 100644 index 00000000..ba60df5f --- /dev/null +++ b/config/autoload/swoole.global.php @@ -0,0 +1,14 @@ + [ + 'enable_coroutine' => true, + + 'swoole-http-server' => [ + 'host' => '0.0.0.0', + ], + ], + +]; diff --git a/config/config.php b/config/config.php index d9d9132e..e52065d1 100644 --- a/config/config.php +++ b/config/config.php @@ -6,7 +6,6 @@ namespace Shlinkio\Shlink; use Acelaya\ExpressiveErrorHandler; use Zend\ConfigAggregator; use Zend\Expressive; -use function class_exists; return (new ConfigAggregator\ConfigAggregator([ Expressive\ConfigProvider::class, @@ -14,9 +13,7 @@ return (new ConfigAggregator\ConfigAggregator([ Expressive\Router\FastRouteRouter\ConfigProvider::class, Expressive\Plates\ConfigProvider::class, Expressive\Helper\ConfigProvider::class, - class_exists(Expressive\Swoole\ConfigProvider::class) - ? Expressive\Swoole\ConfigProvider::class - : new ConfigAggregator\ArrayProvider([]), + Expressive\Swoole\ConfigProvider::class, ExpressiveErrorHandler\ConfigProvider::class, Common\ConfigProvider::class, Core\ConfigProvider::class, diff --git a/config/pipeline.php b/config/pipeline.php new file mode 100644 index 00000000..82d3aeea --- /dev/null +++ b/config/pipeline.php @@ -0,0 +1,6 @@ + + +RUN apk update + +# Install common php extensions +RUN docker-php-ext-install pdo_mysql +RUN docker-php-ext-install iconv +RUN docker-php-ext-install mbstring +RUN docker-php-ext-install calendar + +RUN apk add --no-cache --virtual sqlite-libs +RUN apk add --no-cache --virtual sqlite-dev +RUN docker-php-ext-install pdo_sqlite + +RUN apk add --no-cache --virtual icu-dev +RUN docker-php-ext-install intl + +RUN apk add --no-cache --virtual zlib-dev +RUN docker-php-ext-install zip + +RUN apk add --no-cache --virtual libmcrypt-dev +RUN docker-php-ext-install mcrypt + +RUN apk add --no-cache --virtual libpng-dev +RUN docker-php-ext-install gd + +# Install redis extension +ADD https://github.com/phpredis/phpredis/archive/3.1.4.tar.gz /tmp/phpredis.tar.gz +RUN mkdir -p /usr/src/php/ext/redis\ + && tar xf /tmp/phpredis.tar.gz -C /usr/src/php/ext/redis --strip-components=1 +# configure and install +RUN docker-php-ext-configure redis\ + && docker-php-ext-install redis +# cleanup +RUN rm /tmp/phpredis.tar.gz + +# Install memcached extension +RUN apk add --no-cache --virtual cyrus-sasl-dev +RUN apk add --no-cache --virtual libmemcached-dev +ADD https://github.com/php-memcached-dev/php-memcached/archive/php7.tar.gz /tmp/memcached.tar.gz +RUN mkdir -p /usr/src/php/ext/memcached\ + && tar xf /tmp/memcached.tar.gz -C /usr/src/php/ext/memcached --strip-components=1 +# configure and install +RUN docker-php-ext-configure memcached\ + && docker-php-ext-install memcached +# cleanup +RUN rm /tmp/memcached.tar.gz + +# Install APCu extension +ADD https://pecl.php.net/get/apcu-5.1.3.tgz /tmp/apcu.tar.gz +RUN mkdir -p /usr/src/php/ext/apcu\ + && tar xf /tmp/apcu.tar.gz -C /usr/src/php/ext/apcu --strip-components=1 +# configure and install +RUN docker-php-ext-configure apcu\ + && docker-php-ext-install apcu +# cleanup +RUN rm /tmp/apcu.tar.gz + +# Install APCu-BC extension +ADD https://pecl.php.net/get/apcu_bc-1.0.3.tgz /tmp/apcu_bc.tar.gz +RUN mkdir -p /usr/src/php/ext/apcu-bc\ + && tar xf /tmp/apcu_bc.tar.gz -C /usr/src/php/ext/apcu-bc --strip-components=1 +# configure and install +RUN docker-php-ext-configure apcu-bc\ + && docker-php-ext-install apcu-bc +# cleanup +RUN rm /tmp/apcu_bc.tar.gz + +# Load APCU.ini before APC.ini +RUN rm /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini +RUN echo extension=apcu.so > /usr/local/etc/php/conf.d/20-php-ext-apcu.ini + +# Install swoole +# First line fixes an error when installing pecl extensions. Found in https://github.com/docker-library/php/issues/233 +RUN apk add --no-cache --virtual .phpize-deps $PHPIZE_DEPS && \ + pecl install swoole && \ + docker-php-ext-enable swoole && \ + apk del .phpize-deps + +# Install composer +RUN php -r "readfile('https://getcomposer.org/installer');" | php +RUN chmod +x composer.phar +RUN mv composer.phar /usr/local/bin/composer + +# Make home directory writable by anyone +RUN chmod 777 /home + +VOLUME /home/shlink +WORKDIR /home/shlink + +# Expose swoole port +EXPOSE 8080 + +CMD /usr/local/bin/composer update && php ./vendor/bin/zend-expressive-swoole start diff --git a/docker-compose.override.yml.dist b/docker-compose.override.yml.dist index b347b9e8..6e40c113 100644 --- a/docker-compose.override.yml.dist +++ b/docker-compose.override.yml.dist @@ -6,3 +6,9 @@ services: volumes: - /etc/passwd:/etc/passwd:ro - /etc/group:/etc/group:ro + + shlink_swoole: + user: 1000:1000 + volumes: + - /etc/passwd:/etc/passwd:ro + - /etc/group:/etc/group:ro diff --git a/docker-compose.yml b/docker-compose.yml index 217ae629..3424d925 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,6 +26,18 @@ services: links: - shlink_db + shlink_swoole: + container_name: shlink_swoole + build: + context: . + dockerfile: ./data/infra/swoole.Dockerfile + ports: + - "8080:8080" + volumes: + - ./:/home/shlink + links: + - shlink_db + shlink_db: container_name: shlink_db build: diff --git a/indocker b/indocker index c4348e6c..77a06d33 100755 --- a/indocker +++ b/indocker @@ -1,2 +1,2 @@ #!/usr/bin/env bash -docker exec -it shlink_php /bin/sh -c "cd /home/shlink/www && $*" +docker exec -it shlink_swoole /bin/sh -c "$*" diff --git a/module/Common/src/Factory/TranslatorFactory.php b/module/Common/src/Factory/TranslatorFactory.php index a49e8116..50c939cc 100644 --- a/module/Common/src/Factory/TranslatorFactory.php +++ b/module/Common/src/Factory/TranslatorFactory.php @@ -27,6 +27,6 @@ class TranslatorFactory implements FactoryInterface public function __invoke(ContainerInterface $container, $requestedName, array $options = null) { $config = $container->get('config'); - return Translator::factory(isset($config['translator']) ? $config['translator'] : []); + return Translator::factory($config['translator'] ?? []); } }