RoadRunner ⇆ Laravel bridge

Overview

logo

RoadRunnerLaravel bridge

Version Version Build Status Coverage Downloads count Chat License

Easy way for connecting RoadRunner and Laravel applications.

🐋 If you want to see an example of a laravel application in a docker container with RoadRunner as a web server - take a look at this repository.

Installation

Make sure that RR binary file already installed on your system (or docker image). Require this package with composer using next command:

$ composer require spiral/roadrunner-laravel "^5.2"

Installed composer is required (how to install composer).

After that you can "publish" package configuration file (./config/roadrunner.php) using next command:

$ php ./artisan vendor:publish --provider='Spiral\RoadRunnerLaravel\ServiceProvider' --tag=config

Important: despite the fact that worker allows you to refresh application instance on each HTTP request (if worker started with option --refresh-app, eg.: php ./vendor/bin/rr-worker start --refresh-app), we strongly recommend avoiding this for performance reasons. Large applications can be hard to integrate with RoadRunner (you must decide which of service providers must be reloaded on each request, avoid "static optimization" in some cases), but it's worth it.

Upgrading guide

v4.xv5.x

  • Update current package in your application:
    • composer remove spiral/roadrunner-laravel
    • composer require spiral/roadrunner-laravel "^5.0"
  • Update package configuration file (roadrunner.php; take a look for actual example in current repository)

v3.xv4.x

  • Update current package in your application:
    • composer remove spiral/roadrunner-laravel
    • composer require spiral/roadrunner-laravel "^4.0"
  • Update your .rr.yaml config (take a look for sample here) - a lot of options was changed
    • Optionally change relay to socket or TCP port:
      server:
        command: "php ./vendor/bin/rr-worker start --relay-dsn unix:///var/run/rr-relay.sock"
        relay: "unix:///var/run/rr-relay.sock"
  • Update RR binary file (using roadrunner-cli or download from binary releases page) up to v2.x
  • Update RoadRunner starting (rr serve ...) flags - -v and -d must be not used anymore
  • In your application code replace Spiral\RoadRunner\PSR7Client with Spiral\RoadRunner\Http\PSR7Worker

Usage

After package installation you can use provided "binary" file as RoadRunner worker: ./vendor/bin/rr-worker. This worker allows you to interact with incoming requests and outgoing responses using laravel events system. Event contains:

Event classname Application object HTTP server request HTTP request HTTP response Exception
BeforeLoopStartedEvent
BeforeLoopIterationEvent
BeforeRequestHandlingEvent
AfterRequestHandlingEvent
AfterLoopIterationEvent
AfterLoopStoppedEvent
LoopErrorOccurredEvent

Simple .rr.yaml config example (full example can be found here):

For windows path must be full (eg.: php vendor/spiral/roadrunner-laravel/bin/rr-worker start)

server:
  command: "php ./vendor/bin/rr-worker start --relay-dsn unix:///var/run/rr-relay.sock"
  relay: "unix:///var/run/rr-relay.sock"

http:
  address: 0.0.0.0:8080
  middleware: ["headers", "gzip"]
  pool:
    max_jobs: 64 # feel free to change this
    supervisor:
      exec_ttl: 60s
  headers:
    response:
      X-Powered-By: "RoadRunner"
  static:
    dir: "public"
    forbid: [".php"]

Socket or TCP port relay usage is strongly recommended for avoiding problems with dd(), dump(), echo() and other similar functions, that sends data to the IO pipes.

Roadrunner server starting:

$ rr serve -c ./.rr.yaml

Listeners

This package provides event listeners for resetting application state without full application reload (like cookies, HTTP request, application instance, service-providers and other). Some of them already declared in configuration file, but you can declare own without any limitations.

Helpers

This package provides the following helpers:

Name Description
\rr\dump(...) Dump passed values (dumped result will be available in the HTTP response)
\rr\dd(...) Dump passed values and stop the execution
\rr\worker() Easy access to the RoadRunner PSR worker instance

Known issues

Controller constructors

You should avoid to use HTTP controller constructors (created or resolved instances in a constructor can be shared between different requests). Use dependencies resolving in a controller methods instead.

Bad:

<?php

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * The user repository instance.
     */
    protected $users;

    /**
     * @var Request
     */
    protected $request;

    /**
     * @param UserRepository $users
     * @param Request        $request
     */
    public function __construct(UserRepository $users, Request $request)
    {
        $this->users   = $users;
        $this->request = $request;
    }

    /**
     * @return Response
     */
    public function store(): Response
    {
        $user = $this->users->getById($this->request->id);

        // ...
    }
}

Good:

<?php

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * @param  Request        $request
     * @param  UserRepository $users
     *
     * @return Response
     */
    public function store(Request $request, UserRepository $users): Response
    {
        $user = $users->getById($request->id);

        // ...
    }
}

Middleware constructors

You should never to use middleware constructor for session, session.store, auth or auth Guard instances resolving and storing in properties (for example). Use method-injection or access them through Request instance.

Bad:

<?php

use Illuminate\Http\Request;
use Illuminate\Session\Store;

class Middleware
{
    /**
     * @var Store
     */
    protected $session;

    /**
     * @param Store $session
     */
    public function __construct(Store $session)
    {
        $this->session = $session;
    }

    /**
     * Handle an incoming request.
     *
     * @param Request  $request
     * @param \Closure $next
     *
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $name = $this->session->getName();

        // ...

        return $next($request);
    }
}

Good:

<?php

use Illuminate\Http\Request;

class Middleware
{
    /**
     * Handle an incoming request.
     *
     * @param Request  $request
     * @param \Closure $next
     *
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $name = $request->session()->getName();
        // $name = resolve('session')->getName();

        // ...

        return $next($request);
    }
}

Testing

For package testing we use phpunit framework and docker-ce + docker-compose as develop environment. So, just write into your terminal after repository cloning:

$ make build
$ make latest # or 'make lowest'
$ make test

Changes log

Release date Commits since latest release

Changes log can be found here.

Support

Issues Issues

If you find any package errors, please, make an issue in a current repository.

License

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

Comments
  • Disk problem on uploading files.

    Disk problem on uploading files.

    First, Thanks for the great package!

    I found that lots of temporary files remained in the tmp directory after file uploading. Temporary files will be removed for every request if using nginx + fpm. Is something not working or do I need to hook an event to remove it?

    type:question 
    opened by ay4toh5i 19
  • How to configure Auth0?

    How to configure Auth0?

    If you have any questions feel free to ask

    Hi, me again. I'm currently running an application on Laravel and have sucessfully configured roadrunner-laravel, however my application is using Auth0 authentication.

    Is there an easy way to configure auth0? Or at least some documentation or pointers on what should I configure in order for it to work?

    The error I'm getting is:

    InvalidArgumentException
    Authentication user provider [auth0] is not defined. 
    
    type:question 
    opened by ant100 15
  • Memory leak

    Memory leak

    Describe the bug

    If you request a page that does not exist (error 404), there is a memory leak.

    And after several such requests Worker is closed because the memory consumption limit is exceeded.

    Steps to reproduce the behavior:

    It is easy to reproduce. Create a new clean Laravel 7 project, launch it under RR (with unlimited number of requests for Worker) and make a hundred calls to a page that does not exist and watch the log.

    status:pending priority:high 
    opened by nitrogenium 12
  • How to set up Laravel public directory for assets?

    How to set up Laravel public directory for assets?

    Hi! For some reason, the route to Laravel's public directory (where all my assets are) is not being recognized.

    Currently all routes to assets inside the public directory are something like:

    /css/main.css

    however this is returning a laravel 404 not found. I even tried to directly type:

    /public/css/main.css

    but got the same 404 not found page. This is laravel's page though, which is weird because it's a default application, the only thing I did was add a css subfolder inside of public folder.

    Got the exact same application running on Apache with no problem, so I figured this could be a RR configuration issue, maybe I need to set up the public directory in a config file somewhere?

    type:question 
    opened by ant100 10
  • Использование воркеров под разные плагины RR

    Использование воркеров под разные плагины RR

    Насколько я понимаю сейчас RR может работать только с HTTP и если, допустим, мне необходимо добавить TCP плагин, то мне необходимо для него использовать альтернытивный воркер со своим обработчиком TCP запросов

    type:enhancement 
    opened by butschster 9
  • Laminas\Diactoros\Exception\InvalidArgumentException: Invalid header value type; must be a string or numeric;

    Laminas\Diactoros\Exception\InvalidArgumentException: Invalid header value type; must be a string or numeric;

    Describe the bug

    If you want to install laravel 8 in the configuration file cors.php change the value of supports_credentials to true we get the following error

    Laminas\Diactoros\Exception\InvalidArgumentException: Invalid header value type; must be a string or numeric; received NULL in /var/www/vendor/laminas/laminas-diactoros/src/HeaderSecurity.php:140
    Stack trace:
    #0 /var/www/vendor/laminas/laminas-diactoros/src/MessageTrait.php(399): Laminas\Diactoros\HeaderSecurity::assertValid(NULL)
    #1 [internal function]: Laminas\Diactoros\Response->Laminas\Diactoros\{closure}(NULL)
    #2 /var/www/vendor/laminas/laminas-diactoros/src/MessageTrait.php(402): array_map(Object(Closure), Array)
    #3 /var/www/vendor/laminas/laminas-diactoros/src/MessageTrait.php(213): Laminas\Diactoros\Response->filterHeaderValue(Array)
    #4 /var/www/vendor/symfony/psr-http-message-bridge/Factory/PsrHttpFactory.php(163): Laminas\Diactoros\Response->withHeader('access-control-...', Array)
    #5 /var/www/vendor/spiral/roadrunner-laravel/src/Worker.php(86): Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory->createResponse(Object(Illuminate\Http\Response))
    #6 /var/www/vendor/spiral/roadrunner-laravel/bin/rr-worker(77): Spiral\RoadRunnerLaravel\Worker->start(false)
    #7 {main}
    

    it seems to me that the fruitcake/laravel-cors package supplied by default with laravel 8 should be removed since roadrunner solves this case, and it may be worth documenting this moment

    System information

    PHP version 8,0,1 Current package version 3.7 RoadRunner version 1.9.2 Environment docker

    RoadRunner configuration file content

    rpc:
      enable: false
    
    http:
      address: 0.0.0.0:80
      ssl:
        port:     443
        redirect: false
      maxRequestSize: 200
    
      uploads:
        forbid: [ ".php", ".exe", ".bat" ]
        trustedSubnets: [ "10.0.0.0/8", "127.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "::1/128", "fc00::/7", "fe80::/10" ]
    
      workers:
        command: "php ./vendor/bin/rr-worker  --refresh-app --reset-redis-connections"
        relay: "pipes"
        user: ""
        pool:
          numWorkers: 16
          maxJobs: 64
          allocateTimeout: 60
          destroyTimeout: 60
    
    headers:
      cors:
        allowedOrigin: "*"
        allowedHeaders: "*"
        allowedMethods: "GET,POST,PUT,DELETE"
        allowCredentials: true
        exposedHeaders: "Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma"
        maxAge: 600
      response:
        "X-Powered-By": "RoadRunner"
    
    static:
      dir: "public"
      forbid: [ ".php", ".htaccess" ]
      response:
        "X-Powered-By": "RoadRunner"
    
    reload:
      interval: 1s
      patterns: [ ".php" ]
    
      services:
        http:
          dirs: [ "" ]
          recursive: true
    
    

    config/roadrunner.php - standart

    Additional context

    # https://hub.docker.com/_/php/
    FROM php:8.0-cli-alpine
    
    ENV RR_VERSION 1.9.2
    
    # Install dev dependencies
    RUN apk add --no-cache --virtual .build-deps \
        $PHPIZE_DEPS \
        curl-dev \
        libtool \
        libxml2-dev \
        postgresql-dev \
        sqlite-dev \
    
    # Install production dependencies
    && apk add --no-cache \
        bash \
        shadow \
        nano \
        curl \
        wget \
        freetype-dev \
        icu-dev \
        icu-libs \
        libc-dev \
        libjpeg-turbo-dev \
        libpng-dev \
        libzip-dev \
        make \
        oniguruma-dev \
        openssh-client \
        postgresql-libs \
        rsync \
        jpegoptim optipng pngquant gifsicle \
        zlib-dev \
    
    # Install PECL and PEAR extensions
    && pecl install \
        redis \
    
    # Enable PECL and PEAR extensions
    && docker-php-ext-enable \
        redis \
    
    # Configure php extensions
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    
    # Install php extensions
    && docker-php-ext-install \
        bcmath \
        calendar \
        curl \
        exif \
        gd \
        iconv \
        intl \
        mbstring \
        opcache \
        pdo \
        pdo_pgsql \
        pdo_sqlite \
        pcntl \
        sockets \
        tokenizer \
        xml \
        zip
    
    # Copy php.ini configuration
    COPY php.ini /usr/local/etc/php/conf.d/40-custom.ini
    # Copy opcache.ini configuration
    COPY opcache.ini /usr/local/etc/php/conf.d/opcache.ini
    
    # Install composer
    ENV COMPOSER_HOME /composer
    ENV PATH ./vendor/bin:/composer/vendor/bin:$PATH
    ENV COMPOSER_ALLOW_SUPERUSER 1
    RUN curl -s https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer
    
    # Download RoadRunner
    RUN mkdir /tmp/rr \
      && cd /tmp/rr \
      && echo "{\"require\":{\"spiral/roadrunner\":\"${RR_VERSION}\"}}" >> composer.json \
      && composer install \
      && vendor/bin/rr get-binary -l /usr/local/bin \
      && rm -rf /tmp/rr
    
    # Cleanup dev dependencies
    RUN apk del -f .build-deps && rm -rf /var/cache/apk/* && docker-php-source delete && rm -rf /tmp/pear
    
    RUN usermod -u 1000 www-data && groupmod -g 1000 www-data
    
    WORKDIR /var/www
    
    USER 1000:1000
    
    EXPOSE 80
    EXPOSE 443
    
    CMD ["/usr/local/bin/rr", "serve", "-c", "/var/www/.rr.yml", "-w", "/var/www", "-d"]
     
    
    type:bug 
    opened by sergey-yabloncev 8
  • Performance degradation with sessions. Laravel 8. Docker

    Performance degradation with sessions. Laravel 8. Docker

    Hello. I have a docker container with RoadrRunner and Laravel 8.16.1 by default. (clean install laravel new www)

    I try it many times: ab -n 1000 -c 100 "http://serverhost:8080/"

    I notice a degradation of app performance:

    3113.96 [#/sec]
    ....
    1024.88 [#/sec]
    539.06 [#/sec]
    439.41 [#/sec]
    

    If i remove in Http/Kernel.php in $middlewareGroups these lines:

    \Illuminate\Session\Middleware\StartSession::class, 
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class, 
    

    then performance not degrade:

    Requests per second:    2844.97 [#/sec] (mean)
    Time per request:       35.150 [ms] (mean)
    Time per request:       0.351 [ms] (mean, across all concurrent requests)
    

    I suppose I need to reset the sessions? Only with the default config, roadrunner-laravel does not work. How can I do it?

    Dockerfile

    FROM php:7.4-cli
    
    #COPY opcache.ini /usr/local/etc/php/conf.d/opcache.ini
    
    RUN apt-get update && apt-get install -y \
            curl \
      		vim \
      		libfreetype6-dev \
      		libjpeg62-turbo-dev \
      		libmcrypt-dev \
      		libpng-dev \
      		zlib1g-dev \
      		libxml2-dev \
      		libzip-dev \
      		libonig-dev \
      		graphviz \
      		libcurl4-openssl-dev \
      		pkg-config \
      		libpq-dev \
      		iputils-ping \
      		wget \
      		git
    
    # Install PHP Extensions
    RUN docker-php-ext-install -j$(nproc) iconv mbstring mysqli pdo_mysql zip \
        && docker-php-ext-install opcache \
        && docker-php-ext-enable opcache
    
    RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
    
    # Download RoadRunner
    ENV RR_VERSION 1.8.4
    RUN mkdir /tmp/rr \
      && cd /tmp/rr \
      && echo "{\"require\":{\"spiral/roadrunner\":\"${RR_VERSION}\"}}" >> composer.json \
      && composer install --ignore-platform-reqs \
      && vendor/bin/rr get-binary -l /usr/local/bin \
      && rm -rf /tmp/rr
    
    ## Copy RoadRunner config
    COPY config /etc/roadrunner
    
    WORKDIR /var/www
    
    CMD ["/usr/local/bin/rr", "serve", "-c", "/etc/roadrunner/.rr.yaml", "-w", "/var/www"]
    

    docker-compose.yml

    version: "3.7"
    services:
      roadrunner:
        build: ./images/roadrunner
        container_name: "roadrunner"
        ports:
          - 8080:8080
        volumes:
          - ./www:/var/www:cached
          - ./configs/roadrunner:/etc/roadrunner:cached
        network_mode: "host"
    

    .rr.yaml

    env:
    #APP_REFRESH: true
    
    http:
      address: 0.0.0.0:8080
      workers:
        command: 'php /var/www/vendor/bin/rr-worker' # for windows: `php vendor/spiral/roadrunner-laravel/bin/rr-worker`
    static:
      dir: 'public'
    
    reload:
     interval: 1s
     patterns: [".php"]
     services:
       http:
         dirs: [""]
         recursive: true
    
    priority:high status:accepted 
    opened by apoldev 8
  • move_uploaded_file() not working

    move_uploaded_file() not working

    Describe the bug

    I tried this code:

        $file = request()->file('user');
        $file->move($targetDir, $newfilename);
    

    will be get error:

    Could not move the file \"Z:\\USERTEMP\\sym4B1D.tmp\" to \"E:\\UploadTest\\test\\200911000005\\200911000005-1.jpg\" ()
    

    and I know this error comes from:

    vendor/symfony/http-foundation/File/UploadedFile.php:
    184            set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
    185            $moved = move_uploaded_file($this->getPathname(), $target);
    186            restore_error_handler();
    187            if (!$moved) {
    188                throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s).', $this->getPathname(), $target, strip_tags($error)));
    189            }
    
    

    My temporary solution:

        $file = request()->file('user');
        $targetPathName = $targetDir . DIRECTORY_SEPARATOR . $newfilename;
        try {
            $file->move($targetDir, $newfilename);
        } catch (\Exception $err) {
            try {
                rename($file->getPathname(), $targetPathName);
            } catch (\Exception $err2) {
                throw new \Symfony\Component\HttpFoundation\File\Exception\FileException($err->getMessage());
            }
        }
    

    Expectation

    Simply using $file->move(). Thank you.

    System information

    Key | Value ----------------------- | ---- PHP version | 8.0.6 Current package version | 4.0 RoadRunner version | 2 Environment | local on Windows platform

    RoadRunner configuration file content

    server:
      command: "php ./vendor/spiral/roadrunner-laravel/bin/rr-worker start"
    
    http:
      address: 0.0.0.0:8080
      middleware: ["headers", "static", "gzip"]
      pool:
        max_jobs: 64 # feel free to change this
        supervisor:
          exec_ttl: 60s
      headers:
        response:
          X-Powered-By: "RoadRunner"
        cors:
          allowed_origin: "*"
          allowed_headers: "*"
          allowed_methods: "*"
          allow_credentials: true
          exposed_headers: "Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,Server-Timing"
          max_age: 82600
      static:
        dir: "public"
        forbid: [".php"]
      http2:
        h2c: false
        max_concurrent_streams: 128
      uploads:
    #    dir: "z:\temp"
        forbid: [".php", ".exe", ".bat", ".sh"]
    
    logs:
    #  mode: production
    #  level: error
    
    reload:
      # sync interval
      interval: 1s
      # global patterns to sync
      patterns: [ ".php", ".env" ]
      # list of included for sync services
      services:
        http:
          # recursive search for file patterns to add
          recursive: true
          # ignored folders
          ignore: [ "vendor" ]
          # service specific file pattens to sync
          patterns: [ ".php", ".env", ".go", ".md" ]
          # directories to sync. If recursive is set to true,
          # recursive sync will be applied only to the directories in `dirs` section
          dirs: [ "." ]
    
    

    Package configuration file content

    <?php
    
    use Spiral\RoadRunnerLaravel\Events;
    use Spiral\RoadRunnerLaravel\Listeners;
    
    return [
        /*
        |--------------------------------------------------------------------------
        | Force HTTPS Schema Usage
        |--------------------------------------------------------------------------
        |
        | Set this value to `true` if your application uses HTTPS (required for
        | example for correct links generation).
        |
        */
    
        'force_https' => (bool) env('APP_FORCE_HTTPS', false),
    
        /*
        |--------------------------------------------------------------------------
        | Containers Pre Resolving
        |--------------------------------------------------------------------------
        |
        | Declared here abstractions will be resolved before events loop will be
        | started.
        |
        */
    
        'pre_resolving' => [
            'auth',
            'cache',
            'cache.store',
            'config',
            'cookie',
            'db',
            'db.factory',
            'encrypter',
            'files',
            'hash',
            'log',
            'router',
            'routes',
            'session',
            'session.store',
            'translator',
            'url',
            'view',
        ],
    
        /*
        |--------------------------------------------------------------------------
        | Event Listeners
        |--------------------------------------------------------------------------
        |
        | Worker provided by this package allows to interacts with request
        | processing loop using application events. Feel free to add your own event
        | listeners.
        |
        */
    
        'listeners' => [
            Events\BeforeLoopStartedEvent::class => [
                Listeners\FixSymfonyFileValidationListener::class,
            ],
    
            Events\BeforeLoopIterationEvent::class => [
                Listeners\EnableHttpMethodParameterOverrideListener::class,
                Listeners\RebindHttpKernelListener::class, // Laravel 7 issue: <https://git.io/JvPpf>
                Listeners\RebindViewListener::class,
                Listeners\RebindAuthorizationGateListener::class,
                Listeners\RebindBroadcastManagerListener::class,
                Listeners\RebindDatabaseManagerListener::class,
                Listeners\RebindMailManagerListener::class,
                Listeners\RebindNotificationChannelManagerListener::class,
                Listeners\RebindPipelineHubListener::class,
                Listeners\RebindQueueManagerListener::class,
                Listeners\RebindValidationFactoryListener::class,
                Listeners\CloneConfigListener::class,
                Listeners\UnqueueCookiesListener::class,
                Listeners\FlushAuthenticationStateListener::class,
                Listeners\ResetSessionListener::class,
                Listeners\ResetProvidersListener::class,
                Listeners\ResetLocaleStateListener::class,
    
                // Listeners\ResetLaravelScoutListener::class, // for 'laravel/scout' package
                // Listeners\ResetLaravelSocialiteListener::class, // for 'laravel/socialite' package
                // Listeners\ResetInertiaListener::class, // for 'inertiajs/inertia-laravel' package
            ],
    
            Events\BeforeRequestHandlingEvent::class => [
                Listeners\RebindRouterListener::class,
                Listeners\InjectStatsIntoRequestListener::class,
                Listeners\BindRequestListener::class,
                Listeners\ForceHttpsListener::class,
                Listeners\SetServerPortListener::class,
            ],
    
            Events\AfterRequestHandlingEvent::class => [
                //
            ],
    
            Events\AfterLoopIterationEvent::class => [
                Listeners\FlushArrayCacheListener::class,
                Listeners\ResetDatabaseRecordModificationStateListener::class,
                Listeners\ClearInstancesListener::class,
                Listeners\RunGarbageCollectorListener::class,
            ],
    
            Events\AfterLoopStoppedEvent::class => [
                //
            ],
    
            Events\LoopErrorOccurredEvent::class => [
                Listeners\SendExceptionToStderrListener::class,
                Listeners\StopWorkerListener::class,
            ],
        ],
    
        /*
        |--------------------------------------------------------------------------
        | Instances Clearing
        |--------------------------------------------------------------------------
        |
        | Instances described here will be cleared on every request (if
        | `ClearInstancesListener` is enabled).
        |
        */
    
        'clear_instances' => [
            'auth', // is not required for Laravel >= v8.35
        ],
    
        /*
        |--------------------------------------------------------------------------
        | Reset Providers
        |--------------------------------------------------------------------------
        |
        | Providers that will be registered on every request (if
        | `ResetProvidersListener` is enabled).
        |
        */
    
        'reset_providers' => [
            Illuminate\Auth\AuthServiceProvider::class, // is not required for Laravel >= v8.35
            // App\Your\Custom\AuthServiceProvider::class,
            Illuminate\Pagination\PaginationServiceProvider::class, // is not required for Laravel >= v8.35
    	    App\Libs\Passport\PassportServiceProvider::class,
    	    App\Libs\ServerTiming\ServerTimingServiceProvider::class,
    
        ],
    ];
    

    Additional context

    Add any other context about the problem here.

    type:bug priority:medium status:accepted 
    opened by francsiswanto 7
  • State resetting for the tighten/ziggy package

    State resetting for the tighten/ziggy package

    Сейчас при после пары обновлений страницы при использовании Jetstream с InertiaJs появляется ошибка.

    Uncaught ReferenceError: Ziggy is not defined
    Uncaught (in promise) ReferenceError: route is not defined
    

    Причина ошибки связана с пакетом tightenco/ziggy в классе Tightenco\Ziggy\BladeRouteGenerator.

    Сброс состояния в BladeRouteGenerator::$generated = false решает проблему.

    type:enhancement 
    opened by butschster 6
  • Windows Error:

    Windows Error: "server_command_scan: scan failed, possible path not found"

    Describe the bug

    This is my first attempt at using Roadrunner. The API app works using nginx without any issues.

    Can't start Roadrunner because of the following error. See the console log below for details.

    "error": "server_command_scan: scan failed, possible path not found".

    Created rr-worker-test based on rr-worker and added additional fwrites for debugging. See the code in the Additional context section.

    • The autoload file was found except it isn't there. Is it supposed to be require vendor\autoload or a Roadrunner autoload file?
    • The base path is correct

    Is there a way to identify path error(s) since nothing is displayed or logged in the PHP error log?

    Expected behaviour

    Roadrunner starts without errors ;)

    Actual behaviour

    .\rr serve -c .rr.light.yaml

    2021-07-06T10:11:52.294-0400    ←[96mINFO←[0m   ←[92mserver      ←[0m   server/plugin.go:100    scan command        {"error": "server_command_scan: scan failed, possible path not found"}
    2021-07-06T10:11:52.295-0400    ←[97mDEBUG←[0m  ←[92mrpc         ←[0m   rpc/plugin.go:85        Started RPC service {"address": "tcp://127.0.0.1:6001", "services": ["informer", "resetter", "status"]}
    2021-07-06T10:11:52.728-0400    INFO   server         server/plugin.go:262    Auto Loader: checking path ../../..
    2021-07-06T10:11:52.740-0400    INFO   server         server/plugin.go:262    Auto Loader: found C:\projects\www\rcycles\rcycles-api\vendor\spiral\roadrunner-laravel\bin/../../../autoload.php
    2021-07-06T10:11:52.755-0400    INFO   server         server/plugin.go:262    App path: checking path ../../../..
    Application Base Path: found C:\projects\www\rcycles\rcycles-api
    2021-07-06T10:11:52.878-0400    ERROR   container/poller.go:16  vertex got an error     {"vertex id": "http.Plugin", "error": "http_plugin_serve: WorkerAllocate:\n\tserver_plugin_new_worker_pool:\n\tstatic_pool_initialize:\n\tallocate workers:\n\tfactory_spawn_worker_with_timeout: fetch_pid: CRC mismatch; exit status 1; process_wait: exit status 1"}
    github.com/spiral/endure/pkg/container.(*Endure).poll.func1
            github.com/spiral/[email protected]/pkg/container/poller.go:16
    error occurred: http_plugin_serve: WorkerAllocate:
            server_plugin_new_worker_pool:
            static_pool_initialize:
            allocate workers:
            factory_spawn_worker_with_timeout: fetch_pid: CRC mismatch; exit status 1; process_wait: exit status 1, plugin: http.Plugin
    handle_serve_command: http_plugin_serve: WorkerAllocate:
            server_plugin_new_worker_pool:
            static_pool_initialize:
            allocate workers:
            factory_spawn_worker_with_timeout: fetch_pid: CRC mismatch; exit status 1; process_wait: exit status 1; fsm_recognizer: can't transition from state: Stopped by event Stop
    
    

    Steps to reproduce

    1. Installed RoadRunner binary roadrunner-2.3.1-windows-amd64.zip
    2. composer require spiral/roadrunner-laravel
    3. Copied roadrunner.php to config directory and commented out proviers not required for Laravel version newer than 8.35
    4. Created minimal yaml config, .rr.light.yaml
    5. Run .\rr serve -c .rr.light.yaml from PowerShell

    System information

    Key | Value ----------------------- | ---- PHP version | 7.4.20 Current package version | 5.0.2 RoadRunner version | 2.3.1 (tried 2.2.1 - same error) Environment | local Windows 10 laravel/framework | 8.49.1

    RoadRunner configuration file content

    .rr.light.yaml:

    rpc:
      listen: tcp://127.0.0.1:6001
    
    server:
      # command: "php vendor/spiral/roadrunner-laravel/bin/rr-worker"
      command: "php vendor/spiral/roadrunner-laravel/bin/rr-worker-test"
      relay: pipes
      relay_timeout: 60s
    
    http:
      address: 0.0.0.0:8888
    
    static:
      dir: 'public'
    
    status:
      address: 0.0.0.0:8889
    

    Package configuration file content

    <?php
    
    use Spiral\RoadRunnerLaravel\Events;
    use Spiral\RoadRunnerLaravel\Defaults;
    use Spiral\RoadRunnerLaravel\Listeners;
    
    return [
        /*
        |--------------------------------------------------------------------------
        | Force HTTPS Schema Usage
        |--------------------------------------------------------------------------
        |
        | Set this value to `true` if your application uses HTTPS (required for
        | correct links generation, for example).
        |
        */
    
        'force_https' => (bool) env('APP_FORCE_HTTPS', false),
    
        /*
        |--------------------------------------------------------------------------
        | Event Listeners
        |--------------------------------------------------------------------------
        |
        | Worker provided by this package allows to interacts with request
        | processing loop using application events.
        |
        | Feel free to add your own event listeners.
        |
        */
    
        'listeners' => [
            Events\BeforeLoopStartedEvent::class => [
                ...Defaults::beforeLoopStarted(),
            ],
    
            Events\BeforeLoopIterationEvent::class => [
                ...Defaults::beforeLoopIteration(),
                // Listeners\ResetLaravelScoutListener::class,     // for <https://github.com/laravel/scout>
                // Listeners\ResetLaravelSocialiteListener::class, // for <https://github.com/laravel/socialite>
                // Listeners\ResetInertiaListener::class,          // for <https://github.com/inertiajs/inertia-laravel>
            ],
    
            Events\BeforeRequestHandlingEvent::class => [
                ...Defaults::beforeRequestHandling(),
                Listeners\InjectStatsIntoRequestListener::class,
            ],
    
            Events\AfterRequestHandlingEvent::class => [
                ...Defaults::afterRequestHandling(),
            ],
    
            Events\AfterLoopIterationEvent::class => [
                ...Defaults::afterLoopIteration(),
                Listeners\RunGarbageCollectorListener::class, // keep the memory usage low
            ],
    
            Events\AfterLoopStoppedEvent::class => [
                ...Defaults::afterLoopStopped(),
            ],
    
            Events\LoopErrorOccurredEvent::class => [
                ...Defaults::loopErrorOccurred(),
                Listeners\SendExceptionToStderrListener::class,
                Listeners\StopWorkerListener::class,
            ],
        ],
    
        /*
        |--------------------------------------------------------------------------
        | Containers Pre Resolving / Clearing
        |--------------------------------------------------------------------------
        |
        | The bindings listed below will be resolved before the events loop
        | starting. Clearing a binding will force the container to resolve that
        | binding again when asked.
        |
        | Feel free to add your own bindings here.
        |
        */
    
        'warm' => [
            ...Defaults::servicesToWarm(),
        ],
    
        'clear' => [
            ...Defaults::servicesToClear(),
            // 'auth', // is not required for Laravel >= v8.35
        ],
    
        /*
        |--------------------------------------------------------------------------
        | Reset Providers
        |--------------------------------------------------------------------------
        |
        | Providers that will be registered on every request.
        |
        | Feel free to add your service-providers here.
        |
        */
    
        'reset_providers' => [
            ...Defaults::providersToReset(),
            // Illuminate\Auth\AuthServiceProvider::class,             // is not required for Laravel >= v8.35
            // Illuminate\Pagination\PaginationServiceProvider::class, // is not required for Laravel >= v8.35
        ],
    ];
    

    Additional context

    vendor/spiral/roadrunner-laravel/bin/rr-worker-test:

    #!/usr/bin/env php
    <?php
    
    declare(strict_types=1);
    
    \define('RR_WORKER_START', \microtime(true));
    
    \ini_set('display_errors', 'stderr');
    
    /*
    |--------------------------------------------------------------------------
    | Register The Auto Loader
    |--------------------------------------------------------------------------
    |
    | Composer provides a convenient, automatically generated class loader
    | for our application. We just need to utilize it! We'll require it
    | into the script here so that we do not have to worry about the
    | loading of any our classes "manually". Feels great to relax.
    |
    */
    
    $loaded = false;
    
    foreach (['../../..', '../..', '..', 'vendor', '../vendor', '../../vendor'] as $path) {
        \fwrite(\STDERR, "Auto Loader: checking path $path" . PHP_EOL);
    
        if (\is_file($autoload_file = __DIR__ . '/' . $path . '/autoload.php')) {
            require $autoload_file;
            $loaded = true;
            \fwrite(\STDERR, "Auto Loader: found $autoload_file" . PHP_EOL);
            break;
        }
    }
    
    if ($loaded !== true) {
        \fwrite(\STDERR, 'Composer autoload file was not found. Try to install project dependencies' . PHP_EOL);
        exit(1);
    }
    
    /*
    |--------------------------------------------------------------------------
    | Find Application Base Path
    |--------------------------------------------------------------------------
    |
    | This file can be located in package `./bin` directory, used as a symbolic
    | link or something else. In this case we will try to find application
    | base directory using the most obvious application locations.
    |
    */
    
    /** @var string|null $base_path */
    $base_path = null;
    
    foreach (['../../../..', '../../..', '../..', '..', '../vendor/laravel/laravel'] as $path) {
        \fwrite(\STDERR, "App path: checking path $path" . PHP_EOL);
    
        if (\is_file(__DIR__ . '/' . $path . '/bootstrap/app.php')) {
            $base_path = (string) \realpath(__DIR__ . '/' . $path);
            \fwrite(\STDERR, "Application Base Path: found $base_path" . PHP_EOL);
            break;
        }
    }
    
    // last chance to bail
    if ($base_path == null) {
        \fwrite(\STDERR, 'Project base path was not found.' . PHP_EOL);
        exit(2);
    }
    
    /*
    |--------------------------------------------------------------------------
    | Create And Run Console Application
    |--------------------------------------------------------------------------
    |
    | Symfony console component is a nice wrapper around worker CLI options.
    |
    */
    
    $app = new \Symfony\Component\Console\Application(
        'RoadRunner worker',
        \Composer\InstalledVersions::getPrettyVersion('spiral/roadrunner-laravel') ?? 'unknown'
    );
    
    $app->add(new \Spiral\RoadRunnerLaravel\Console\Commands\StartCommand(
        new \Spiral\RoadRunnerLaravel\Worker(),
        $base_path
    ));
    
    $app->run();
    
    type:question 
    opened by DragonI 6
  • Add ability to change connection method

    Add ability to change connection method

    Description

    Added

    • Enabling command line control of the connection method

    Fixes # (issue) #33

    Checklist

    • [ ] My code follows the style guidelines of this project
    • [ ] I have performed a self-review of my own code
    • [ ] I have commented my code, particularly in hard-to-understand areas
    • [ ] I wrote unit tests for my code (if tests is required for my changes)
    • [ ] I have made changes in CHANGELOG.md file
    opened by eldario 6
Releases(v5.9.0)
  • v5.9.0(Feb 12, 2022)

  • v5.8.0(Feb 10, 2022)

    Added

    • Listener CleanupUploadedFilesListener for removing temporary files which were created during uploading (must be enabled manually for the AfterLoopIterationEvent event) #84
    Source code(tar.gz)
    Source code(zip)
  • v5.7.0(Feb 9, 2022)

  • v5.6.0(Jan 13, 2022)

    Added

    • Give the current App instance to FilesystemManager (listener RebindFilesystemManagerListener) #77
    • Monolog state resetting between requests (listener FlushMonologStateListener) #77
    Source code(tar.gz)
    Source code(zip)
  • v5.5.0(Nov 12, 2021)

  • v5.4.0(Oct 6, 2021)

  • v5.3.0(Sep 30, 2021)

    Added

    • Possibility to use different classes of workers for different worker modes [#65]
    • Integration with Ziggy is supported now [#64]

    Changed

    • Listeners (resetters) for the 3rd party packages are enabled by default
    Source code(tar.gz)
    Source code(zip)
  • v5.2.2(Aug 13, 2021)

  • v5.2.1(Aug 12, 2021)

  • v5.2.0(Jul 16, 2021)

  • v5.1.0(Jul 8, 2021)

  • v5.0.2(Jun 26, 2021)

  • v5.0.1(Jun 10, 2021)

  • v5.0.0(Jun 10, 2021)

    Added

    • Listener RebindDatabaseSessionHandlerListener for the database session driver container rebinding [octane#300]
    • Listener WarmInstancesListener for instances pre-resolving

    Changed

    • Most important configuration values (such as event listeners) now defined in Spiral\RoadRunnerLaravel\Defaults class and used by the package configuration file (in the future, you will not need to update your config file manually when new "core" listeners will be added)
    • Dependency laminas/laminas-diactoros replaced with nyholm/psr7 (lightweight PSR-7 implementation, strict and fast)
    • Config option pre_resolving replaced with warm
    • Config option clear_instances replaced with clear
    • Worker code refactored

    :warning: Do not forget to update your configuration (file config/roadrunner.php) :warning:

    Source code(tar.gz)
    Source code(zip)
  • v4.1.0(May 19, 2021)

    Added

    • Possibility to "dump" (using Symfony VarDumper) any variables in HTTP context (just call \rr\dump(...) or \rr\dd(...) instead dump(...) or dd(...) in your code)
    • Function \rr\worker() for easy access to the RoadRunner PSR worker instance (available only in HTTP context, of course)
    • Listener FlushArrayCacheListener for flushing array-based cache storages
    • Listener FlushAuthenticationStateListener for authentication state flushing
    • Listener RebindAuthorizationGateListener for the authorization gate container rebinding
    • Listener RebindBroadcastManagerListener for the broadcast manager container rebinding
    • Listener RebindDatabaseManagerListener for the database manager container rebinding
    • Listener RebindMailManagerListener for the mail manager container rebinding and resolved mailer instances clearing
    • Listener RebindNotificationChannelManagerListener for the notification channel manager container rebinding and resolved driver instances clearing
    • Listener RebindPipelineHubListener for the pipeline hub container rebinding
    • Listener RebindQueueManagerListener for the queue manager container rebinding
    • Listener RebindValidationFactoryListener for the validator container rebinding
    • Listener ResetDatabaseRecordModificationStateListener for resetting the database record modification state
    • Listener ResetLocaleStateListener for the translator locale resetting
    • Integration with inertiajs (package inertiajs/inertia-laravel) is supported now (just enable ResetInertiaListener for BeforeLoopIterationEvent)
    • Integration with Laravel Scout is supported now (just enable ResetLaravelScoutListener for BeforeLoopIterationEvent)
    • Integration with Laravel Socialite is supported now (just enable ResetLaravelSocialiteListener for BeforeLoopIterationEvent)

    Changed

    • Listeners RebindHttpKernelListener, RebindRouterListener, RebindViewListener and UnqueueCookiesListener improved

    :warning: Do not forget to update your configuration (file config/roadrunner.php) :warning:

    return [
    
        // ...
    
        'listeners' => [
    
            // ...
    
            Events\BeforeLoopIterationEvent::class => [
                // ...
    
                // add the following classes:
                Listeners\RebindAuthorizationGateListener::class,
                Listeners\RebindBroadcastManagerListener::class,
                Listeners\RebindDatabaseManagerListener::class,
                Listeners\RebindMailManagerListener::class,
                Listeners\RebindNotificationChannelManagerListener::class,
                Listeners\RebindPipelineHubListener::class,
                Listeners\RebindQueueManagerListener::class,
                Listeners\RebindValidationFactoryListener::class,
                Listeners\FlushAuthenticationStateListener::class,
                Listeners\ResetLocaleStateListener::class,
            ],
    
            Events\AfterLoopIterationEvent::class => [
                // ...
    
                // add the following classes:
                Listeners\FlushArrayCacheListener::class,
                Listeners\ResetDatabaseRecordModificationStateListener::class,
            ],
        ],
    ];
    
    Source code(tar.gz)
    Source code(zip)
  • v4.0.1(Mar 12, 2021)

  • v4.0.0(Mar 12, 2021)

    Added

    • Package "binary" file allows using next options:
      • laravel-path for Laravel application base path changing
      • relay-dsn for RR relay changing (you can set tcp://localhost:6001, unix:///tmp/rpc.sock and others; pipes is used by default)
      • refresh-app for application instance refreshing on each incoming HTTP request (instead APP_REFRESH env variable)
    • Possibility to use unix socket or TCP port as a relay to communicate with RoadRunner
    • Spiral\RoadRunnerLaravel\WorkerOptionsInterface that describes worker starting options
    • Feature tests (phpunit) that uses real RR server running

    Changed

    • Minimal required PHP version now is 7.4
    • Dependency spiral/roadrunner (~1.8) changed with spiral/roadrunner-worker and spiral/roadrunner-http (^2.0)
    • RR worker instance binding for DI from Spiral\RoadRunner\PSR7Client to Spiral\RoadRunner\Http\PSR7Worker
    • Spiral\RoadRunnerLaravel\WorkerInterface::start accepts Spiral\RoadRunnerLaravel\WorkerOptionsInterface now

    Removed

    • RR config file (.rr.yaml) publishing using artisan vendor:publish command
    • Listener Spiral\RoadRunnerLaravel\Listeners\ResetDbConnectionsListener
    Source code(tar.gz)
    Source code(zip)
  • v3.7.0(Dec 2, 2020)

    Added

    • Support PHP 8.x

    Changed

    • Composer 2.x is supported now
    • Minimal required PHP version now is 7.3 (7.2 security support ended January 1st, 2021)
    • Dev-dependency mockery/mockery minimal required version changed from ^1.3.1 to ^1.3.2
    • Dev-dependency phpstan/phpstan minimal required version changed from ~0.12 to ~0.12.34

    Removed

    • Code-style checking and fixing for local development (packages spiral/code-style and friendsofphp/php-cs-fixer does not supports PHP 8.x), but using GitHub this actions still running
    Source code(tar.gz)
    Source code(zip)
  • v3.6.0(Sep 9, 2020)

    Changed

    • Laravel 8.x is supported now
    • Minimal Laravel version now is 6.0 (Laravel 5.5 LTS got last security update August 30th, 2020)
    • Minimal spiral/roadrunner package version now is 1.8
    Source code(tar.gz)
    Source code(zip)
  • v3.5.0(Jul 10, 2020)

    Added

    • Listener EnableHttpMethodParameterOverrideListener for forced support of _method request parameter (for determining the intended HTTP method) #9

    Changed

    • Listener EnableHttpMethodParameterOverrideListener is enabled by default in the configuration file #9

    Fixed

    • Sending any form data with a DELETE or PUT method (the application ignored the hidden field _method and as a result the action necessary for the form did not occur) #9
    Source code(tar.gz)
    Source code(zip)
  • v3.4.0(May 22, 2020)

  • v3.3.0(May 22, 2020)

    Added

    • Event LoopErrorOccurredEvent (triggered on request processing exception)
    • Listener SendExceptionToStderrListener for direct exception sending (as a string) into stderr
    • Listener StopWorkerListener for worker stopping

    Changed

    • Default package configuration includes LoopErrorOccurredEvent event listeners: SendExceptionToStderrListener and StopWorkerListener #42
    • When "debug mode" (app.debug) is not enabled - client will get only Internal server error string instead exception with stacktrace #42

    Fixed

    • Double response sending on request processing error (calling $psr7_client->respond and $psr7_client->getWorker()->error after that)
    Source code(tar.gz)
    Source code(zip)
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
TCP Worker Client for RoadRunner 2.0 application server

RoadRunner TCP Plugin RoadRunner is an open-source (MIT licensed) high-performance PHP application server, load balancer, and process manager. It supp

Spiral Scout 8 Nov 26, 2022
(Experimental) Neos / Flow via Roadrunner

Roadrunner distribution This is an experimental distribution to run Neos / Flow via Roadrunner. Note: The Neos / Flow code currently needs patches to

Flowpack 1 May 4, 2022
基于 swoole 的多进程队列系统,低延时(最低毫秒级)、低资源占用, 支持一键化协程、超时控制、失败重试。可与 laravel thinkphp 等框架配合使用

multi-process-queue 基于swoole的多进程队列系统,manage进程管理子进程,master进程监听队列分发任务,worker进程执行任务, 多进程、低延时(最低毫秒级)、低资源占用。可与 laravel thinkphp 等框架配合使用 版本要求: php>=7.1 swoo

yuntian 55 Dec 12, 2022
This package provides some basic methods to implement a self updating functionality for your Laravel application. Already bundled are some methods to provide a self-update mechanism via Github or some private repository via http.

This package provides some basic methods to implement a self updating functionality for your Laravel 5 application. Already bundled are some methods to provide a self-update mechanism via Github.

Holger Lösken 311 Dec 31, 2022
A magic PHP framework. Build reactive web apps without writing HTML, CSS, or JavaScript! Powered by Tailwind, Alpine, Laravel, & Livewire.

Malzahar A magic PHP framework. Build reactive web apps without writing HTML, CSS, or JavaScript! Powered by Tailwind, Alpine, Laravel, & Livewire. Re

null 26 Nov 17, 2022
Supercharge your Laravel application's performance.

Introduction Laravel Octane supercharges your application's performance by serving your application using high-powered application servers, including

The Laravel Framework 3.3k Jan 1, 2023
I made my own simple php framework inspired from laravel framework.

Simple MVC About Since 2019, I started learning the php programming language and have worked on many projects using the php framework. Laravel is one

null 14 Aug 14, 2022
Awesome tips for Laravel

Awesome tips for Laravel

Laravel Daily 5.3k Jan 1, 2023
A set of ready-made regex helper methods for use in your Laravel application.

Regex A set of ready-made regex helper methods for use in your Laravel application. Installation composer require hotmeteor/regex Usage Regex comes wi

Adam Campbell 229 Dec 25, 2022
An intelligent code generator for Laravel framework that will save you time

An intelligent code generator for Laravel framework that will save you time! This awesome tool will help you generate resources like views, controllers, routes, migrations, languages and/or form-requests! It is extremely flexible and customizable to cover many of the use cases. It is shipped with cross-browsers compatible template, along with a client-side validation to modernize your application.

CrestApps 621 Jan 8, 2023
A modified version of the Laravel Framework

Hexavel Framework Hexavel is a restructured version of Laravel, with the purpose of providing better work flows which will simplify the development pr

Peter Fox 7 Nov 1, 2022
Laravel 5 nested category/menu generator

Laravel 5 Nestable Laravel Nestable to work with recursive logic. Category level there is no limit but this may vary depending on your server performa

Ahmet 217 Nov 15, 2022
Laravel 8 Project Restrict User Access From IP Addresses. prevent other ip address that want to access over secure api or urls.

block-ip-address-laravel Laravel 8 Project Restrict User Access From IP Addresses. prevent other ip address that want to access over secure api or url

Hasmukh Dharajiya 2 Mar 24, 2022
💡 Mudrock is a MVC PHP framework, which was inspired by the Laravel and CodeIgniter frameworks.

?? Mudrock is a MVC PHP framework, which was inspired by the Laravel and CodeIgniter frameworks

null 3 Nov 17, 2021
Trabajo 06 Laravel y el modelo MVC

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Miguel Angel Sotelo Palacios 1 Nov 15, 2021
Files Course Laravel Microservice E-mail

Curso Laravel Microservices com RabbitMQ (micro e-mail) Saiba Mais Sobre o Curso Requisitos Este micro e-mail depende do microservice 01, portanto, pr

EspecializaTi 9 Oct 21, 2021
LaravelS is an out-of-the-box adapter between Swoole and Laravel/Lumen.

?? LaravelS is an out-of-the-box adapter between Swoole and Laravel/Lumen.

Biao Xie 3.7k Dec 29, 2022
Generate auto numbers for your Laravel Model.

Generate Autonumbers for your Laravel Model This package can help you in creating autonumbers for your laravel model. You can create autonumbers using

Ishaan 1 Dec 5, 2021
I made my own simple php framework inspired from laravel framework.

Simple MVC About Since 2019, I started learning the php programming language and have worked on many projects using the php framework. Laravel is one

Rizky Alamsyah 14 Aug 14, 2022