DEV Community

Cover image for PHP HyperF + MariaDB -> Async / Parallel
Thiago Silva
Thiago Silva

Posted on • Edited on

2

PHP HyperF + MariaDB -> Async / Parallel

  • PHP: 8.3.7
  • PHP HyperF: 3.1.23
  • MariaDB: 11.3.2

HyperF - Project

System test for executing database queries in parallel or asynchronously.

Create - Project

composer create-project hyperf/hyperf-skeleton "project"
Enter fullscreen mode Exit fullscreen mode

Install - Watcher

composer require hyperf/watcher --dev
Enter fullscreen mode Exit fullscreen mode

Install - DB Library

composer require hyperf/database
composer require hyperf/db-connection
Enter fullscreen mode Exit fullscreen mode

Server - Start

cd project ;
php bin/hyperf.php server:watch ;
Enter fullscreen mode Exit fullscreen mode

MariaDB - Database

The data model is in meta tables, just for example.

Database - Project

CREATE DATABASE `project`;
Enter fullscreen mode Exit fullscreen mode

Table - Family

CREATE TABLE `family` (
    `id` tinyint(3) unsigned NOT NULL,
    `name` varchar(40) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Enter fullscreen mode Exit fullscreen mode

Table - Pets

CREATE TABLE `pet` (
    `id` tinyint(3) unsigned NOT NULL,
    `name` varchar(40) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Enter fullscreen mode Exit fullscreen mode

Table - Car

CREATE TABLE `car` (
    `id` tinyint(3) unsigned NOT NULL,
    `name` varchar(40) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Enter fullscreen mode Exit fullscreen mode

Table - Family Setting

CREATE TABLE `family_setting` (
    `id_family` tinyint(3) unsigned NOT NULL,
    `type` varchar(10) DEFAULT NULL,
    `key` tinyint(3) unsigned NOT NULL,
    KEY (`id_family`),
    KEY (`type`),
    KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Enter fullscreen mode Exit fullscreen mode

Populate - ALL

INSERT INTO `family` (`id`, `name`) VALUES(1, 'Family 1');
INSERT INTO `family` (`id`, `name`) VALUES(2, 'Family 2');
INSERT INTO `family` (`id`, `name`) VALUES(3, 'Family 3');

INSERT INTO `pet` (`id`, `name`) VALUES(1, 'Pet 1');
INSERT INTO `pet` (`id`, `name`) VALUES(2, 'Pet 2');
INSERT INTO `pet` (`id`, `name`) VALUES(3, 'Pet 3');

INSERT INTO `car` (`id`, `name`) VALUES(1, 'Car 1');
INSERT INTO `car` (`id`, `name`) VALUES(2, 'Car 2');
INSERT INTO `car` (`id`, `name`) VALUES(3, 'Car 3');

INSERT INTO `family_setting` (`id_family`, `type`, `key`) VALUES(1, 'pet', 1);
INSERT INTO `family_setting` (`id_family`, `type`, `key`) VALUES(1, 'pet', 2);
INSERT INTO `family_setting` (`id_family`, `type`, `key`) VALUES(1, 'car', 3);
INSERT INTO `family_setting` (`id_family`, `type`, `key`) VALUES(2, 'car', 1);
INSERT INTO `family_setting` (`id_family`, `type`, `key`) VALUES(2, 'car', 2);
INSERT INTO `family_setting` (`id_family`, `type`, `key`) VALUES(3, 'pet', 3);
Enter fullscreen mode Exit fullscreen mode

HyperF - APP

Database Config - MariaDB

DB_DRIVER=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=project
DB_USERNAME=root
DB_PASSWORD=master
Enter fullscreen mode Exit fullscreen mode

path: /project/.env

APP - Router

Router::addRoute(['GET', 'POST'], '/family', 'App\Controller\ControllerFamily@data');
Router::addRoute(['GET', 'POST'], '/family/mount', 'App\Controller\ControllerFamily@mount');
Enter fullscreen mode Exit fullscreen mode

path: /project/config/routes.php

APP - Model - Family

namespace App\Model;

use Hyperf\DbConnection\Db;

class ModelFamily extends Model
{
    static public function data()
    {
        $family=Db::select('SELECT * FROM `family`;');
        return $family;
    }

    static public function mount()
    {
        $parallel=new \Hyperf\Coroutine\Parallel();

        $parallel->add(function(){
            $data=Db::select('SELECT * FROM `family`;');
            return $data;
        });

        $parallel->add(function(){
            $data=Db::select('SELECT * FROM `pet`;');
            sleep(2); // important add time test
            return $data;
        });

        $parallel->add(function(){
            $data=Db::select('SELECT * FROM `car`;');
            sleep(1); // important add time test
            return $data;
        });

        $parallel->add(function(){
            $data=Db::select('SELECT * FROM `family_setting`;');
            return $data;
        });

        $result=$parallel->wait();
        $result=[
            'family'=>$result[0],
            'pet'=>$result[1],
            'car'=>$result[2],
            'family_setting'=>$result[3],
        ];

        return $result;
    }
}
Enter fullscreen mode Exit fullscreen mode

path: /project/app/Model/ModelFamily.php

APP - Controller - Family

namespace App\Controller;

use \App\Model\ModelFamily;

class ControllerFamily
{
    public function data()
    {
        $family=ModelFamily::data();
        return $family;
    }
    public function mount()
    {
        $data=ModelFamily::mount();
        return $data;
    }
}
Enter fullscreen mode Exit fullscreen mode

path: /project/app/Controller/ControllerFamily.php

Execute

GET - Family

curl "http://127.0.0.1:9501/family" | jq .
Enter fullscreen mode Exit fullscreen mode
[
    {
        "id": 1,
        "name": "Family 1"
    },
    {
        "id": 2,
        "name": "Family 2"
    },
    {
        "id": 3,
        "name": "Family 3"
    }
]
Enter fullscreen mode Exit fullscreen mode

GET - Mount

curl "http://127.0.0.1:9501/family/mount" | jq .
Enter fullscreen mode Exit fullscreen mode
{
    "family": [
        {
            "id": 1,
            "name": "Family 1"
        },
        ...
    ],
    "pet": [
        {
            "id": 1,
            "name": "Pet 1"
        },
        ...
    ],
    "car": [
        {
            "id": 1,
            "name": "Car 1"
        },
        ...
    ],
    "family_setting": [
        {
            "id_family": 1,
            "type": "pet",
            "key": 1
        },
        {
            "id_family": 1,
            "type": "pet",
            "key": 2
        },
        ...
    ]
}
Enter fullscreen mode Exit fullscreen mode

https://github.com/thiagoeti/php-hyperf-mariadb-async-parrallel

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs