Browse Source

[php:symfony] fix and add postgresql (#8324)

* [php:symfony] fix and add postgresql

* change database in benchmark_config

* fix missing env for franken

* fix swoole dockerfile

* fix workerman

* fix franken
fullbl 2 years ago
parent
commit
9fe104ca0c

+ 1 - 1
frameworks/PHP/symfony/README.md

@@ -1,6 +1,6 @@
 # Symfony 4 Benchmarking Test
 # Symfony 4 Benchmarking Test
 
 
-This is the Symfony 4 portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+This is the Symfony 6 portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
 
 
 
 
 ### Plaintext Test
 ### Plaintext Test

+ 33 - 9
frameworks/PHP/symfony/benchmark_config.json

@@ -2,6 +2,30 @@
   "framework": "symfony",
   "framework": "symfony",
   "tests": [{
   "tests": [{
     "default": {
     "default": {
+      "plaintext_url": "/plaintext",
+      "json_url": "/json",
+      "db_url": "/db",
+      "update_url": "/updates?queries=",
+      "query_url": "/queries?queries=",
+      "fortune_url": "/fortunes",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Fullstack",
+      "database": "Postgres",
+      "framework": "symfony",
+      "language": "PHP",
+      "flavor": "PHP8",
+      "orm": "Full",
+      "platform": "FPM/FastCGI",
+      "webserver": "nginx",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "symfony",
+      "notes": "",
+      "versus": "php",
+      "tags": []
+    },
+    "mysql": {
       "plaintext_url": "/plaintext",
       "plaintext_url": "/plaintext",
       "json_url": "/json",
       "json_url": "/json",
       "db_url": "/db",
       "db_url": "/db",
@@ -23,7 +47,7 @@
       "display_name": "symfony",
       "display_name": "symfony",
       "notes": "",
       "notes": "",
       "versus": "php",
       "versus": "php",
-      "tags": ["broken"]
+      "tags": []
     },
     },
     "raw": {
     "raw": {
       "db_url": "/raw/db",
       "db_url": "/raw/db",
@@ -32,7 +56,7 @@
       "port": 8080,
       "port": 8080,
       "approach": "Realistic",
       "approach": "Realistic",
       "classification": "Fullstack",
       "classification": "Fullstack",
-      "database": "MySQL",
+      "database": "Postgres",
       "framework": "symfony",
       "framework": "symfony",
       "language": "PHP",
       "language": "PHP",
       "flavor": "PHP8",
       "flavor": "PHP8",
@@ -44,7 +68,7 @@
       "display_name": "symfony-raw",
       "display_name": "symfony-raw",
       "notes": "",
       "notes": "",
       "versus": "php",
       "versus": "php",
-      "tags": ["broken"]
+      "tags": []
     },
     },
     "swoole": {
     "swoole": {
       "plaintext_url": "/plaintext",
       "plaintext_url": "/plaintext",
@@ -56,7 +80,7 @@
       "port": 8080,
       "port": 8080,
       "approach": "Realistic",
       "approach": "Realistic",
       "classification": "Fullstack",
       "classification": "Fullstack",
-      "database": "MySQL",
+      "database": "Postgres",
       "framework": "symfony",
       "framework": "symfony",
       "language": "PHP",
       "language": "PHP",
       "flavor": "None",
       "flavor": "None",
@@ -68,7 +92,7 @@
       "display_name": "symfony-swoole",
       "display_name": "symfony-swoole",
       "notes": "",
       "notes": "",
       "versus": "swoole",
       "versus": "swoole",
-      "tags": ["broken"]
+      "tags": []
     },
     },
     "workerman": {
     "workerman": {
       "plaintext_url": "/plaintext",
       "plaintext_url": "/plaintext",
@@ -80,7 +104,7 @@
       "port": 8080,
       "port": 8080,
       "approach": "Realistic",
       "approach": "Realistic",
       "classification": "Fullstack",
       "classification": "Fullstack",
-      "database": "MySQL",
+      "database": "Postgres",
       "framework": "symfony",
       "framework": "symfony",
       "language": "PHP",
       "language": "PHP",
       "flavor": "PHP8",
       "flavor": "PHP8",
@@ -92,7 +116,7 @@
       "display_name": "symfony-workerman",
       "display_name": "symfony-workerman",
       "notes": "",
       "notes": "",
       "versus": "php",
       "versus": "php",
-      "tags": ["broken"]
+      "tags": []
     },
     },
     "franken": {
     "franken": {
       "plaintext_url": "/plaintext",
       "plaintext_url": "/plaintext",
@@ -104,7 +128,7 @@
       "port": 8080,
       "port": 8080,
       "approach": "Realistic",
       "approach": "Realistic",
       "classification": "Fullstack",
       "classification": "Fullstack",
-      "database": "MySQL",
+      "database": "Postgres",
       "framework": "symfony",
       "framework": "symfony",
       "language": "PHP",
       "language": "PHP",
       "flavor": "PHP8",
       "flavor": "PHP8",
@@ -116,7 +140,7 @@
       "display_name": "symfony-frankenphp",
       "display_name": "symfony-frankenphp",
       "notes": "Use php 8.2",
       "notes": "Use php 8.2",
       "versus": "php",
       "versus": "php",
-      "tags": ["broken"]
+      "tags": []
     }
     }
   }]
   }]
 }
 }

+ 7 - 10
frameworks/PHP/symfony/composer.json

@@ -2,7 +2,7 @@
     "type": "project",
     "type": "project",
     "license": "proprietary",
     "license": "proprietary",
     "require": {
     "require": {
-        "php": ">=7.4",
+        "php": ">=8.1",
         "ext-ctype": "*",
         "ext-ctype": "*",
         "ext-iconv": "*",
         "ext-iconv": "*",
         "ext-mbstring": "*",
         "ext-mbstring": "*",
@@ -39,17 +39,13 @@
         }
         }
     },
     },
     "replace": {
     "replace": {
-        "doctrine/doctrine-migrations-bundle": "*",
-        "paragonie/random_compat": "2.*",
         "symfony/polyfill-ctype": "*",
         "symfony/polyfill-ctype": "*",
         "symfony/polyfill-iconv": "*",
         "symfony/polyfill-iconv": "*",
-        "symfony/polyfill-intl-idn": "*",
-        "symfony/polyfill-mbstring": "*",
-        "symfony/polyfill-php73": "*",
         "symfony/polyfill-php72": "*",
         "symfony/polyfill-php72": "*",
-        "symfony/polyfill-php71": "*",
-        "symfony/polyfill-php70": "*",
-        "symfony/polyfill-php56": "*"
+        "symfony/polyfill-php73": "*",
+        "symfony/polyfill-php74": "*",
+        "symfony/polyfill-php80": "*",
+        "symfony/polyfill-php81": "*"
     },
     },
     "scripts": {
     "scripts": {
         "auto-scripts": {
         "auto-scripts": {
@@ -69,7 +65,8 @@
     "extra": {
     "extra": {
         "symfony": {
         "symfony": {
             "allow-contrib": false,
             "allow-contrib": false,
-            "require": "5.1.*"
+            "require": "^6",
+            "docker": true
         }
         }
     }
     }
 }
 }

+ 0 - 1
frameworks/PHP/symfony/config/bundles.php

@@ -2,7 +2,6 @@
 
 
 return [
 return [
     Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
     Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
-    Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
     Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
     Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
     K911\Swoole\Bridge\Symfony\Bundle\SwooleBundle::class => ['swoole' => true],
     K911\Swoole\Bridge\Symfony\Bundle\SwooleBundle::class => ['swoole' => true],
 ];
 ];

+ 4 - 5
frameworks/PHP/symfony/config/packages/doctrine.yaml

@@ -1,11 +1,11 @@
 doctrine:
 doctrine:
     dbal:
     dbal:
         # configure these for your database server
         # configure these for your database server
-        driver: 'pdo_mysql'
-        server_version: '8.0'
-        charset: utf8mb4
+        driver: '%env(resolve:DATABASE_DRIVER)%'
+        server_version: '%env(resolve:DATABASE_VERSION)%'
+        charset: utf8
         default_table_options:
         default_table_options:
-            charset: utf8mb4
+            charset: utf8
             collate: utf8mb4_unicode_ci
             collate: utf8mb4_unicode_ci
         options:
         options:
             !php/const \PDO::ATTR_PERSISTENT: true
             !php/const \PDO::ATTR_PERSISTENT: true
@@ -17,7 +17,6 @@ doctrine:
         mappings:
         mappings:
             App:
             App:
                 is_bundle: false
                 is_bundle: false
-                type: annotation
                 dir: '%kernel.project_dir%/src/Entity'
                 dir: '%kernel.project_dir%/src/Entity'
                 prefix: 'App\Entity'
                 prefix: 'App\Entity'
                 alias: App
                 alias: App

+ 0 - 3
frameworks/PHP/symfony/config/packages/twig.yaml

@@ -1,3 +0,0 @@
-twig:
-    default_path: '%kernel.project_dir%/templates'
-    strict_variables: true

+ 1 - 1
frameworks/PHP/symfony/deploy/conf/php-fpm.conf

@@ -161,7 +161,7 @@ group = www-data
 ;                            (IPv6 and IPv4-mapped) on a specific port;
 ;                            (IPv6 and IPv4-mapped) on a specific port;
 ;   '/path/to/unix/socket' - to listen on a unix socket.
 ;   '/path/to/unix/socket' - to listen on a unix socket.
 ; Note: This value is mandatory.
 ; Note: This value is mandatory.
-listen = /run/php/php-fpm.sock
+listen = /var/run/php/php-fpm.sock
 
 
 ; Set listen(2) backlog.
 ; Set listen(2) backlog.
 ; Default Value: 511 (-1 on FreeBSD and OpenBSD)
 ; Default Value: 511 (-1 on FreeBSD and OpenBSD)

+ 2 - 0
frameworks/PHP/symfony/.env → frameworks/PHP/symfony/deploy/mysql/.env

@@ -23,6 +23,8 @@ APP_SECRET=00708cd4c2a9090792f7bd68b094983d
 ###> doctrine/doctrine-bundle ###
 ###> doctrine/doctrine-bundle ###
 # Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
 # Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
 # For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
 # For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
+DATABASE_DRIVER=pdo_mysql
+DATABASE_VERSION=8.0
 DATABASE_URL=mysql://benchmarkdbuser:benchmarkdbpass@tfb-database:3306/hello_world
 DATABASE_URL=mysql://benchmarkdbuser:benchmarkdbpass@tfb-database:3306/hello_world
 # For a PostgreSQL database, use: "postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"
 # For a PostgreSQL database, use: "postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"
 # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
 # IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml

+ 31 - 0
frameworks/PHP/symfony/deploy/postgresql/.env

@@ -0,0 +1,31 @@
+# In all environments, the following files are loaded if they exist,
+# the latter taking precedence over the former:
+#
+#  * .env                contains default values for the environment variables needed by the app
+#  * .env.local          uncommitted file with local overrides
+#  * .env.$APP_ENV       committed environment-specific defaults
+#  * .env.$APP_ENV.local uncommitted environment-specific overrides
+#
+# Real environment variables win over .env files.
+#
+# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
+#
+# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
+# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration
+
+###> symfony/framework-bundle ###
+APP_ENV=prod
+APP_SECRET=00708cd4c2a9090792f7bd68b094983d
+#TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
+#TRUSTED_HOSTS='^(localhost|example\.com)$'
+###< symfony/framework-bundle ###
+
+###> doctrine/doctrine-bundle ###
+# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
+# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
+DATABASE_DRIVER=pdo_pgsql
+DATABASE_VERSION=15
+DATABASE_URL=postgresql://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world
+# For a PostgreSQL database, use: "postgresql://db_user:[email protected]:5432/db_name?serverVersion=11&charset=utf8"
+# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
+###< doctrine/doctrine-bundle ###

+ 4 - 9
frameworks/PHP/symfony/src/Controller/DbController.php

@@ -21,17 +21,13 @@ class DbController
         $this->worldRepository = $worldRepository;
         $this->worldRepository = $worldRepository;
     }
     }
 
 
-    /**
-     * @Route("/db")
-     */
+    #[Route('/db')]
     public function db(): JsonResponse
     public function db(): JsonResponse
     {
     {
         return new JsonResponse($this->worldRepository->find(mt_rand(1, 10000)));
         return new JsonResponse($this->worldRepository->find(mt_rand(1, 10000)));
     }
     }
 
 
-    /**
-     * @Route("/queries")
-     */
+    #[Route('/queries')]
     public function queries(Request $request): JsonResponse
     public function queries(Request $request): JsonResponse
     {
     {
         $queries = (int) $request->query->get('queries', 1);
         $queries = (int) $request->query->get('queries', 1);
@@ -48,9 +44,8 @@ class DbController
         return new JsonResponse($worlds);
         return new JsonResponse($worlds);
     }
     }
 
 
-    /**
-     * @Route("/updates")
-     */
+    #[Route('/updates')]
+
     public function update(Request $request): JsonResponse
     public function update(Request $request): JsonResponse
     {
     {
         $queries = (int) $request->query->get('queries', 1);
         $queries = (int) $request->query->get('queries', 1);

+ 6 - 9
frameworks/PHP/symfony/src/Controller/DbRawController.php

@@ -18,9 +18,8 @@ class DbRawController
         $this->connection = $connection;
         $this->connection = $connection;
     }
     }
 
 
-    /**
-     * @Route("/raw/db")
-     */
+    #[Route('/raw/db')]
+
     public function db(): JsonResponse
     public function db(): JsonResponse
     {
     {
         $statement = $this->connection->prepare('SELECT id,randomNumber FROM World WHERE id = ?');
         $statement = $this->connection->prepare('SELECT id,randomNumber FROM World WHERE id = ?');
@@ -29,9 +28,8 @@ class DbRawController
         return new JsonResponse($world->fetchAssociative());
         return new JsonResponse($world->fetchAssociative());
     }
     }
 
 
-    /**
-     * @Route("/raw/queries")
-     */
+    #[Route('/raw/queries')]
+
     public function queries(Request $request): JsonResponse
     public function queries(Request $request): JsonResponse
     {
     {
         $queries = (int) $request->query->get('queries', 1);
         $queries = (int) $request->query->get('queries', 1);
@@ -49,9 +47,8 @@ class DbRawController
         return new JsonResponse($worlds);
         return new JsonResponse($worlds);
     }
     }
 
 
-    /**
-     * @Route("/raw/updates")
-     */
+    #[Route('/raw/updates')]
+
     public function updates(Request $request): JsonResponse
     public function updates(Request $request): JsonResponse
     {
     {
         $queries = (int) $request->query->get('queries', 1);
         $queries = (int) $request->query->get('queries', 1);

+ 3 - 3
frameworks/PHP/symfony/src/Controller/FortunesController.php

@@ -21,9 +21,9 @@ class FortunesController
         $this->fortuneRepository = $fortuneRepository;
         $this->fortuneRepository = $fortuneRepository;
     }
     }
 
 
-    /**
-     * @Route("/fortunes")
-     */
+    #[Route('/fortunes')]
+
+
     public function fortunes(): Response
     public function fortunes(): Response
     {
     {
         $fortunes = $this->fortuneRepository->findBy([]);
         $fortunes = $this->fortuneRepository->findBy([]);

+ 2 - 3
frameworks/PHP/symfony/src/Controller/JsonController.php

@@ -7,9 +7,8 @@ use Symfony\Component\Routing\Annotation\Route;
 
 
 class JsonController
 class JsonController
 {
 {
-    /**
-     * @Route("/json")
-     */
+    #[Route('/json')]
+
     public function json(): JsonResponse
     public function json(): JsonResponse
     {
     {
         return new JsonResponse(['message' => 'Hello, World!']);
         return new JsonResponse(['message' => 'Hello, World!']);

+ 1 - 4
frameworks/PHP/symfony/src/Controller/PlaintextController.php

@@ -7,10 +7,7 @@ use Symfony\Component\Routing\Annotation\Route;
 
 
 class PlaintextController
 class PlaintextController
 {
 {
-    /**
-     * @Route("/")
-     * @Route("/plaintext")
-     */
+    #[Route('/plaintext')]
     public function plaintext(): Response
     public function plaintext(): Response
     {
     {
         return new Response('Hello, World!', 200, ['Content-Type' => 'text/plain']);
         return new Response('Hello, World!', 200, ['Content-Type' => 'text/plain']);

+ 5 - 11
frameworks/PHP/symfony/src/Entity/Fortune.php

@@ -3,21 +3,15 @@
 namespace App\Entity;
 namespace App\Entity;
 
 
 use Doctrine\ORM\Mapping as ORM;
 use Doctrine\ORM\Mapping as ORM;
+use Doctrine\DBAL\Types\Types;
 
 
-/**
- * @ORM\Entity(repositoryClass="App\Repository\FortuneRepository")
- * @ORM\Table(name="fortune")
- */
+#[ORM\Entity]
 class Fortune
 class Fortune
 {
 {
-    /**
-     * @ORM\Id
-     * @ORM\Column(type="integer")
-     */
+    #[ORM\Id]
+    #[ORM\Column(type: Types::INTEGER)]
     public int $id = 0;
     public int $id = 0;
 
 
-    /**
-     * @ORM\Column(type="string")
-     */
+    #[ORM\Column(type: Types::STRING)]
     public string $message = '';
     public string $message = '';
 }
 }

+ 8 - 11
frameworks/PHP/symfony/src/Entity/World.php

@@ -3,21 +3,18 @@
 namespace App\Entity;
 namespace App\Entity;
 
 
 use Doctrine\ORM\Mapping as ORM;
 use Doctrine\ORM\Mapping as ORM;
+use Doctrine\DBAL\Types\Types;
 
 
-/**
- * @ORM\Entity(repositoryClass="App\Repository\WorldRepository")
- * @ORM\Table(name="world")
- */
+
+#[ORM\Entity]
 class World
 class World
 {
 {
-    /**
-     * @ORM\Id
-     * @ORM\Column(type="integer")
-     */
+    
+    #[ORM\Id]
+    #[ORM\Column(type: Types::INTEGER)]
     public int $id = 0;
     public int $id = 0;
 
 
-    /**
-     * @ORM\Column(type="integer")
-     */
+    #[ORM\Column(type: Types::INTEGER)]
+
     public int $randomNumber = 0;
     public int $randomNumber = 0;
 }
 }

+ 5 - 5
frameworks/PHP/symfony/symfony-franken.dockerfile

@@ -2,7 +2,7 @@ FROM dunglas/frankenphp
 
 
 # add additional extensions here:
 # add additional extensions here:
 RUN install-php-extensions \
 RUN install-php-extensions \
-    pdo_mysql \
+    pdo_pgsql \
     intl \
     intl \
     opcache
     opcache
 
 
@@ -19,13 +19,13 @@ ADD . /symfony
 WORKDIR /symfony
 WORKDIR /symfony
 
 
 RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log
 RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log
-RUN composer install --no-dev --no-scripts --quiet
+
+ENV COMPOSER_ALLOW_SUPERUSER=1
+RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts
+RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear
 
 
 RUN composer require runtime/frankenphp-symfony
 RUN composer require runtime/frankenphp-symfony
 ENV FRANKENPHP_CONFIG="worker ./public/worker.php"
 ENV FRANKENPHP_CONFIG="worker ./public/worker.php"
 ENV APP_RUNTIME=Runtime\\FrankenPhpSymfony\\Runtime
 ENV APP_RUNTIME=Runtime\\FrankenPhpSymfony\\Runtime
 
 
-RUN COMPOSER_ALLOW_SUPERUSER=1 composer dump-autoload --no-dev --classmap-authoritative
-RUN COMPOSER_ALLOW_SUPERUSER=1 composer dump-env prod
-
 #ENV CADDY_DEBUG=debug
 #ENV CADDY_DEBUG=debug

+ 39 - 0
frameworks/PHP/symfony/symfony-mysql.dockerfile

@@ -0,0 +1,39 @@
+FROM composer/composer:2-bin AS composer
+FROM ubuntu:22.04
+
+ARG DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
+RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
+    apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
+
+RUN apt-get install -yqq nginx git unzip curl \
+    php8.2-cli php8.2-fpm php8.2-mysql  \
+    php8.2-mbstring php8.2-xml php8.2-curl php8.2-dev > /dev/null
+
+COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
+
+COPY deploy/conf/* /etc/php/8.2/fpm/
+
+ADD . /symfony
+WORKDIR /symfony
+
+RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi;
+
+RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log
+
+ENV COMPOSER_ALLOW_SUPERUSER=1
+RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts
+RUN cp deploy/mysql/.env . && composer dump-env prod && bin/console cache:clear
+
+RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.2/fpm/php.ini
+
+
+EXPOSE 8080
+
+# Uncomment next line for Laravel console error logging to be viewable in docker logs
+# RUN echo "catch_workers_output = yes" >> /etc/php/8.2/fpm/php-fpm.conf
+
+RUN mkdir -p /run/php
+CMD /usr/sbin/php-fpm8.2 --fpm-config /etc/php/8.2/fpm/php-fpm.conf && \
+    nginx -c /symfony/deploy/nginx.conf

+ 14 - 13
frameworks/PHP/symfony/symfony-raw.dockerfile

@@ -7,30 +7,31 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
     apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
     apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
 
 
 RUN apt-get install -yqq nginx git unzip curl \
 RUN apt-get install -yqq nginx git unzip curl \
-    php8.2-cli php8.2-fpm php8.2-mysql  \
+    php8.2-cli php8.2-fpm php8.2-pgsql  \
     php8.2-mbstring php8.2-xml php8.2-curl > /dev/null
     php8.2-mbstring php8.2-xml php8.2-curl > /dev/null
 
 
-RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
+COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 COPY deploy/conf/* /etc/php/8.2/fpm/
 COPY deploy/conf/* /etc/php/8.2/fpm/
-RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi;
 
 
+ADD . /symfony
 WORKDIR /symfony
 WORKDIR /symfony
-ADD ./composer.json /symfony/
+
+RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi;
+
 RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log
 RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log
-RUN COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --no-scripts
-ADD . /symfony
-RUN COMPOSER_ALLOW_SUPERUSER=1 composer dump-autoload --no-dev --classmap-authoritative
-RUN COMPOSER_ALLOW_SUPERUSER=1 composer dump-env prod
 
 
-# removes hardcoded option `ATTR_STATEMENT_CLASS` conflicting with `ATTR_PERSISTENT`. Hack not needed when upgrading to Doctrine 3
-# see https://github.com/doctrine/dbal/issues/2315
-#RUN sed -i '/PDO::ATTR_STATEMENT_CLASS/d' ./vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php
+ENV COMPOSER_ALLOW_SUPERUSER=1
+RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts
+RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear
 
 
-RUN php bin/console cache:clear 
 RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.2/fpm/php.ini
 RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.2/fpm/php.ini
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 
-CMD service php8.2-fpm start && \
+# Uncomment next line for Laravel console error logging to be viewable in docker logs
+# RUN echo "catch_workers_output = yes" >> /etc/php/8.2/fpm/php-fpm.conf
+
+RUN mkdir -p /run/php
+CMD /usr/sbin/php-fpm8.2 --fpm-config /etc/php/8.2/fpm/php-fpm.conf && \
     nginx -c /symfony/deploy/nginx.conf
     nginx -c /symfony/deploy/nginx.conf

+ 4 - 3
frameworks/PHP/symfony/symfony-swoole.dockerfile

@@ -1,4 +1,4 @@
-FROM php:8.2-rc-cli
+FROM php:8.2-cli
 
 
 RUN pecl install swoole > /dev/null && \
 RUN pecl install swoole > /dev/null && \
     docker-php-ext-enable swoole
     docker-php-ext-enable swoole
@@ -7,8 +7,8 @@ RUN pecl install apcu > /dev/null && \
     docker-php-ext-enable apcu
     docker-php-ext-enable apcu
 
 
 RUN apt-get update -yqq && \
 RUN apt-get update -yqq && \
-    apt-get install -yqq libicu-dev git unzip > /dev/null && \ 
-    docker-php-ext-install pdo_mysql opcache intl > /dev/null
+    apt-get install -yqq libpq-dev libicu-dev git unzip > /dev/null && \ 
+    docker-php-ext-install pdo_pgsql opcache intl > /dev/null
 
 
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
@@ -19,6 +19,7 @@ WORKDIR /symfony
 RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log
 RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log
 #RUN mkdir -m 777 -p /symfony/var/cache/swoole /symfony/var/log
 #RUN mkdir -m 777 -p /symfony/var/cache/swoole /symfony/var/log
 RUN COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --no-scripts --quiet
 RUN COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --no-scripts --quiet
+RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear
 
 
 ENV APP_RUNTIME=Runtime\\Swoole\\Runtime
 ENV APP_RUNTIME=Runtime\\Swoole\\Runtime
 RUN composer require runtime/swoole
 RUN composer require runtime/swoole

+ 6 - 17
frameworks/PHP/symfony/symfony-workerman.dockerfile

@@ -7,7 +7,7 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
     apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
     apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
 
 
 RUN apt-get install -yqq git unzip \
 RUN apt-get install -yqq git unzip \
-    php8.2-cli php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl > /dev/null
+    php8.2-cli php8.2-pgsql php8.2-mbstring php8.2-xml php8.2-curl > /dev/null
 
 
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
@@ -16,25 +16,14 @@ RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 
-WORKDIR /symfony
-ADD ./composer.json /symfony/
-RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log
-RUN composer install --no-dev --no-scripts
-
-# downgrade to doctrine-dbal 2.12 => due to a bug in version 2.13
-# see https://github.com/doctrine/dbal/issues/4603
-#RUN composer require doctrine/orm:2.10.2 -W
-#RUN composer require doctrine/dbal:2.12.x -W
-
 ADD . /symfony
 ADD . /symfony
-RUN COMPOSER_ALLOW_SUPERUSER=1 composer dump-autoload --no-dev --classmap-authoritative
-RUN COMPOSER_ALLOW_SUPERUSER=1 composer dump-env prod
+WORKDIR /symfony
 
 
-# removes hardcoded option `ATTR_STATEMENT_CLASS` conflicting with `ATTR_PERSISTENT`. Hack not needed when upgrading to Doctrine 3
-# see https://github.com/doctrine/dbal/issues/2315
-#RUN sed -i '/PDO::ATTR_STATEMENT_CLASS/d' ./vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php
+RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log
 
 
-RUN php bin/console cache:clear
+ENV COMPOSER_ALLOW_SUPERUSER=1
+RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts
+RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear
 
 
 COPY deploy/conf/cli-php.ini /etc/php/8.2/cli/php.ini
 COPY deploy/conf/cli-php.ini /etc/php/8.2/cli/php.ini
 
 

+ 16 - 19
frameworks/PHP/symfony/symfony.dockerfile

@@ -7,34 +7,31 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \
     apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
     apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null
 
 
 RUN apt-get install -yqq nginx git unzip curl \
 RUN apt-get install -yqq nginx git unzip curl \
-    php8.2-cli php8.2-fpm php8.2-mysql  \
+    php8.2-cli php8.2-fpm php8.2-pgsql  \
     php8.2-mbstring php8.2-xml php8.2-curl php8.2-dev > /dev/null
     php8.2-mbstring php8.2-xml php8.2-curl php8.2-dev > /dev/null
 
 
-RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
+COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 COPY deploy/conf/* /etc/php/8.2/fpm/
 COPY deploy/conf/* /etc/php/8.2/fpm/
-RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi;
 
 
+ADD . /symfony
 WORKDIR /symfony
 WORKDIR /symfony
-ADD ./composer.json /symfony/
-RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log
-RUN composer install --no-dev --no-scripts
 
 
-# downgrade to doctrine-dbal 2.12 => due to a bug in version 2.13
-# see https://github.com/doctrine/dbal/issues/4603
-#RUN composer require doctrine/orm:2.10.2 -W
-#RUN composer require doctrine/dbal:2.12.x -W
+RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi;
 
 
-ADD . /symfony
-RUN COMPOSER_ALLOW_SUPERUSER=1 composer dump-autoload --no-dev --classmap-authoritative
-RUN COMPOSER_ALLOW_SUPERUSER=1 composer dump-env prod
+RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log
 
 
-# removes hardcoded option `ATTR_STATEMENT_CLASS` conflicting with `ATTR_PERSISTENT`. Hack not needed when upgrading to Doctrine 3
-# see https://github.com/doctrine/dbal/issues/2315
-#RUN sed -i '/PDO::ATTR_STATEMENT_CLASS/d' ./vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php
+ENV COMPOSER_ALLOW_SUPERUSER=1
+RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts
+RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear
 
 
-RUN php bin/console cache:clear
 RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.2/fpm/php.ini
 RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.2/fpm/php.ini
 
 
-CMD service php8.2-fpm start && \
-    nginx -c /symfony/deploy/nginx.conf
+EXPOSE 8080
+
+# Uncomment next line for Laravel console error logging to be viewable in docker logs
+# RUN echo "catch_workers_output = yes" >> /etc/php/8.2/fpm/php-fpm.conf
+
+RUN mkdir -p /run/php
+CMD /usr/sbin/php-fpm8.2 --fpm-config /etc/php/8.2/fpm/php-fpm.conf && \
+    nginx -c /symfony/deploy/nginx.conf