This repository contains the codebase PHP bridge using RoadRunner Jobs plugin.

Overview

RoadRunner Jobs Plugin

Latest Stable Version Build Status Codecov

This repository contains the codebase PHP bridge using RoadRunner Jobs plugin.

Installation

To install application server and Jobs codebase

$ composer require spiral/roadrunner-jobs

You can use the convenient installer to download the latest available compatible version of RoadRunner assembly:

$ composer require spiral/roadrunner-cli --dev
$ vendor/bin/rr get

Usage

First you need to add at least one jobs adapter to your RoadRunner configuration. For example, such a configuration would be quite feasible to run:

#
# RPC is required for tasks dispatching (client)
#
rpc:
    listen: tcp://127.0.0.1:6001

#
# This section configures the task consumer (server)
#
server:
    command: php consumer.php
    relay: pipes

#
# In this section, the jobs themselves are configured
#
jobs:
    consume: [ "test" ]   # List of RoadRunner queues that can be processed by 
                          # the consumer specified in the "server" section.
    pipelines:
        test:               # RoadRunner queue identifier
            driver: memory  # - Queue driver name
            queue: test       # - Internal (driver's) queue identifier

Read more about all available drivers on the documentation page.

After starting the server with this configuration, one driver named "test" will be available to you.

The following code will allow writing and reading an arbitrary value from the RoadRunner server.

connect('test'); // Create task prototype with default headers $prototype = $queue->create('echo') ->withHeader('attempts', 4) ->withHeader('retry-delay', 10) ; // Execute "echo" task with Closure as payload $task = $queue->dispatch( $prototype->withValue(static fn($arg) => print $arg) ); var_dump($task->getId() . ' has been queued'); ">


use Spiral\RoadRunner\Jobs\Jobs;

require __DIR__ . '/vendor/autoload.php';

// Jobs service
$jobs = new Jobs(RPC::create('tcp://127.0.0.1:6001'));

// Select "test" queue from jobs
$queue = $jobs->connect('test');

// Create task prototype with default headers
$prototype = $queue->create('echo')
    ->withHeader('attempts', 4)
    ->withHeader('retry-delay', 10)
;

// Execute "echo" task with Closure as payload
$task = $queue->dispatch(
    $prototype->withValue(static fn($arg) => print $arg)
);

var_dump($task->getId() . ' has been queued');

License

The MIT License (MIT). Please see LICENSE for more information. Maintained by Spiral Scout.

Comments
  • Вечный цикл

    Вечный цикл

    Если таска завершается по ексепшену то попадаем в вечный цикл

    даже если в методе fail передаем $requeue = false

    "spiral/roadrunner": "v2.4.1",
    "spiral/roadrunner-jobs": "v2.0.0"
    
    opened by dimon-ukr 8
  • Declare queue

    Declare queue "default" for dispatch

    Hello! I fill config for dispatching to RabbitMQ's exchange, but at startup always create queue with name "default". These messages are intended for other microservices, whoever wants, subscribes to the exchange. How to stop the queue from being created?

    amqp:
      addr: amqp://guest:guest@rabbitmq:5672/
    
    jobs:
      pool:
        num_workers: 1
        max_jobs: 0
        allocate_timeout: 600s
        destroy_timeout: 600s
    
      pipelines:
        aggregator-event:
          config:
            driver: amqp
            exchange: amqp.topic
            exchange_type: topic
            routing_key: aggregator-event.user.action
            durable: true
    
    bug 
    opened by Colomix 6
  • Adds support for kafka and boltdb pipelines

    Adds support for kafka and boltdb pipelines

    Create kafka pipeline

    use Spiral\RoadRunner\Jobs\Queue\KafkaCreateInfo;
    use Spiral\RoadRunner\Jobs\Jobs;
    
    $jobs = new Jobs(RPC::create('tcp://127.0.0.1:6001'));
    
    $kafkaCreateInfo = new KafkaCreateInfo(
         name: 'kafka-queue',
         topic: 'subscription',
         maxOpenRequests: 1000
    );
    
    $queue = $jobs->create($kafkaCreateInfo);
    

    Push job into kafka pipeline

    use Spiral\RoadRunner\Jobs\KafkaOptions;
    use Spiral\RoadRunner\Jobs\Queue\Kafka\PartitionOffset;
    
    $queue->dispatch(
          $queue->create(
                'job:name',
                ['foo' => 'bar'],
                new KafkaOptions(
                      topic: 'some-topic',
                      metadata: 'foo-bar',
                      offset: PartitionOffset::OFFSET_NEWEST
                )
          )
    );
    

    Changing options in a prepared task:

    $queue = $jobs->create($kafkaCreateInfo);
            
    $task = $queue->create(
        'job:name',
        ['foo' => 'bar'],
        new KafkaOptions(
            topic: 'some-topic',
            metadata: 'foo-bar',
            offset: PartitionOffset::OFFSET_NEWEST
        )
    );
            
    $queue->dispatch($task->withOptions(new KafkaOptions(
        topic: 'other',
        metadata: 'foo-bar',
        offset: PartitionOffset::OFFSET_NEWEST
    )));
    
    $queue->dispatch($task->withOptions($task->getOptions()->withTopic('other')));
    $queue->dispatch($task->withDelay(10));
    

    Create boltdb pipeline

    use Spiral\RoadRunner\Jobs\Queue\BoltdbCreateInfo;
    use Spiral\RoadRunner\Jobs\Jobs;
    
    $jobs = new Jobs(RPC::create('tcp://127.0.0.1:6001'));
    
    $boltdbCreateInfo = new BoltdbCreateInfo(
         name: 'boltdb-queue',
         file: 'rr.db'
    );
    
    $queue = $jobs->create($boltdbCreateInfo);
    
    enhancement 
    opened by butschster 5
  • $jobs->create not working for consumers

    $jobs->create not working for consumers

    i can't read tasks from $jobs->create created queue

    worker code:

    <?php
    
    include realpath(__DIR__ . "/../bootstrap.php");
    
    use Spiral\Goridge\RPC\RPC;
    use Spiral\Goridge\StreamRelay;
    use Spiral\RoadRunner;
    use Spiral\RoadRunner\Environment;
    
    ini_set('display_errors', 0);
    error_reporting(0);
    
    $env = Environment::fromGlobals();
    $rpc = RPC::create($env->getRPCAddress());
    
    $jobs = new RoadRunner\Jobs\Jobs($rpc);
    
    $p = $jobs->create(new RoadRunner\Jobs\Queue\AMQPCreateInfo(
        'myqueue',
        1,
        1,
        'myqueue',
        'amqp.default1',
    ));
    $p->resume();
    
    $consumer = new RoadRunner\Jobs\Consumer();
    
    while ($task = $consumer->waitTask()) {
        echo PHP_EOL . "taskk";
    
        $task->complete();
    }
    

    rr.yaml config:

    rpc:
      listen: tcp://127.0.0.1:6001
    
    server:
      command: "php workers/bot_queue_worker.php"
      relay: pipes
    
    logs:
      level: debug
    
    amqp:
      addr: amqp://guest:guest@rabbitmq:5672
    
    jobs:
      consume: ["pipe1", "pipe2"]
      num_pollers: 16
      pipeline_size: 100000
      timeout: 1
      pool:
        num_workers: 10
        max_jobs: 0
        allocate_timeout: 60s
        destroy_timeout: 60s
    
    opened by semichkin 4
  • [FEATURE REQUEST] Support for NATS

    [FEATURE REQUEST] Support for NATS

    RR2 in the v2.5.0 will bring NATS support: https://docs.nats.io/ support. Here's what needs to be done for the PHP client library:

    1. Add new NATS const (or what is used in PHP to identify the jobs driver). ~2. Support the new protocol response type for all brokers. So, not only NATS would have the ability to respond.~
    2. For the response protocol type, the data should be stored in the data section within the payload JSON key.

    The response itself is fairly simple:

    {
      "type": 2,
      "data": {
        "queue": "foo",
        "payload": "binary_payload"
      }
    }
    

    Where queue is used as a generic term to name the driver push abstraction. So, the queue is the synonym for the tube for the beanstalk or subject for the NATS. payload is a binary response that should be sent to the queue.

    Limitations:

    • NATS doesn't support the delay. The client library is responsible for rejecting a request which contains delay. The server part will double check that and in case of non-zero delay will return an error.
    enhancement 
    opened by rustatian 3
  • [Bug][Job][ReceivedTask] Retry task dosent work properly

    [Bug][Job][ReceivedTask] Retry task dosent work properly

    Tasks cloning and responding destructor side effects.

    Currently it seems to be impossible to setup retries using the docs recommended way(via headers). We are working with \Spiral\RoadRunner\Jobs\Task\ReceivedTask objects. Once you call $task->withHeader('retries', $x) to refresh the retries left, a copy of your task is created. Now, take a look at __destruct():

    public function __destruct()
    {
        try {
            if ($this->completed === null) {
                $this->complete();
            }
        } catch (JobsException $e) {
            // Suppress shutdown exception
        }
    }
    

    And $this->complete() call:

    public function complete(): void
    {
        $this->respond(Type::SUCCESS);
    }
    

    Back to our code. Copy of a task means we will have 2 respond() calls, one from originalTask::destruct() and one from our retry logic. $task->fail('error message', $resend=true);

    Even if you assign both task copies to delay the destruct() call of the original one: $taskCopy = $task->withHeader('attempts', (string) $retries);

    $taskCopy->fail('error message', $resend=true); One of these will be called $task->complete() from __destruct() or $task->fail($x, $y) manually. And it will cause problems, breaking our resend flow.

    bug 
    opened by sergey-telpuk 2
  • Adding headers to Options

    Adding headers to Options

    Added headers to the Options and PreparedTask.

    Parameter array $headers = [] in the PreparedTask similar to the same parameter in the other tasks:

    1. https://github.com/spiral/roadrunner-jobs/blob/master/src/Task/QueuedTask.php#L37
    2. https://github.com/spiral/roadrunner-jobs/blob/master/src/Task/ReceivedTask.php#L27
    enhancement 
    opened by msmakouz 1
  • fix: avoid exception when consuming an empty message sent into a Kafka topic

    fix: avoid exception when consuming an empty message sent into a Kafka topic

    Hi,

    This PR avoids an exception when a message sent into a kafka topic has an empty body. I also tested a message with an empty key (but with a valid body) and it works fine.

    See: https://github.com/roadrunner-server/roadrunner/issues/1311

    Thank you

    closes: https://github.com/roadrunner-server/roadrunner/issues/1311

    bug 
    opened by Baiquette 1
  • Mark Jobs::isAvailable method as deprecated.

    Mark Jobs::isAvailable method as deprecated.

    Since RoadRunner version 2.3 there is not an ability to get list of available plugins via RPC and every time when developers started using this package they bumped into a problem with Jobs::isAvailable method. With this PR the method was marked as a deprecated and now it will throw an exception with information about deprecation.

    bug enhancement 
    opened by butschster 1
  • Fixes default task priority in a queue.

    Fixes default task priority in a queue.

    At the moment a queue sets priority for every pushed task to 10 and there is a problem with it. If the priority value for these tasks was explicitly set, default priority from RoadRunner config can not be used. If the priority value is 0, then will be used a default value from RoadRunner config.

    bug 
    opened by butschster 1
  • Removing opis/closure serializer

    Removing opis/closure serializer

    | Q | A | ------------- | --- | Bugfix? | ❌ | Breaks BC? | ✔️ | New feature? | ❌

    • Removed opis/closure dependency.
    • Removed DefaultSerializer with opis/closure.
    • Replaced DefaultSerializer to JsonSerializer
    enhancement 
    opened by msmakouz 1
  • What is the latest version?

    What is the latest version?

    Hello, I see that this repo has the following version 2.6, 3.0. I suppose the latest version 3.0 but the latest commits were in 2.6. do you follow semantics of version?

    question 
    opened by sergey-telpuk 2
Releases(v2.6.0)
  • v2.6.0(Oct 21, 2022)

    What's Changed

    • Adding headers to Options by @msmakouz in https://github.com/spiral/roadrunner-jobs/pull/27
    • Fixing tags and attributes in SQS by @msmakouz in https://github.com/spiral/roadrunner-jobs/pull/28

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.5.1...v2.6.0

    Source code(tar.gz)
    Source code(zip)
  • v2.5.1(Oct 11, 2022)

    What's Changed

    • Fixes problem with receiving empty payload body. by @butschster in https://github.com/spiral/roadrunner-jobs/pull/25

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.5.0...v2.5.1

    Source code(tar.gz)
    Source code(zip)
  • v2.5.0(Sep 20, 2022)

    What's Changed

    • Mark Jobs::isAvailable method as deprecated. by @butschster in https://github.com/spiral/roadrunner-jobs/pull/23

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.4.0...v2.5.0

    Source code(tar.gz)
    Source code(zip)
  • v3.0.0(Sep 16, 2022)

    What's Changed

    • Removed opis/closure serializer by @msmakouz in https://github.com/spiral/roadrunner-jobs/pull/19

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.3.0...v3.0.0

    Source code(tar.gz)
    Source code(zip)
  • v2.4.0(Aug 23, 2022)

    What's Changed

    • Adds support for kafka and boltdb pipelines by @butschster and @msmakouz in https://github.com/spiral/roadrunner-jobs/pull/22

    Create kafka pipeline

    use Spiral\RoadRunner\Jobs\Queue\KafkaCreateInfo;
    use Spiral\RoadRunner\Jobs\Jobs;
    
    $jobs = new Jobs(RPC::create('tcp://127.0.0.1:6001'));
    
    $kafkaCreateInfo = new KafkaCreateInfo(
         name: 'kafka-queue',
         topic: 'subscription',
         maxOpenRequests: 1000
    );
    
    $queue = $jobs->create($kafkaCreateInfo);
    

    Push job into kafka pipeline

    use Spiral\RoadRunner\Jobs\KafkaOptions;
    use Spiral\RoadRunner\Jobs\Queue\Kafka\PartitionOffset;
    
    $queue->dispatch(
          $queue->create(
                'job:name',
                ['foo' => 'bar'],
                new KafkaOptions(
                      topic: 'some-topic',
                      metadata: 'foo-bar',
                      offset: PartitionOffset::OFFSET_NEWEST
                )
          )
    );
    

    Changing options in a prepared task:

    $queue = $jobs->create($kafkaCreateInfo);
            
    $task = $queue->create(
        'job:name',
        ['foo' => 'bar'],
        new KafkaOptions(
            topic: 'some-topic',
            metadata: 'foo-bar',
            offset: PartitionOffset::OFFSET_NEWEST
        )
    );
            
    $queue->dispatch($task->withOptions(new KafkaOptions(
        topic: 'other',
        metadata: 'foo-bar',
        offset: PartitionOffset::OFFSET_NEWEST
    )));
    
    $queue->dispatch($task->withOptions($task->getOptions()->withTopic('other')));
    $queue->dispatch($task->withDelay(10));
    

    Create boltdb pipeline

    use Spiral\RoadRunner\Jobs\Queue\BoltdbCreateInfo;
    use Spiral\RoadRunner\Jobs\Jobs;
    
    $jobs = new Jobs(RPC::create('tcp://127.0.0.1:6001'));
    
    $boltdbCreateInfo = new BoltdbCreateInfo(
         name: 'boltdb-queue',
         file: 'rr.db'
    );
    
    $queue = $jobs->create($boltdbCreateInfo);
    

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.3.2...v2.4.0

    Source code(tar.gz)
    Source code(zip)
  • v2.3.2(Jul 20, 2022)

    What's Changed

    • Fixes default task priority in a queue. by @butschster in https://github.com/spiral/roadrunner-jobs/pull/21

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.3.1...v2.3.2

    Source code(tar.gz)
    Source code(zip)
  • v2.3.1(Jul 11, 2022)

    What's Changed

    • RR jobs plugin requires string map by @rauanmayemir in https://github.com/spiral/roadrunner-jobs/pull/20

    New Contributors

    • @rauanmayemir made their first contribution in https://github.com/spiral/roadrunner-jobs/pull/20

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.3.0...v2.3.1

    Source code(tar.gz)
    Source code(zip)
  • v2.3.0(May 25, 2022)

    What's Changed

    • Allow to define durable queue info property by @kafkiansky in https://github.com/spiral/roadrunner-jobs/pull/17

    New Contributors

    • @kafkiansky made their first contribution in https://github.com/spiral/roadrunner-jobs/pull/17

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.2.0...v2.3.0

    Source code(tar.gz)
    Source code(zip)
  • v2.2.0(May 23, 2022)

    What's Changed

    • Adds support for NATS create info by @butschster in https://github.com/spiral/roadrunner-jobs/pull/16

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.1.1...v2.2.0

    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(May 16, 2022)

    What's Changed

    • Added auto_ack option to the Job class by @butschster in https://github.com/spiral/roadrunner-jobs/pull/14
    use Spiral\RoadRunner\Jobs\Queue\MemoryCreateInfo;
    use Spiral\RoadRunner\Jobs\Options;
    use Spiral\RoadRunner\Jobs\Jobs;
    
    // Create with default values
    $options = new Options();
    
    // Jobs service
    $jobs = new Jobs(RPC::create('tcp://127.0.0.1:6001'));
    
    // Select "test" queue from jobs
    $queue = $jobs->connect('test');
    
    // or create a new queue
    $queue = $jobs->create(new MemoryCreateInfo('local'));
    
    // Set default auto ack for all tasks
    $queue = $queue->withDefaultOptions(
         $options->withAutoAck(true)
    );
    
    // Create a new task with custom auto ack
    $task = $queue->push(
         'task_name', 
         ['foo' => 'bar'], 
         (new Options())->withAutoAck(false)
    );
    
    // or change auto ack for created task
    $task = $queue->create(
         'task_name', 
         ['foo' => 'bar']
    )->withAutoAck(false);
    
    $queue->dispatch($task);
    

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.0.5...v2.1.0

    Source code(tar.gz)
    Source code(zip)
  • v2.0.5(Jan 19, 2022)

    What's Changed

    • Fixes problem with queue "is paused" state checking by @butschster in https://github.com/spiral/roadrunner-jobs/pull/12

    New Contributors

    • @butschster made their first contribution in https://github.com/spiral/roadrunner-jobs/pull/12

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.0.4...v2.0.5

    Source code(tar.gz)
    Source code(zip)
  • v2.0.4(Jan 18, 2022)

    What's Changed

    • dont send the empty headers to RR by @sergey-telpuk in https://github.com/spiral/roadrunner-jobs/pull/11
    • chore: change ramsey/uuid dependency version by @sinhix in https://github.com/spiral/roadrunner-jobs/pull/10

    New Contributors

    • @sinhix made their first contribution in https://github.com/spiral/roadrunner-jobs/pull/10

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.0.2...v2.0.4

    Source code(tar.gz)
    Source code(zip)
  • v2.0.2(Nov 30, 2021)

    What's Changed

    • Replace queue key with name by @roxblnfk in https://github.com/spiral/roadrunner-jobs/pull/7
    • deleted $this->complete(); from __destruct by @sergey-telpuk in https://github.com/spiral/roadrunner-jobs/pull/9

    New Contributors

    • @roxblnfk made their first contribution in https://github.com/spiral/roadrunner-jobs/pull/7
    • @sergey-telpuk made their first contribution in https://github.com/spiral/roadrunner-jobs/pull/9

    Full Changelog: https://github.com/spiral/roadrunner-jobs/compare/v2.0.0...v2.0.1

    Source code(tar.gz)
    Source code(zip)
  • v2.0.0-rc1(Sep 2, 2021)

  • v2.0.0-beta1(Aug 20, 2021)

Owner
Spiral Scout
Spiral Scout is a full-service digital agency, providing design, development and online marketing services to businesses around San Francisco and beyond.
Spiral Scout
PhpCodeAnalyzer scans codebase and analyzes which non-built-in php extensions used

PhpCodeAnalyzer PhpCodeAnalyzer finds usage of different non-built-in extensions in your php code. This tool helps you understand how transportable yo

Sergey 89 Jan 14, 2022
Generate API documentation for humans from your Laravel codebase.✍

Scribe v3 is out now! Scribe helps you generate API documentation for humans from your Laravel/Lumen/Dingo codebase. See a live example at demo.scribe

Knuckles 1k Jan 9, 2023
Official OpenMage LTS codebase | Migrate easily from Magento Community Edition in minutes

Official OpenMage LTS codebase | Migrate easily from Magento Community Edition in minutes! Download the source code for free or contribute to OpenMage LTS | Security vulnerability patches, bug fixes, performance improvements and more.

OpenMage 782 Jan 3, 2023
This repository contains research materials and dev notes for the DSM research

DSM Research This repository contains a loosely-organized information regarding the processes of DSM loading. A lot of information present here was co

DSM 11 Jun 28, 2021
This Repository contains a custom Workflow for Alfred which provides the function to instantly search in the Magento 2 DevDocs

Introduction Add the custom search to your Alfred Workflow and have a quicker access to the Magento 2 DevDocs. Installation Just download the alfredwo

David Lambauer 10 Jun 29, 2022
This repository contains academic codes from experiments and labs I did during my academic years.

Table Of Content Semester 3 Business Communication Skills Computer Graphics Digital Electronics and Logic Design Fundamentals of Data Structures Human

Pratik Pingale 13 Nov 29, 2022
Main ABRouter product repository that contains docker-compose file and orchestrates the project containers.

ABRouter-Compose ?? ABRouter is the open-source tool to perform and track A/B tests which is also known as the experiments. Additionally, feature flag

ABRouter 29 Dec 22, 2022
This repository contains the code for the front end/UI of the login system

Bug-free-login This repository contains the code for the front end/UI of the login system Requirements PHP 5.5.0 or higher. How to use Download ZIP wi

Abhijeet Kumar 2 Oct 6, 2022
Kirby 3 Plugin for running jobs like cleaning the cache from within the Panel, PHP code, CLI or a cronjob

Kirby 3 Janitor Kirby 3 Plugin for running jobs. It is a Panel Button! It has jobs build-in for cleaning the cache, sessions, create zip-backup, pre-g

Bruno Meilick 68 Dec 21, 2022
A plugin manager for PocketMine-MP downloads plugin from PocketMine-MP official plugin repository

oh-my-pmmp A plugin manager for PocketMine-MP Getting Started Prerequisites Your server MUST RUN the latest version of PocketMine. Installation From P

thebigcrafter 6 Jan 4, 2023
WordPress plugin which contains a collection of modules to apply theme-agnostic front-end modifications

Soil A WordPress plugin which contains a collection of modules to apply theme-agnostic front-end modifications. Soil is a commercial plugin available

Roots 1k Dec 20, 2022
Improve default Magento 2 Import / Export features - cron jobs, CSV , XML , JSON , Excel

Improve default Magento 2 Import / Export features - cron jobs, CSV , XML , JSON , Excel , mapping of any format, Google Sheet, data and price modification, improved speed and a lot more!

Firebear Studio 173 Dec 17, 2022
A fast, reliable, and secure NPM/Yarn bridge for Composer

Foxy is a Composer plugin to automate the validation, installation, updating and removing of PHP libraries asset dependencies (javaScript, stylesheets

Fxp 160 Dec 2, 2022
Sandbox for figuring out why the Alpine + Turbo bridge is broken

Podcaster A Turn-Key Podcasting Starter Kit for Statamic 3 Features This kit is deceptively simple – it may look like a 3 page site but there's a whol

Jack McDade 1 Mar 25, 2022
An alternative to run cron jobs that uses simple HTTP requests

SilverStripe Simple Jobs An alternative to run cron jobs that uses simple HTTP requests. This module require SilverStripe CronTask. Why? Configuring c

Thomas Portelange 1 Jul 4, 2022
Bridge to use Symfony Messenger on AWS Lambda with Bref

Bridge to use Symfony Messenger on AWS Lambda with Bref. This bridge allows messages to be dispatched to SQS, SNS or EventBridge, while workers handle

bref 58 Nov 15, 2022
This repository demonstrates exemplary implementation of chat using HTTP and Websocket servers in PHP using Kraken Framework components.

This repository demonstrates exemplary implementation of chat using HTTP and Websocket servers in PHP using Kraken Framework components.

Kraken 48 Aug 11, 2021
📦 "PHP type names" contains the list of constants for the available PHP data types.

PHP type names PHP type names ?? Description Simple library containing the list of constants for the available PHP data types. Use those constant type

♚ PH⑦ de Soria™♛ 4 Dec 15, 2022
A research raw data repository for researchers of Arba Minch University built using Codeigniter which follows MVC architecture. The front-end is build using Bootstrap.

Arba Minch University Dataset Repository This system is a research dataset repository for Arba Minch University researchers and is build using Codeign

Wuletaw Wonte 8 Jul 1, 2022