Merge pull request #2005 from acelaya-forks/feature/remove-swoole

Drop support for openswoole
This commit is contained in:
Alejandro Celaya 2024-02-16 23:18:39 +01:00 committed by GitHub
commit 9296013596
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
34 changed files with 29 additions and 371 deletions

View file

@ -20,10 +20,8 @@ body:
options: options:
- Self-hosted Apache - Self-hosted Apache
- Self-hosted nginx - Self-hosted nginx
- Self-hosted openswoole
- Self-hosted RoadRunner - Self-hosted RoadRunner
- Openswoole Docker image - Docker image
- RoadRunner Docker image
- Other (explain in summary) - Other (explain in summary)
- type: dropdown - type: dropdown
validations: validations:

View file

@ -22,10 +22,8 @@ body:
options: options:
- Self-hosted Apache - Self-hosted Apache
- Self-hosted nginx - Self-hosted nginx
- Self-hosted openswoole
- Self-hosted RoadRunner - Self-hosted RoadRunner
- Openswoole Docker image - Docker image
- RoadRunner Docker image
- Other (explain in summary) - Other (explain in summary)
- type: dropdown - type: dropdown
validations: validations:

View file

@ -12,7 +12,6 @@ inputs:
php-extensions: php-extensions:
description: 'The PHP extensions to install' description: 'The PHP extensions to install'
required: false required: false
default: ''
extensions-cache-key: extensions-cache-key:
description: 'The key used to cache PHP extensions. If empty value is provided, extension caching is disabled' description: 'The key used to cache PHP extensions. If empty value is provided, extension caching is disabled'
required: true required: true
@ -21,6 +20,7 @@ runs:
using: composite using: composite
steps: steps:
- name: Setup cache environment - name: Setup cache environment
if: ${{ inputs.php-extensions }}
id: extcache id: extcache
uses: shivammathur/cache-extensions@v1 uses: shivammathur/cache-extensions@v1
with: with:
@ -28,7 +28,8 @@ runs:
extensions: ${{ inputs.php-extensions }} extensions: ${{ inputs.php-extensions }}
key: ${{ inputs.extensions-cache-key }} key: ${{ inputs.extensions-cache-key }}
- name: Cache extensions - name: Cache extensions
uses: actions/cache@v3 if: ${{ inputs.php-extensions }}
uses: actions/cache@v4
with: with:
path: ${{ steps.extcache.outputs.dir }} path: ${{ steps.extcache.outputs.dir }}
key: ${{ steps.extcache.outputs.key }} key: ${{ steps.extcache.outputs.key }}

View file

@ -27,7 +27,7 @@ jobs:
- uses: './.github/actions/ci-setup' - uses: './.github/actions/ci-setup'
with: with:
php-version: ${{ matrix.php-version }} php-version: ${{ matrix.php-version }}
php-extensions: openswoole-22.1.2, pdo_sqlsrv-5.12.0 php-extensions: pdo_sqlsrv-5.12.0
extensions-cache-key: db-tests-extensions-${{ matrix.php-version }}-${{ inputs.platform }} extensions-cache-key: db-tests-extensions-${{ matrix.php-version }}-${{ inputs.platform }}
- name: Create test database - name: Create test database
if: ${{ inputs.platform == 'ms' }} if: ${{ inputs.platform == 'ms' }}

View file

@ -19,7 +19,6 @@ jobs:
- uses: './.github/actions/ci-setup' - uses: './.github/actions/ci-setup'
with: with:
php-version: ${{ matrix.php-version }} php-version: ${{ matrix.php-version }}
php-extensions: openswoole-22.1.2
extensions-cache-key: mutation-tests-extensions-${{ matrix.php-version }}-${{ inputs.test-group }} extensions-cache-key: mutation-tests-extensions-${{ matrix.php-version }}-${{ inputs.test-group }}
- uses: actions/download-artifact@v4 - uses: actions/download-artifact@v4
with: with:

View file

@ -27,7 +27,6 @@ jobs:
- uses: './.github/actions/ci-setup' - uses: './.github/actions/ci-setup'
with: with:
php-version: ${{ matrix.php-version }} php-version: ${{ matrix.php-version }}
php-extensions: openswoole-22.1.2
extensions-cache-key: tests-extensions-${{ matrix.php-version }}-${{ inputs.test-group }} extensions-cache-key: tests-extensions-${{ matrix.php-version }}-${{ inputs.test-group }}
- name: Download RoadRunner binary - name: Download RoadRunner binary
if: ${{ inputs.test-group == 'api' }} if: ${{ inputs.test-group == 'api' }}

View file

@ -36,7 +36,6 @@ jobs:
- uses: './.github/actions/ci-setup' - uses: './.github/actions/ci-setup'
with: with:
php-version: ${{ matrix.php-version }} php-version: ${{ matrix.php-version }}
php-extensions: openswoole-22.1.2
extensions-cache-key: tests-extensions-${{ matrix.php-version }}-${{ matrix.command }} extensions-cache-key: tests-extensions-${{ matrix.php-version }}-${{ matrix.command }}
- run: composer ${{ matrix.command }} - run: composer ${{ matrix.command }}
@ -50,27 +49,11 @@ jobs:
with: with:
test-group: cli test-group: cli
roadrunner-api-tests: api-tests:
uses: './.github/workflows/ci-tests.yml' uses: './.github/workflows/ci-tests.yml'
with: with:
test-group: api test-group: api
openswoole-api-tests:
runs-on: ubuntu-22.04
strategy:
matrix:
php-version: ['8.2', '8.3']
steps:
- uses: actions/checkout@v4
- run: docker-compose -f docker-compose.yml -f docker-compose.ci.yml up -d shlink_db_postgres
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: openswoole-22.1.2
tools: composer
- run: composer install --no-interaction --prefer-dist
- run: composer test:api:openswoole
sqlite-db-tests: sqlite-db-tests:
uses: './.github/workflows/ci-db-tests.yml' uses: './.github/workflows/ci-db-tests.yml'
with: with:
@ -112,7 +95,7 @@ jobs:
api-mutation-tests: api-mutation-tests:
needs: needs:
- openswoole-api-tests - api-tests
uses: './.github/workflows/ci-mutation-tests.yml' uses: './.github/workflows/ci-mutation-tests.yml'
with: with:
test-group: api test-group: api
@ -127,7 +110,7 @@ jobs:
upload-coverage: upload-coverage:
needs: needs:
- unit-tests - unit-tests
- openswoole-api-tests - api-tests
- cli-tests - cli-tests
- sqlite-db-tests - sqlite-db-tests
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04

View file

@ -11,22 +11,17 @@ jobs:
strategy: strategy:
matrix: matrix:
php-version: ['8.2', '8.3'] php-version: ['8.2', '8.3']
swoole: ['yes', 'no']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: './.github/actions/ci-setup' - uses: './.github/actions/ci-setup'
with: with:
php-version: ${{ matrix.php-version }} php-version: ${{ matrix.php-version }}
php-extensions: openswoole-22.1.2
extensions-cache-key: publish-swagger-spec-extensions-${{ matrix.php-version }} extensions-cache-key: publish-swagger-spec-extensions-${{ matrix.php-version }}
install-deps: 'no' install-deps: 'no'
- if: ${{ matrix.swoole == 'yes' }} - run: ./build.sh ${GITHUB_REF#refs/tags/v}
run: ./build.sh ${GITHUB_REF#refs/tags/v}
- if: ${{ matrix.swoole == 'no' }}
run: ./build.sh ${GITHUB_REF#refs/tags/v} --no-swoole
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
with: with:
name: dist-files-${{ matrix.php-version }}-${{ matrix.swoole }} name: dist-files-${{ matrix.php-version }}
path: build path: build
publish: publish:

View file

@ -20,7 +20,6 @@ jobs:
- uses: './.github/actions/ci-setup' - uses: './.github/actions/ci-setup'
with: with:
php-version: ${{ matrix.php-version }} php-version: ${{ matrix.php-version }}
php-extensions: openswoole-22.1.2
extensions-cache-key: publish-swagger-spec-extensions-${{ matrix.php-version }} extensions-cache-key: publish-swagger-spec-extensions-${{ matrix.php-version }}
- run: composer swagger:inline - run: composer swagger:inline
- run: mkdir ${{ steps.determine_version.outputs.version }} - run: mkdir ${{ steps.determine_version.outputs.version }}

View file

@ -21,7 +21,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com), and this
* *Nothing* * *Nothing*
### Removed ### Removed
* *Nothing* * [#1908](https://github.com/shlinkio/shlink/issues/1908) Remove support for openswoole (and swoole).
### Fixed ### Fixed
* *Nothing* * *Nothing*

View file

@ -31,7 +31,7 @@ Then you will have to follow these steps:
* Run `./indocker bin/cli db:migrate` to get database migrations up to date. * Run `./indocker bin/cli db:migrate` to get database migrations up to date.
* Run `./indocker bin/cli api-key:generate` to get your first API key generated. * Run `./indocker bin/cli api-key:generate` to get your first API key generated.
Once you finish this, you will have the project exposed in ports `8800` through RoadRunner, `8080` through openswoole and `8000` through nginx+php-fpm. Once you finish this, you will have the project exposed in ports `8800` through RoadRunner and `8000` through nginx+php-fpm.
> Note: The `indocker` shell script is a helper tool used to run commands inside the main docker container. > Note: The `indocker` shell script is a helper tool used to run commands inside the main docker container.
@ -80,7 +80,7 @@ The purposes of every folder are:
* `data`: Common git-ignored assets, like logs, caches, lock files, GeoLite DB files, etc. It's the only location where Shlink may need to write at runtime. * `data`: Common git-ignored assets, like logs, caches, lock files, GeoLite DB files, etc. It's the only location where Shlink may need to write at runtime.
* `docs`: Any project documentation is stored here, like API spec definitions or architectural decision records. * `docs`: Any project documentation is stored here, like API spec definitions or architectural decision records.
* `module`: Contains a sub-folder for every module in the project. Modules contain the source code, tests and configurations for every context in the project. * `module`: Contains a sub-folder for every module in the project. Modules contain the source code, tests and configurations for every context in the project.
* `public`: Few assets (like `favicon.ico` or `robots.txt`) and the web entry point are stored here. This web entry point is not used when serving the app with RoadRunner or openswoole. * `public`: Few assets (like `favicon.ico` or `robots.txt`) and the web entry point are stored here. This web entry point is not used when serving the app with RoadRunner.
## Project tests ## Project tests
@ -96,7 +96,7 @@ In order to ensure stability and no regressions are introduced while developing
The project provides some tooling to run them against any of the supported database engines. The project provides some tooling to run them against any of the supported database engines.
* **API tests**: These are E2E tests that spin up an instance of the app with RoadRunner or openswoole, and test it from the outside by interacting with the REST API. * **API tests**: These are E2E tests that spin up an instance of the app with RoadRunner, and test it from the outside by interacting with the REST API.
These are the best tests to catch regressions, and to verify everything behaves as expected. These are the best tests to catch regressions, and to verify everything behaves as expected.

View file

@ -40,7 +40,7 @@ FROM base as builder
COPY . . COPY . .
COPY --from=composer:2 /usr/bin/composer ./composer.phar COPY --from=composer:2 /usr/bin/composer ./composer.phar
RUN apk add --no-cache git && \ RUN apk add --no-cache git && \
php composer.phar install --no-dev --prefer-dist --optimize-autoloader --no-progress --no-interaction --ignore-platform-req=ext-openswoole && \ php composer.phar install --no-dev --prefer-dist --optimize-autoloader --no-progress --no-interaction && \
php composer.phar clear-cache && \ php composer.phar clear-cache && \
rm -r docker composer.* && \ rm -r docker composer.* && \
sed -i "s/%SHLINK_VERSION%/${SHLINK_VERSION}/g" config/autoload/app_options.global.php sed -i "s/%SHLINK_VERSION%/${SHLINK_VERSION}/g" config/autoload/app_options.global.php

View file

@ -38,12 +38,11 @@ First, make sure the host where you are going to run shlink fulfills these requi
* PHP 8.2 or 8.3 * PHP 8.2 or 8.3
* The next PHP extensions: json, curl, pdo, intl, gd and gmp/bcmath. * The next PHP extensions: json, curl, pdo, intl, gd and gmp/bcmath.
* apcu extension is recommended if you don't plan to use openswoole. * apcu extension is recommended if you don't plan to use RoadRunner.
* xml extension is required if you want to generate QR codes in svg format. * xml extension is required if you want to generate QR codes in svg format.
* sockets and bcmath extensions are required if you want to integrate with a RabbitMQ instance. * sockets and bcmath extensions are required if you want to integrate with a RabbitMQ instance.
* MySQL, MariaDB, PostgreSQL, MicrosoftSQL or SQLite. * MySQL, MariaDB, PostgreSQL, MicrosoftSQL or SQLite.
* You will also need the corresponding pdo variation for the database you are planning to use: `pdo_mysql`, `pdo_pgsql`, `pdo_sqlsrv` or `pdo_sqlite`. * You will also need the corresponding pdo variation for the database you are planning to use: `pdo_mysql`, `pdo_pgsql`, `pdo_sqlsrv` or `pdo_sqlite`.
* The [openswoole](https://openswoole.com/) PHP extension (if you plan to serve Shlink with openswoole) or the web server of your choice with PHP integration (like Apache or Nginx).
### Download ### Download
@ -53,7 +52,7 @@ In order to run Shlink, you will need a built version of the project. There are
The easiest way to install shlink is by using one of the pre-bundled distributable packages. The easiest way to install shlink is by using one of the pre-bundled distributable packages.
Go to the [latest version](https://github.com/shlinkio/shlink/releases/latest) and download the `shlink*_dist.zip` file that suits your needs. You will find one for every supported PHP version and with/without openswoole integration. Go to the [latest version](https://github.com/shlinkio/shlink/releases/latest) and download the `shlink*_dist.zip` file that suits your needs. You will find one for every supported PHP version.
Finally, decompress the file in the location of your choice. Finally, decompress the file in the location of your choice.

View file

@ -2,7 +2,7 @@
export APP_ENV=test export APP_ENV=test
export TEST_ENV=api export TEST_ENV=api
export TEST_RUNTIME="${TEST_RUNTIME:-"rr"}" # Openswoole is deprecated. Remove in v4.0.0 export TEST_RUNTIME="${TEST_RUNTIME:-"rr"}" # rr is the only runtime currently supported
export DB_DRIVER="${DB_DRIVER:-"postgres"}" export DB_DRIVER="${DB_DRIVER:-"postgres"}"
export GENERATE_COVERAGE="${GENERATE_COVERAGE:-"no"}" export GENERATE_COVERAGE="${GENERATE_COVERAGE:-"no"}"
@ -13,11 +13,9 @@ mkdir data/log/api-tests
touch $OUTPUT_LOGS touch $OUTPUT_LOGS
# Try to stop server just in case it hanged in last execution # Try to stop server just in case it hanged in last execution
[ "$TEST_RUNTIME" = 'openswoole' ] && vendor/bin/laminas mezzio:swoole:stop
[ "$TEST_RUNTIME" = 'rr' ] && bin/rr stop -f [ "$TEST_RUNTIME" = 'rr' ] && bin/rr stop -f
echo 'Starting server...' echo 'Starting server...'
[ "$TEST_RUNTIME" = 'openswoole' ] && vendor/bin/laminas mezzio:swoole:start -d
[ "$TEST_RUNTIME" = 'rr' ] && bin/rr serve -p -c=config/roadrunner/.rr.test.yml -w . \ [ "$TEST_RUNTIME" = 'rr' ] && bin/rr serve -p -c=config/roadrunner/.rr.test.yml -w . \
-o=logs.output="${PWD}/${OUTPUT_LOGS}" \ -o=logs.output="${PWD}/${OUTPUT_LOGS}" \
-o=logs.channels.http.output="${PWD}/${OUTPUT_LOGS}" \ -o=logs.channels.http.output="${PWD}/${OUTPUT_LOGS}" \
@ -27,7 +25,6 @@ sleep 2 # Let's give the server a couple of seconds to start
vendor/bin/phpunit --order-by=random -c phpunit-api.xml --testdox --colors=always --log-junit=build/coverage-api/junit.xml $* vendor/bin/phpunit --order-by=random -c phpunit-api.xml --testdox --colors=always --log-junit=build/coverage-api/junit.xml $*
TESTS_EXIT_CODE=$? TESTS_EXIT_CODE=$?
[ "$TEST_RUNTIME" = 'openswoole' ] && vendor/bin/laminas mezzio:swoole:stop
[ "$TEST_RUNTIME" = 'rr' ] && bin/rr stop -c config/roadrunner/.rr.dev.yml -o=http.address=0.0.0.0:9999 [ "$TEST_RUNTIME" = 'rr' ] && bin/rr stop -c config/roadrunner/.rr.dev.yml -o=http.address=0.0.0.0:9999
# Exit this script with the same code as the tests. If tests failed, this script has to fail # Exit this script with the same code as the tests. If tests failed, this script has to fail

View file

@ -37,17 +37,16 @@
"mezzio/mezzio": "^3.17", "mezzio/mezzio": "^3.17",
"mezzio/mezzio-fastroute": "^3.11", "mezzio/mezzio-fastroute": "^3.11",
"mezzio/mezzio-problem-details": "^1.13", "mezzio/mezzio-problem-details": "^1.13",
"mezzio/mezzio-swoole": "^4.8",
"mlocati/ip-lib": "^1.18", "mlocati/ip-lib": "^1.18",
"mobiledetect/mobiledetectlib": "^4.8", "mobiledetect/mobiledetectlib": "^4.8",
"pagerfanta/core": "^3.8", "pagerfanta/core": "^3.8",
"pugx/shortid-php": "^1.1", "pugx/shortid-php": "^1.1",
"ramsey/uuid": "^4.7", "ramsey/uuid": "^4.7",
"shlinkio/shlink-common": "dev-main#3f6b243 as 6.0", "shlinkio/shlink-common": "dev-main#2323ff3 as 6.0",
"shlinkio/shlink-config": "^2.5", "shlinkio/shlink-config": "dev-main#6b287b3 as 2.6",
"shlinkio/shlink-event-dispatcher": "^3.1", "shlinkio/shlink-event-dispatcher": "^3.1",
"shlinkio/shlink-importer": "^5.2.1", "shlinkio/shlink-importer": "^5.2.1",
"shlinkio/shlink-installer": "dev-develop#9f0d7e5 as 9.0", "shlinkio/shlink-installer": "dev-develop#2dee7db as 9.0",
"shlinkio/shlink-ip-geolocation": "^3.4", "shlinkio/shlink-ip-geolocation": "^3.4",
"shlinkio/shlink-json": "^1.1", "shlinkio/shlink-json": "^1.1",
"spiral/roadrunner": "^2023.3", "spiral/roadrunner": "^2023.3",
@ -64,7 +63,6 @@
"devizzent/cebe-php-openapi": "^1.0.1", "devizzent/cebe-php-openapi": "^1.0.1",
"devster/ubench": "^2.1", "devster/ubench": "^2.1",
"infection/infection": "^0.27", "infection/infection": "^0.27",
"openswoole/ide-helper": "~22.0.0",
"phpstan/phpstan": "^1.10", "phpstan/phpstan": "^1.10",
"phpstan/phpstan-doctrine": "^1.3", "phpstan/phpstan-doctrine": "^1.3",
"phpstan/phpstan-phpunit": "^1.3", "phpstan/phpstan-phpunit": "^1.3",
@ -130,7 +128,6 @@
"test:db:postgres": "DB_DRIVER=postgres composer test:db:sqlite", "test:db:postgres": "DB_DRIVER=postgres composer test:db:sqlite",
"test:db:ms": "DB_DRIVER=mssql composer test:db:sqlite", "test:db:ms": "DB_DRIVER=mssql composer test:db:sqlite",
"test:api": "bin/test/run-api-tests.sh", "test:api": "bin/test/run-api-tests.sh",
"test:api:openswoole": "TEST_RUNTIME=openswoole bin/test/run-api-tests.sh",
"test:api:ci": "GENERATE_COVERAGE=yes composer test:api", "test:api:ci": "GENERATE_COVERAGE=yes composer test:api",
"test:api:pretty": "GENERATE_COVERAGE=pretty composer test:api", "test:api:pretty": "GENERATE_COVERAGE=pretty composer test:api",
"test:cli": "APP_ENV=test DB_DRIVER=maria TEST_ENV=cli php vendor/bin/phpunit --order-by=random --colors=always --testdox -c phpunit-cli.xml --log-junit=build/coverage-cli/junit.xml", "test:cli": "APP_ENV=test DB_DRIVER=maria TEST_ENV=cli php vendor/bin/phpunit --order-by=random --colors=always --testdox -c phpunit-cli.xml --log-junit=build/coverage-cli/junit.xml",

View file

@ -8,7 +8,7 @@ return [
'debug' => false, 'debug' => false,
// Disabling config cache for cli, ensures it's never used for openswoole/RoadRunner, and also that console // Disabling config cache for cli, ensures it's never used for RoadRunner, and also that console
// commands don't generate a cache file that's then used by php-fpm web executions // commands don't generate a cache file that's then used by php-fpm web executions
ConfigAggregator::ENABLE_CACHE => PHP_SAPI !== 'cli', ConfigAggregator::ENABLE_CACHE => PHP_SAPI !== 'cli',

View file

@ -53,16 +53,5 @@ return (static function (): array {
], ],
], ],
// Deprecated. Remove in Shlink 4.0.0
'mezzio-swoole' => [
'swoole-http-server' => [
'logger' => [
// Let's disable mezio-swoole access logging, so that we can provide our own implementation,
// consistent for roadrunner and openswoole
'logger-name' => NullLogger::class,
],
],
],
]; ];
})(); })();

View file

@ -11,7 +11,7 @@ return [
'base_path' => EnvVars::BASE_PATH->loadFromEnv(''), 'base_path' => EnvVars::BASE_PATH->loadFromEnv(''),
'fastroute' => [ 'fastroute' => [
// Disabling config cache for cli, ensures it's never used for openswoole/RoadRunner, and also that console // Disabling config cache for cli, ensures it's never used for RoadRunner, and also that console
// commands don't generate a cache file that's then used by php-fpm web executions // commands don't generate a cache file that's then used by php-fpm web executions
FastRouteRouter::CONFIG_CACHE_ENABLED => PHP_SAPI !== 'cli', FastRouteRouter::CONFIG_CACHE_ENABLED => PHP_SAPI !== 'cli',
FastRouteRouter::CONFIG_CACHE_FILE => 'data/cache/fastroute_cached_routes.php', FastRouteRouter::CONFIG_CACHE_FILE => 'data/cache/fastroute_cached_routes.php',

View file

@ -1,34 +0,0 @@
<?php
declare(strict_types=1);
use Shlinkio\Shlink\Core\Config\EnvVars;
use function Shlinkio\Shlink\Config\getOpenswooleConfigFromEnv;
use const Shlinkio\Shlink\MIN_TASK_WORKERS;
return (static function (): array {
$taskWorkers = (int) EnvVars::TASK_WORKER_NUM->loadFromEnv(16);
return [
'mezzio-swoole' => [
// Setting this to true can have unexpected behaviors when running several concurrent slow DB queries
'enable_coroutine' => false,
'swoole-http-server' => [
'host' => '0.0.0.0',
'port' => (int) EnvVars::PORT->loadFromEnv(8080),
'process-name' => 'shlink',
'options' => [
...getOpenswooleConfigFromEnv(),
'worker_num' => (int) EnvVars::WEB_WORKER_NUM->loadFromEnv(16),
'task_worker_num' => max($taskWorkers, MIN_TASK_WORKERS),
],
],
],
];
})();

View file

@ -1,13 +0,0 @@
<?php
declare(strict_types=1);
return [
'mezzio-swoole' => [
'hot-code-reload' => [
'enable' => true,
],
],
];

View file

@ -2,7 +2,6 @@
declare(strict_types=1); declare(strict_types=1);
use function Shlinkio\Shlink\Config\runningInOpenswoole;
use function Shlinkio\Shlink\Config\runningInRoadRunner; use function Shlinkio\Shlink\Config\runningInRoadRunner;
return [ return [
@ -12,7 +11,6 @@ return [
'schema' => 'http', 'schema' => 'http',
'hostname' => sprintf('localhost:%s', match (true) { 'hostname' => sprintf('localhost:%s', match (true) {
runningInRoadRunner() => '8800', runningInRoadRunner() => '8800',
runningInOpenswoole() => '8080',
default => '8000', default => '8000',
}), }),
], ],

View file

@ -8,19 +8,12 @@ use Laminas\ConfigAggregator;
use Laminas\Diactoros; use Laminas\Diactoros;
use Mezzio; use Mezzio;
use Mezzio\ProblemDetails; use Mezzio\ProblemDetails;
use Mezzio\Swoole;
use Shlinkio\Shlink\Config\ConfigAggregator\EnvVarLoaderProvider; use Shlinkio\Shlink\Config\ConfigAggregator\EnvVarLoaderProvider;
use function class_exists;
use function Shlinkio\Shlink\Config\env; use function Shlinkio\Shlink\Config\env;
use function Shlinkio\Shlink\Config\openswooleIsInstalled;
use function Shlinkio\Shlink\Config\runningInRoadRunner;
use function Shlinkio\Shlink\Core\enumValues; use function Shlinkio\Shlink\Core\enumValues;
use const PHP_SAPI;
$isTestEnv = env('APP_ENV') === 'test'; $isTestEnv = env('APP_ENV') === 'test';
$enableSwoole = PHP_SAPI === 'cli' && openswooleIsInstalled() && ! runningInRoadRunner();
return (new ConfigAggregator\ConfigAggregator( return (new ConfigAggregator\ConfigAggregator(
providers: [ providers: [
@ -30,9 +23,6 @@ return (new ConfigAggregator\ConfigAggregator(
Mezzio\ConfigProvider::class, Mezzio\ConfigProvider::class,
Mezzio\Router\ConfigProvider::class, Mezzio\Router\ConfigProvider::class,
Mezzio\Router\FastRouteRouter\ConfigProvider::class, Mezzio\Router\FastRouteRouter\ConfigProvider::class,
$enableSwoole && class_exists(Swoole\ConfigProvider::class)
? Swoole\ConfigProvider::class
: new ConfigAggregator\ArrayProvider([]),
ProblemDetails\ConfigProvider::class, ProblemDetails\ConfigProvider::class,
Diactoros\ConfigProvider::class, Diactoros\ConfigProvider::class,
Common\ConfigProvider::class, Common\ConfigProvider::class,

View file

@ -12,17 +12,6 @@ chdir(dirname(__DIR__));
require 'vendor/autoload.php'; require 'vendor/autoload.php';
// Workaround to make this compatible with both openswoole 22 and earlier versions.
// Openswoole support is deprecated. Remove in v4.0.0
if (! function_exists('swoole_set_process_name')) {
// phpcs:disable
function swoole_set_process_name(string $name): void
{
OpenSwoole\Util::setProcessName($name);
}
// phpcs:enable
}
// This is one of the first files loaded. Configure the timezone here // This is one of the first files loaded. Configure the timezone here
date_default_timezone_set(EnvVars::TIMEZONE->loadFromEnv(date_default_timezone_get())); date_default_timezone_set(EnvVars::TIMEZONE->loadFromEnv(date_default_timezone_get()));

View file

@ -32,7 +32,6 @@ use function Laminas\Stratigility\middleware;
use function Shlinkio\Shlink\Config\env; use function Shlinkio\Shlink\Config\env;
use function Shlinkio\Shlink\Core\ArrayUtils\contains; use function Shlinkio\Shlink\Core\ArrayUtils\contains;
use function sprintf; use function sprintf;
use function sys_get_temp_dir;
use const ShlinkioTest\Shlink\API_TESTS_HOST; use const ShlinkioTest\Shlink\API_TESTS_HOST;
use const ShlinkioTest\Shlink\API_TESTS_PORT; use const ShlinkioTest\Shlink\API_TESTS_PORT;
@ -136,20 +135,6 @@ return [
], ],
], ],
'mezzio-swoole' => [
'enable_coroutine' => false,
'swoole-http-server' => [
'host' => API_TESTS_HOST,
'port' => API_TESTS_PORT,
'process-name' => 'shlink_test',
'options' => [
'pid_file' => sys_get_temp_dir() . '/shlink-test-swoole.pid',
'log_file' => __DIR__ . '/../../data/log/api-tests/output.log',
'enable_coroutine' => false,
],
],
],
'routes' => !$isApiTest ? [] : [ 'routes' => !$isApiTest ? [] : [
[ [
'name' => 'dump_coverage', 'name' => 'dump_coverage',

View file

@ -1,13 +0,0 @@
/var/log/shlink/shlink_openswoole.log {
su root root
daily
missingok
rotate 120
compress
delaycompress
notifempty
create 0640 root root
postrotate
/etc/init.d/shlink_openswoole restart
endscript
}

View file

@ -1,54 +0,0 @@
#!/bin/bash
### BEGIN INIT INFO
# Provides: shlink_openswoole
# Required-Start: $local_fs $network $named $time $syslog
# Required-Stop: $local_fs $network $named $time $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Shlink non-blocking server with openswoole
### END INIT INFO
SCRIPT=/path/to/shlink/vendor/bin/laminas\ mezzio:swoole:start
RUNAS=root
PIDFILE=/var/run/shlink_openswoole.pid
LOGDIR=/var/log/shlink
LOGFILE=${LOGDIR}/shlink_openswoole.log
start() {
if [[ -f "$PIDFILE" ]] && kill -0 $(cat "$PIDFILE"); then
echo 'Shlink with openswoole already running' >&2
return 1
fi
echo 'Starting shlink with openswoole' >&2
mkdir -p "$LOGDIR"
touch "$LOGFILE"
local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!"
su -c "$CMD" $RUNAS > "$PIDFILE"
echo 'Shlink started' >&2
}
stop() {
if [[ ! -f "$PIDFILE" ]] || ! kill -0 $(cat "$PIDFILE"); then
echo 'Shlink with openswoole not running' >&2
return 1
fi
echo 'Stopping shlink with openswoole' >&2
kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"
echo 'Shlink stopped' >&2
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
esac

View file

@ -1,85 +0,0 @@
FROM php:8.3-alpine3.19
MAINTAINER Alejandro Celaya <alejandro@alejandrocelaya.com>
ENV APCU_VERSION 5.1.23
ENV INOTIFY_VERSION 3.0.0
ENV OPENSWOOLE_VERSION 22.1.2
ENV PDO_SQLSRV_VERSION 5.12.0
ENV MS_ODBC_DOWNLOAD 'b/9/f/b9f3cce4-3925-46d4-9f46-da08869c6486'
ENV MS_ODBC_SQL_VERSION 18_18.1.1.1
RUN apk update
# Install common php extensions
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install calendar
RUN apk add --no-cache oniguruma-dev
RUN docker-php-ext-install mbstring
RUN apk add --no-cache sqlite-libs
RUN apk add --no-cache sqlite-dev
RUN docker-php-ext-install pdo_sqlite
RUN apk add --no-cache icu-dev
RUN docker-php-ext-install intl
RUN apk add --no-cache libzip-dev zlib-dev
RUN docker-php-ext-install zip
RUN apk add --no-cache libpng-dev
RUN docker-php-ext-install gd
RUN apk add --no-cache postgresql-dev
RUN docker-php-ext-install pdo_pgsql
RUN apk add --no-cache --virtual .phpize-deps $PHPIZE_DEPS linux-headers && \
docker-php-ext-install sockets && \
apk del .phpize-deps
RUN docker-php-ext-install bcmath
# Install APCu extension
ADD https://pecl.php.net/get/apcu-$APCU_VERSION.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 \
&& docker-php-ext-configure apcu \
&& docker-php-ext-install apcu \
&& rm /tmp/apcu.tar.gz \
&& rm /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini \
&& echo extension=apcu.so > /usr/local/etc/php/conf.d/20-php-ext-apcu.ini
# Install inotify extension
ADD https://pecl.php.net/get/inotify-$INOTIFY_VERSION.tgz /tmp/inotify.tar.gz
RUN mkdir -p /usr/src/php/ext/inotify \
&& tar xf /tmp/inotify.tar.gz -C /usr/src/php/ext/inotify --strip-components=1 \
&& docker-php-ext-configure inotify \
&& docker-php-ext-install inotify \
&& rm /tmp/inotify.tar.gz
# Install openswoole, pcov and mssql driver
RUN wget https://download.microsoft.com/download/${MS_ODBC_DOWNLOAD}/msodbcsql${MS_ODBC_SQL_VERSION}-1_amd64.apk && \
apk add --allow-untrusted msodbcsql${MS_ODBC_SQL_VERSION}-1_amd64.apk && \
apk add --no-cache --virtual .phpize-deps $PHPIZE_DEPS unixodbc-dev && \
pecl install openswoole-${OPENSWOOLE_VERSION} pdo_sqlsrv-${PDO_SQLSRV_VERSION} pcov && \
docker-php-ext-enable openswoole pdo_sqlsrv pcov && \
apk del .phpize-deps && \
rm msodbcsql${MS_ODBC_SQL_VERSION}-1_amd64.apk
# Install composer
COPY --from=composer:2 /usr/bin/composer /usr/local/bin/composer
# Make home directory writable by anyone
RUN chmod 777 /home
VOLUME /home/shlink
WORKDIR /home/shlink
# Expose openswoole port
EXPOSE 8080
CMD \
# Install dependencies if the vendor dir does not exist
if [[ ! -d "./vendor" ]]; then /usr/local/bin/composer install ; fi && \
# When restarting the container, openswoole might think it is already in execution
# This forces the app to be started every second until the exit code is 0
until php ./vendor/bin/laminas mezzio:swoole:start; do sleep 1 ; done

View file

@ -1,14 +0,0 @@
server {
listen 80 default_server;
error_log /home/shlink/www/data/infra/nginx/swoole_proxy.error.log;
location / {
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://shlink_swoole:8080;
proxy_read_timeout 90s;
}
}

View file

@ -7,12 +7,6 @@ services:
- /etc/passwd:/etc/passwd:ro - /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro - /etc/group:/etc/group:ro
shlink_swoole:
user: 1000:1000
volumes:
- /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro
shlink_roadrunner: shlink_roadrunner:
user: 1000:1000 user: 1000:1000
volumes: volumes:

View file

@ -39,44 +39,6 @@ services:
extra_hosts: extra_hosts:
- 'host.docker.internal:host-gateway' - 'host.docker.internal:host-gateway'
shlink_swoole_proxy:
container_name: shlink_swoole_proxy
image: nginx:1.25-alpine
ports:
- "8002:80"
volumes:
- ./:/home/shlink/www
- ./data/infra/swoole_proxy_vhost.conf:/etc/nginx/conf.d/default.conf
links:
- shlink_swoole
shlink_swoole:
container_name: shlink_swoole
build:
context: .
dockerfile: ./data/infra/swoole.Dockerfile
ports:
- "8080:8080"
- "9001:9001"
volumes:
- ./:/home/shlink
- ./data/infra/php.ini:/usr/local/etc/php/php.ini
links:
- shlink_db_mysql
- shlink_db_postgres
- shlink_db_maria
- shlink_db_ms
- shlink_redis
- shlink_redis_acl
- shlink_mercure
- shlink_mercure_proxy
- shlink_rabbitmq
- shlink_matomo
environment:
LC_ALL: C
extra_hosts:
- 'host.docker.internal:host-gateway'
shlink_roadrunner: shlink_roadrunner:
container_name: shlink_roadrunner container_name: shlink_roadrunner
build: build:

View file

@ -5,7 +5,7 @@
This image provides an easy way to set up [shlink](https://shlink.io) on a container-based runtime. This image provides an easy way to set up [shlink](https://shlink.io) on a container-based runtime.
It exposes a shlink instance served with [RoadRunner](https://roadrunner.dev) or [openswoole](https://openswoole.com/), which can be linked to external databases to persist data. It exposes a shlink instance served with [RoadRunner](https://roadrunner.dev), which can be linked to external databases to persist data.
## Usage ## Usage

View file

@ -1,8 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Run docker containers if they are not up yet # Run docker containers if they are not up yet
if ! [[ $(docker ps | grep shlink_swoole) ]]; then if ! [[ $(docker ps | grep shlink_roadrunner) ]]; then
docker compose up -d docker compose up -d
fi fi
docker exec -it shlink_swoole /bin/sh -c "$*" docker exec -it shlink_roadrunner /bin/sh -c "$*"

View file

@ -20,7 +20,6 @@ use Shlinkio\Shlink\IpGeolocation\GeoLite2\DbUpdater;
use Shlinkio\Shlink\IpGeolocation\GeoLite2\GeoLite2Options; use Shlinkio\Shlink\IpGeolocation\GeoLite2\GeoLite2Options;
use Shlinkio\Shlink\IpGeolocation\Resolver\IpLocationResolverInterface; use Shlinkio\Shlink\IpGeolocation\Resolver\IpLocationResolverInterface;
use function Shlinkio\Shlink\Config\runningInOpenswoole;
use function Shlinkio\Shlink\Config\runningInRoadRunner; use function Shlinkio\Shlink\Config\runningInRoadRunner;
return (static function (): array { return (static function (): array {
@ -47,7 +46,7 @@ return (static function (): array {
]; ];
// Send visits to matomo asynchronously if the runtime allows it // Send visits to matomo asynchronously if the runtime allows it
if (runningInRoadRunner() || runningInOpenswoole()) { if (runningInRoadRunner()) {
$asyncEvents[EventDispatcher\Event\VisitLocated::class][] = EventDispatcher\Matomo\SendVisitToMatomo::class; $asyncEvents[EventDispatcher\Event\VisitLocated::class][] = EventDispatcher\Matomo\SendVisitToMatomo::class;
} else { } else {
$regularEvents[EventDispatcher\Event\VisitLocated::class] = [EventDispatcher\Matomo\SendVisitToMatomo::class]; $regularEvents[EventDispatcher\Event\VisitLocated::class] = [EventDispatcher\Matomo\SendVisitToMatomo::class];

View file

@ -57,7 +57,7 @@ class UrlShortener implements UrlShortenerInterface
$this->eventDispatcher->dispatch(new ShortUrlCreated($newShortUrl->getId())); $this->eventDispatcher->dispatch(new ShortUrlCreated($newShortUrl->getId()));
} catch (ContainerExceptionInterface $e) { } catch (ContainerExceptionInterface $e) {
// Ignore container errors when dispatching the event. // Ignore container errors when dispatching the event.
// When using openswoole, this event will try to enqueue a task, which cannot be done outside an HTTP // When using RoadRunner, this event will try to enqueue a task, which cannot be done outside an HTTP
// request. // request.
// If the short URL is created from CLI, the event dispatching will fail. // If the short URL is created from CLI, the event dispatching will fail.
return UrlShorteningResult::withErrorOnEventDispatching($newShortUrl, $e); return UrlShorteningResult::withErrorOnEventDispatching($newShortUrl, $e);