Browse Source

[php] Phalcon5 and PHP8.1 (#7615)

* Dockerfiles update: Phalcon5, PHP8.1, Ubuntu22.04

* Change code for Phalcon5

* Update benchmark config

* Update config for Phalcon5

* Clean php-fpm config

* Changes to mongodb work
Joan Miquel 2 years ago
parent
commit
e386dc32a1

+ 25 - 0
frameworks/PHP/phalcon/app/config/config-mongo.php

@@ -0,0 +1,25 @@
+<?php
+
+use Phalcon\Config;
+
+return new Config([
+    'database'     => [
+        'adapter'  => 'Mysql',
+        'host'     => 'tfb-database',
+        'username' => 'benchmarkdbuser',
+        'password' => 'benchmarkdbpass',
+        'name'     => 'hello_world',
+        'persistent' => true,
+    ],
+    'mongodb'     => [
+        'url'     => 'mongodb://tfb-database:27017',
+        'db'      => 'hello_world'
+    ],
+    'application' => [
+        'controllersDir' => APP_PATH . '/app/controllers/',
+        'modelsDir'      => APP_PATH . '/app/models/',
+        'collectionsDir' => APP_PATH . '/app/collections/',
+        'viewsDir'       => APP_PATH . '/app/views/',
+        'baseUri'        => '/',
+    ]
+]);

+ 1 - 1
frameworks/PHP/phalcon/app/config/config.php

@@ -1,6 +1,6 @@
 <?php
 
-use Phalcon\Config;
+use Phalcon\Config\Config;
 
 return new Config([
     'database'     => [

+ 3 - 3
frameworks/PHP/phalcon/benchmark_config.json

@@ -14,7 +14,7 @@
       "database": "MySQL",
       "framework": "phalcon",
       "language": "PHP",
-      "flavor": "PHP7",
+      "flavor": "PHP8.1",
       "orm": "raw",
       "platform": "FPM/FastCGI",
       "webserver": "nginx",
@@ -34,7 +34,7 @@
       "database": "MongoDB",
       "framework": "phalcon",
       "language": "PHP",
-      "flavor": "PHP7",
+      "flavor": "PHP8.1",
       "orm": "raw",
       "platform": "FPM/FastCGI",
       "webserver": "nginx",
@@ -56,7 +56,7 @@
       "database": "MySQL",
       "framework": "phalcon",
       "language": "PHP",
-      "flavor": "PHP7",
+      "flavor": "PHP8.1",
       "orm": "raw",
       "platform": "FPM/FastCGI",
       "webserver": "nginx",

+ 2 - 2
frameworks/PHP/phalcon/deploy/conf/php-fpm.conf

@@ -14,7 +14,7 @@
 ; Pid file
 ; Note: the default prefix is /var
 ; Default Value: none
-pid = /run/php/php7.4-fpm.pid
+pid = /run/php/php-fpm.pid
 
 ; Error log file
 ; If it's set to "syslog", log is sent to syslogd instead of being written
@@ -161,7 +161,7 @@ group = www-data
 ;                            (IPv6 and IPv4-mapped) on a specific port;
 ;   '/path/to/unix/socket' - to listen on a unix socket.
 ; Note: This value is mandatory.
-listen = /run/php/php7.4-fpm.sock
+listen = /run/php/php-fpm.sock
 
 ; Set listen(2) backlog.
 ; Default Value: 511 (-1 on FreeBSD and OpenBSD)

+ 1 - 1
frameworks/PHP/phalcon/deploy/nginx.conf

@@ -42,7 +42,7 @@ http {
 
 
     upstream fastcgi_backend {
-        server unix:/var/run/php/php7.4-fpm.sock;
+        server unix:/var/run/php/php-fpm.sock;
         keepalive 40;
     }
 

+ 7 - 6
frameworks/PHP/phalcon/phalcon-micro.dockerfile

@@ -1,4 +1,4 @@
-FROM ubuntu:20.04
+FROM ubuntu:22.04
 
 ARG DEBIAN_FRONTEND=noninteractive
 
@@ -6,18 +6,19 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de
 RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
 RUN apt-get update -yqq > /dev/null && \
     apt-get install -yqq nginx git unzip \
-    php7.4-cli php7.4-fpm php7.4-mysql php7.4-mbstring > /dev/null
+    php8.1-cli php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-xml > /dev/null
 
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
-COPY deploy/conf/* /etc/php/7.4/fpm/
+COPY deploy/conf/* /etc/php/8.1/fpm/
 
 ADD ./ /phalcon
 WORKDIR /phalcon
 
-RUN apt-get install -yqq php7.4-psr php7.4-phalcon  > /dev/null
+RUN apt-get install -y php-pear php8.1-dev > /dev/null
+RUN pecl install phalcon-5.0.2 && echo "extension=phalcon.so" > /etc/php/8.1/fpm/conf.d/phalcon.ini
 
-RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/7.4/fpm/php-fpm.conf ; fi;
+RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.1/fpm/php-fpm.conf ; fi;
 
 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --ignore-platform-reqs
 
@@ -27,5 +28,5 @@ RUN chmod -R 777 app
 
 EXPOSE 8080
 
-CMD service php7.4-fpm start && \
+CMD service php8.1-fpm start && \
     nginx -c /phalcon/deploy/nginx.conf

+ 2 - 0
frameworks/PHP/phalcon/phalcon-mongodb.dockerfile

@@ -21,6 +21,8 @@ RUN apt-get install -yqq php7.4-psr php7.4-phalcon  > /dev/null
 
 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --ignore-platform-reqs
 
+RUN mv /phalcon/public/index-mongo.php /phalcon/public/index.php
+
 RUN chmod -R 777 app
 
 EXPOSE 8080

+ 7 - 6
frameworks/PHP/phalcon/phalcon.dockerfile

@@ -1,4 +1,4 @@
-FROM ubuntu:20.04
+FROM ubuntu:22.04
 
 ARG DEBIAN_FRONTEND=noninteractive
 
@@ -6,18 +6,19 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de
 RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
 RUN apt-get update -yqq > /dev/null && \
     apt-get install -yqq nginx git unzip \
-    php7.4-cli php7.4-fpm php7.4-mysql php7.4-mbstring > /dev/null
+    php8.1-cli php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-xml> /dev/null
 
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
-COPY deploy/conf/* /etc/php/7.4/fpm/
+COPY deploy/conf/* /etc/php/8.1/fpm/
 
 ADD ./ /phalcon
 WORKDIR /phalcon
 
-RUN apt-get install -yqq php7.4-psr php7.4-phalcon  > /dev/null
+RUN apt-get install -y php-pear php8.1-dev > /dev/null
+RUN pecl install phalcon-5.0.2 && echo "extension=phalcon.so" > /etc/php/8.1/fpm/conf.d/phalcon.ini
 
-RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/7.4/fpm/php-fpm.conf ; fi;
+RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.1/fpm/php-fpm.conf ; fi;
 
 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --ignore-platform-reqs
 
@@ -25,5 +26,5 @@ RUN chmod -R 777 app
 
 EXPOSE 8080
 
-CMD service php7.4-fpm start && \
+CMD service php8.1-fpm start && \
     nginx -c /phalcon/deploy/nginx.conf

+ 2 - 3
frameworks/PHP/phalcon/public/index-micro.php

@@ -5,7 +5,6 @@ use Phalcon\Db\Enum;
 use Phalcon\Mvc\Micro;
 use Phalcon\Mvc\View;
 use Phalcon\Mvc\View\Engine\Volt;
-use Phalcon\Exception as PhalconException;
 
 try {
     $app = new Micro();
@@ -101,6 +100,6 @@ try {
 
     $url = $_REQUEST['_url'] ?? '/';
     $app->handle($url);
-} catch (PhalconException $e) {
-    echo "PhalconException: ", $e->getMessage();
+} catch (Exception $e) {
+    echo "Exception: ", $e->getMessage();
 }

+ 104 - 0
frameworks/PHP/phalcon/public/index-mongo.php

@@ -0,0 +1,104 @@
+<?php
+
+use MongoDB\Client;
+use Phalcon\Db\Adapter\Pdo\Mysql;
+use Phalcon\DI\FactoryDefault;
+use Phalcon\Exception as PhalconException;
+use Phalcon\Http\Request;
+use Phalcon\Incubator\MongoDB\Mvc\Collection\Manager as MongoDBCollectionManager;
+use Phalcon\Loader;
+use Phalcon\Mvc\Application;
+use Phalcon\Mvc\Model\MetaData\Apc;
+use Phalcon\Mvc\Model\MetaData\Memory;
+use Phalcon\Mvc\View;
+use Phalcon\Mvc\View\Engine\Volt;
+
+define('APP_PATH', realpath('..'));
+require APP_PATH . "/vendor/autoload.php";
+
+try {
+    // Load the config
+    $config = include APP_PATH . "/app/config/config-mongo.php";
+
+    // Register an autoloader
+    $loader = new Loader();
+    $loader->registerDirs([
+        $config->application->controllersDir,
+        $config->application->modelsDir,
+        $config->application->collectionsDir,
+    ])->register();
+
+    // Create a DI
+    $di = new FactoryDefault();
+
+    // Setting up the router
+    $di->setShared('router', require APP_PATH . '/app/config/routes.php');
+
+    //MetaData
+    $di->setShared('modelsMetadata', function () {
+        if (function_exists('apc_store')) {
+            return new Apc();
+        }
+
+        return new Memory([
+            'metaDataDir' => APP_PATH . "/app/compiled-templates/"
+        ]);
+    });
+
+    // Setting up the view component (seems to be required even when not used)
+    $di->setShared('view', function () use ($config) {
+        $view = new View();
+        $view->setViewsDir($config->application->viewsDir);
+        $view->registerEngines([
+            ".volt" => function ($view) {
+                $volt = new Volt($view);
+                $volt->setOptions([
+                    "path" => APP_PATH . "/app/compiled-templates/",
+                    "extension" => ".compiled",
+                    "separator" => '_',
+                ]);
+
+                return $volt;
+            }
+        ]);
+
+        return $view;
+    });
+
+    // Setting up the database connection
+    $di->setShared('db', function () use ($config) {
+        $database = $config->database;
+
+        return new Mysql([
+            'host' => $database->host,
+            'username' => $database->username,
+            'password' => $database->password,
+            'dbname' => $database->name,
+            'options' => [
+                PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
+                PDO::ATTR_PERSISTENT => true,
+            ],
+        ]);
+    });
+
+    // Setting up the mongodb connection
+    $di->setShared('mongo', function () use ($config) {
+        $mongodbConfig = $config->mongodb;
+        $mongo = new Client($mongodbConfig->url);
+
+        return $mongo->selectDatabase($mongodbConfig->db);
+    });
+
+    // Registering the mongoDB CollectionManager service
+    $di->setShared('collectionsManager', function () {
+        return new MongoDBCollectionManager();
+    });
+
+    // Handle the request
+    $request = new Request();
+    $application = new Application();
+    $application->setDI($di);
+    $application->handle($request->getURI())->send();
+} catch (PhalconException $e) {
+    echo "PhalconException: ", $e->getMessage();
+}

+ 4 - 5
frameworks/PHP/phalcon/public/index.php

@@ -3,10 +3,9 @@
 use MongoDB\Client;
 use Phalcon\Db\Adapter\Pdo\Mysql;
 use Phalcon\DI\FactoryDefault;
-use Phalcon\Exception as PhalconException;
 use Phalcon\Http\Request;
 use Phalcon\Incubator\MongoDB\Mvc\Collection\Manager as MongoDBCollectionManager;
-use Phalcon\Loader;
+use Phalcon\Autoload\Loader;
 use Phalcon\Mvc\Application;
 use Phalcon\Mvc\Model\MetaData\Apc;
 use Phalcon\Mvc\Model\MetaData\Memory;
@@ -22,7 +21,7 @@ try {
 
     // Register an autoloader
     $loader = new Loader();
-    $loader->registerDirs([
+    $loader->setDirectories([
         $config->application->controllersDir,
         $config->application->modelsDir,
         $config->application->collectionsDir,
@@ -99,6 +98,6 @@ try {
     $application = new Application();
     $application->setDI($di);
     $application->handle($request->getURI())->send();
-} catch (PhalconException $e) {
-    echo "PhalconException: ", $e->getMessage();
+} catch (Exception $e) {
+    echo "Exception: ", $e->getMessage();
 }