Supercharge your Laravel application's performance.

Overview

Logo Laravel Octane

Build Status Total Downloads Latest Stable Version License

Introduction

Laravel Octane supercharges your application's performance by serving your application using high-powered application servers, including Swoole and RoadRunner. Octane boots your application once, keeps it in memory, and then feeds it requests at supersonic speeds.

Official Documentation

Documentation for Octane can be found on the Laravel website.

Contributing

Thank you for considering contributing to Octane! You can read the contribution guide here.

Code of Conduct

In order to ensure that the Laravel community is welcoming to all, please review and abide by the Code of Conduct.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

License

Laravel Octane is open-sourced software licensed under the MIT license.

Comments
  • Octane + Vapor

    Octane + Vapor

    This issue is as a result of this thread: https://twitter.com/aarondfrancis/status/1412539823139721223.

    I got ~Octane working with Vapor and told Taylor that I'd toss the code to y'all to potentially include as a first-party option.

    The Theory

    The theory is to use Octane to boot the application and then reuse that booted app over and over again. You can do this because Lamba will freeze the container, memory and all. So you boot the application, serve the request, and then Lambda freezes the application exactly as it is.

    When the next request comes in, Lambda will give you a warm container with the booted app from your last invocation. You're leveraging Octane to do the booting and cleaning, but not running any kind of server in the background.

    In Vapor's current handler code, you're already taking advantage of this saved invocation-to-invocation state to keep FPM "running". Obviously it doesn't run the entire time, but Lambda freezes it and picks it back up as if it had been running that whole time.

    My suggestion is to further take advantage of this unique Lambda quirk by keeping the application in (frozen) memory between invocations.

    The Code

    I took an extremely simple Laravel application that runs on Vapor and overwrote the Vapor FPM runtime to use Octane instead of FPM.

    This is just a proof of concept, there are definitely better ways to accomplish parts of this. For example, I pulled in all of bref/bref just to get access to a function that takes a Lambda Event and turns it into a PSR7 Request.

    The Octane Runtime

    The Octane Runtime is kind of an unholy union of the fpmRuntime from Vapor and the roadrunner-worker from Octane.

    This file goes in the base directory as octaneRuntime.php.

    <?php
    
    use Laravel\Octane\ApplicationFactory;
    use Laravel\Octane\Worker;
    use Laravel\Vapor\Runtime\Fpm\FpmLambdaResponse;
    use Illuminate\Contracts\Console\Kernel as ConsoleKernelContract;
    use Laravel\Vapor\Runtime\LambdaContainer;
    use Laravel\Vapor\Runtime\LambdaRuntime;
    use Laravel\Vapor\Runtime\Secrets;
    use Laravel\Vapor\Runtime\StorageDirectories;
    
    fwrite(STDERR, 'Preparing to add secrets to runtime' . PHP_EOL);
    
    $secrets = Secrets::addToEnvironment(
        $_ENV['VAPOR_SSM_PATH'],
        json_decode($_ENV['VAPOR_SSM_VARIABLES'] ?? '[]', true),
        __DIR__ . '/vaporSecrets.php'
    );
    
    with(require 'bootstrap/app.php', function ($app) {
        StorageDirectories::create();
    
        $app->useStoragePath(StorageDirectories::PATH);
    
        fwrite(STDERR, 'Caching Laravel configuration' . PHP_EOL);
    
        $app->make(ConsoleKernelContract::class)->call('config:cache');
    });
    
    $invocations = 0;
    
    $lambdaRuntime = LambdaRuntime::fromEnvironmentVariable();
    
    $vapor = new \App\OctaneVaporClient;
    
    try {
        $worker = new Worker(new ApplicationFactory(__DIR__), $vapor);
        $worker->boot();
    } catch (Throwable $e) {
        fwrite(STDERR, $e->getMessage());
        exit(1);
    }
    
    while (true) {
        $lambdaRuntime->nextInvocation(function ($invocationId, $event) use ($vapor, $worker) {
            [$request, $context] = $vapor->marshalRequestFromEvent($event);
    
            $response = null;
    
            $vapor->captureResponseUsing(function (FpmLambdaResponse $captured) use (&$response) {
                $response = $captured;
            });
    
            $worker->handle($request, $context);
    
            return $response->toApiGatewayFormat();
        });
    
        LambdaContainer::terminateIfInvocationLimitHasBeenReached(
            ++$invocations, (int)($_ENV['VAPOR_MAX_REQUESTS'] ?? 250)
        );
    }
    

    The idea here is to create and boot the worker outside of the loop, and then use it over and over in the event loop.

    The OctaneVaporClient

    The app\OctaneVaporClient.php is a tiny little client that doesn't do a whole lot. This is where I pull in the Psr7Bridge from bref, despite it being marked as internal only. If this were to pass the PoC stage, that would need to be looked at.

    <?php
    namespace App;
    
    use Bref\Context\Context;
    use Bref\Event\Http\HttpRequestEvent;
    use Bref\Event\Http\Psr7Bridge;
    use Illuminate\Foundation\Application;
    use Illuminate\Http\Request;
    use Illuminate\Http\Response;
    use Laravel\Octane\Contracts\Client;
    use Laravel\Octane\MarshalsPsr7RequestsAndResponses;
    use Laravel\Octane\OctaneResponse;
    use Laravel\Octane\RequestContext;
    use Laravel\Vapor\Runtime\Fpm\FpmLambdaResponse;
    use Throwable;
    
    class OctaneVaporClient implements Client
    {
        use MarshalsPsr7RequestsAndResponses;
    
        /**
         * @var callable
         */
        public $captureResponse;
    
        public function captureResponseUsing($callback)
        {
            $this->captureResponse = $callback;
        }
    
        public function marshalRequestFromEvent($event)
        {
            $request = new HttpRequestEvent($event);
            // @TODO ?
            $context = new Context('', 0, '', '');
    
            return $this->marshalRequest(new RequestContext([
                'psr7Request' => Psr7Bridge::convertRequest($request, $context)
            ]));
        }
    
        public function marshalRequest(RequestContext $context): array
        {
            // Exactly the same as the RoadRunnerClient
            return [
                $this->toHttpFoundationRequest($context->psr7Request),
                $context,
            ];
        }
    
        public function respond(RequestContext $context, OctaneResponse $response): void
        {
            /** @var Response $response */
            $response = $response->response;
    
            // Reusing the FpmLambdaResponse, just for now.
            $response = new FpmLambdaResponse($response->status(), $response->headers->all(), $response->getContent());
    
            call_user_func($this->captureResponse, $response);
        }
    
        public function error(Throwable $e, Application $app, Request $request, RequestContext $context): void
        {
            // @TODO: Implement error() method.
        }
    }
    

    Overwriting the FPM Runtime

    The last thing to do is muck around with Vapor to make it use the octaneRuntime instead of the fpmRuntime.

    For this proof of concept, I have a command that overwrites fpmRuntime.php in vapor-core. Obviously the goal would be for vapor-core to be updated to support Octane, but that only matters if this idea actually ends up working.

    For now, the app\Console\Commands\OctaneRuntime.php file is as follows:

    <?php
    
    namespace App\Console\Commands;
    
    use Illuminate\Console\Command;
    
    class OctaneRuntime extends Command
    {
        protected $signature = 'octane:runtime';
        
        protected $description = 'Overwrite the FPM handler with the Octane Handler';
    
        /**
         * Execute the console command.
         */
        public function handle()
        {
            file_put_contents(
                base_path('vendor/laravel/vapor-core/stubs/fpmRuntime.php'),
                file_get_contents(base_path('octaneRuntime.php'))
            );
        }
    }
    

    In your vapor.yml add php artisan octane:runtime as a build step. This will activate the new runtime! Now you can deploy and give it a test.

    Results

    In my testing on my very simple app, I was able to get cold boots from 1500ms down to 350ms, and invocation duration from 20-50ms down to 4ms. My app doesn't use much (it's just my personal website), but I'd imagine the gains would be bigger for bigger apps.

    Also memory usage dropped by ~30mb.

    before after

    Caveats

    This currently doesn't handle the warming ping, it will error out because it's not a proper Lambda Event. You'll see Fatal error: Uncaught Bref\Event\InvalidLambdaEvent: This handler expected to be invoked with a API Gateway or ALB event. Instead, the handler was invoked with invalid event data in the logs. Should be easy to fix, I just didn't think it was necessary at the moment.

    Taylor also mentioned something about database connections that might be an issue: https://twitter.com/taylorotwell/status/1412542866220584961

    Let me know what y'all think! I'd be happy to help where I can.

    enhancement 
    opened by aarondfrancis 21
  • Runtime Exception: Unable to write to process ID file. (Swoole + Docker)

    Runtime Exception: Unable to write to process ID file. (Swoole + Docker)

    • Octane Version: 0.1.0
    • Laravel Version: 8.36.0
    • PHP Version: 8.0.3
    • Database Driver & Version: PostgreSQL (libpq) Version => 13.2

    Description:

    Running a docker container, running laravel octane as root, shouldn't have permission issues.

      RuntimeException 
    
      Unable to write to process ID file.
    
      at vendor/laravel/octane/src/Swoole/ServerStateFile.php:62
         58▕      */
         59▕     public function writeState(array $newState): void
         60▕     {
         61▕         if (! is_writable($this->path) && ! is_writable(dirname($this->path))) {
      ➜  62▕             throw new RuntimeException('Unable to write to process ID file.');
         63▕         }
         64▕ 
         65▕         file_put_contents($this->path, json_encode(
         66▕             array_merge($this->read(), ['state' => $newState]),
    
          +27 vendor frames 
      28  artisan:37
          Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
    

    Steps To Reproduce:

    • Try to run octane in a docker container. (ENTRYPOINT ['php', 'artisan', 'octane:start'])

    Dockerfile to reproduce

    FROM php:latest
    RUN apt-get update && apt-get upgrade -y && apt-get install git -y
    COPY ./ /app/
    WORKDIR /app
    
    # Install Extensions (Swoole)
    ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
    RUN chmod +x /usr/local/bin/install-php-extensions && sync
    RUN install-php-extensions swoole
    
    # Install Source Code Dependencies
    ADD https://getcomposer.org/composer-stable.phar /usr/local/bin/composer
    RUN chmod +x /usr/local/bin/composer
    RUN composer install
    
    # Open Ports
    EXPOSE 8000
    
    # Entrypoint
    ENTRYPOINT ["php", "artisan", "octane:start", "--host=0.0.0.0"]
    
    opened by Elycin 17
  • The

    The "max_execution_time" setting has no effect with Roadrunner

    • Octane Version: 1.2.6
    • Laravel Version: 9.7.0
    • PHP Version: 8.0.17
    • Server & Version: RoadRunner 2.9.0

    Description

    Hello,

    I just created a new Laravel application by adding Octane and running it with Roadrunner. I tried to set the max_execution_time settings in the Octane configuration file, but it seems this setting has no effect.

    Steps To Reproduce:

    I followed the normal process:

    laravel new octane-timeout
    composer require laravel/octane
    php artisan octane:install (with Roadrunner)
    

    Then, I changed in config/octane.php file the max_execution_time setting by "3":

        /*
        |--------------------------------------------------------------------------
        | Maximum Execution Time
        |--------------------------------------------------------------------------
        |
        | The following setting configures the maximum execution time for requests
        | being handled by Octane. You may set this value to 0 to indicate that
        | there isn't a specific time limit on Octane request execution time.
        |
        */
    
        'max_execution_time' => 3,
    

    Then, I created a simple code in my routes/web.php file:

    Route::get('/', function () {
    	$i = 0;
    
    	while ($i < 40) {
    		$i++;
    		sleep(1);
    	}
    });
    
    

    And I started the server with:

    php artisan octane:start
    

    Instead of to get a "Max memory limit" (after 3 seconds), the code has been executed without any timeout. image

    To be sure, I cleared the configuration with:

    php artisan config:clear
    

    Also tried with:

    php artisan optimize
    

    According to the Roadrunner documentation and the file below, this setting should work: https://github.com/laravel/octane/blob/a6ac540eaa7524042af1355a5cf4e40b3445d60c/src/Commands/StartRoadRunnerCommand.php#L86

    Do you have an idea why?

    Thank you

    bug 
    opened by Baiquette 16
  • RoadRunner crashes with --watch, starting with version 2.9.3

    RoadRunner crashes with --watch, starting with version 2.9.3

    • Octane Version: 1.2.10
    • Laravel Version: v8.83.13
    • PHP Version: 8.1.6
    • Server & Version: RoadRunner 2.9.4
    • Database Driver & Version:

    Description:

    When using file watch the artisan octane:start process crashes. As the RoadRunner cli writes infos to the stderr.

    php artisan octane:start --watch  
    
       INFO  Server running…
    
      Local: http://127.0.0.1:8000 
    
      Press Ctrl+C to stop the server
    
    
       INFO  Application change detected. Restarting workers…
    
       RuntimeException 
    
      Cannot reload RoadRunner: 2022/05/20 08:07:16 resetting plugin: [http]
    
      at vendor/laravel/octane/src/RoadRunner/ServerProcessInspector.php:56
         52▕             'reset',
         53▕             '-o', "rpc.listen=tcp://$host:$rpcPort",
         54▕         ], base_path()))->start()->waitUntil(function ($type, $buffer) {
         55▕             if ($type === Process::ERR) {
      ➜  56▕                 throw new RuntimeException('Cannot reload RoadRunner: '.$buffer);
         57▕             }
         58▕ 
         59▕             return true;
         60▕         });
    
          +30 vendor frames 
      31  artisan:37
          Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
    

    Steps To Reproduce:

    1. Install RoadRunner 2.9.4
    2. start octane server with --watch
    3. Change a file so the server needs to be restarted
    4. Process ends with an error

    Possible solution to fix:

    What could be done to fix the issue is to execute the commands with the -s, --silent flag so the messages are not written.

    bug help wanted 
    opened by ResuBaka 15
  • Queue worker and scheduler

    Queue worker and scheduler

    Hello! I'm curious if you have plans to support a queue worker and scheduler in Octane? Since we now have a single process for php application and as I can see people already working on a websocket server implementation, that would be cool.

    Scheduler in Octane will also provide an option to schedule tasks with frequency less than 1 minute.

    needs more info 
    opened by ggolda 15
  • Add websocket support for swoole

    Add websocket support for swoole

    Seeing as Swoole supports websockets out of the box, it would be cool to have this as a configurable option.

    I had a quick play and simply changing Swoole\Http\Server to Swoole\Websocket\Server in bin/createSwooleServer.php appears to mostly work - I also had to define at least a single on("message") handler as well in bin/swoole-server before the server is started.

    The only roadblock I can think of is that I imagine @taylorotwell you may prefer it if websockets were tied in with native laravel auth/ event stuff? Currently it would be only raw socket messaging.

    enhancement 
    opened by deanmcpherson 15
  • Installation cannot be completed due to missing configuration file

    Installation cannot be completed due to missing configuration file

    • Octane Version: 1.0.11
    • Laravel Version: 8.60.0
    • PHP Version: 8.0.9
    • Server & Version: RoadRunner 2.4.2

    Description:

    Configuration can't fetched

    Steps To Reproduce:

    sail@854e48a27b0e:/var/www/html$ ./vendor/bin/rr get-binary
    
     Environment:
       - Version:          2.*
       - Stability:        stable
       - Operating System: linux
       - Architecture:     amd64
    
      - spiral/roadrunner-binary (2.4.2): Downloading...
    RoadRunner (2.4.2) has been installed into /var/www/html/rr
    
     Do you want create default ".rr.yaml" configuration file? (yes/no) [yes]:
     >
    
    
    In CommonResponseTrait.php line 181:
    
      HTTP/2 404  returned for "https://raw.githubusercontent.com/spiral/roadrunner-binary/2.4.2.0/.rr.yaml".
    
    
    get-binary [-o|--os [OS]] [-a|--arch [ARCH]] [-f|--filter [FILTER]] [-l|--location [LOCATION]] [-s|--stability [STABILITY]]
    

    Access url in browser also throws a "404".

    bug 
    opened by prodigy7 14
  • Response doesn't support stream-based output

    Response doesn't support stream-based output

    • Octane Version: 0.1.0
    • Laravel Version: 8.36.1
    • PHP Version: 8.0.3
    • Database Driver & Version:

    Description:

    Most of PHP's output usages like echo, var_dump output its content to buffer. In Swoole's case the result will print on console instead of web.

    It seems this partial code in SwooleClient.php refers from here https://github.com/laravel/octane/blob/08537a7ed6d2c463f76278081ac7af9a6dd1dead/src/Swoole/SwooleClient.php#L153-L178 because the output property doesn't exist in symfony's response object. The output property is set from here in swooletw/laravel-swoole.

    Symfony\Component\HttpFoundation\StreamedResponse doesn't support getContent and setContent for setting output content, so I fetch buffer output and set the result to response's output property manually.

    If Octane is going to support stream output, it needs to use ob_ functions to catch stream content as well.

    Many thanks to the official team for integrating Swoole into Laravel!

    Steps To Reproduce:

    echo 'hello world';
    
    var_dump('Swoole is awesome');
    
    response()->streamDownload(function () {
        echo file_get_contents("https://github.com/laravel/laravel/blob/8.x/README.md");
        }, 'laravel-readme.md');
    });
    
    needs more info 
    opened by albertcht 14
  • User is in cache/ram when fetched from construct

    User is in cache/ram when fetched from construct

    • Octane Version: 1.0.11
    • Laravel Version: 8.57.0
    • PHP Version: 8.0.10
    • Server & Version: Swoole 4.7.1

    Description:

    I was using laravel fortify and found that when the user information is updated, the changes are not reflected.

    Before opening this issue, I have done tests to find the problem and make sure that it is not something wrong that I have done, this is what I have found:

    For some reason, when the StatefulGuard bind is passed through the construct and then used in the controller method, it gets a cached user/ram.

    From what I have seen, in the class 'Illuminate\Auth\SessionGuard' in the method 'user()' when checking if(!is_null($this->user)) returns the user, the problem it is, as I have commented previously, the user data, it is not updated until the octane is restarted.

    Steps To Reproduce:

    Packages installed:

    "require": {
        "php": "^7.3|^8.0",
        "fruitcake/laravel-cors": "^2.0",
        "guzzlehttp/guzzle": "^7.0.1",
        "laravel/framework": "^8.54",
        "laravel/octane": "^1.0"
    },
    

    Service Provider:

    namespace App\Providers;
    
    use Illuminate\Contracts\Auth\StatefulGuard;
    use Illuminate\Support\Facades\Auth;
    use Illuminate\Support\ServiceProvider;
    
    class AppServiceProvider extends ServiceProvider
    {
        public function register()
        {
            $this->app->bind(StatefulGuard::class, function () {
                return Auth::guard();
            });
        }
    }
    
    

    Controller:

    namespace App\Http\Controllers;
    
    use Illuminate\Contracts\Auth\StatefulGuard;
    use Illuminate\Support\Facades\Auth;
    
    class TestController extends Controller
    {
        private $guard;
    
        public function __construct(StatefulGuard $guard)
        {
            $this->guard = $guard;
        }
    
        public function test()
        {
            dd([
                $this->guard->user()->name,
                Auth::guard()->user()->name,
                app(StatefulGuard::class)->user()->name
            ]);
        }
    
        public function login()
        {
            Auth::loginUsingId(1);
        }
    }
    

    Routes:

    Route::get('login', [TestController::class, 'login']);
    Route::get('test', [TestController::class, 'test']);
    

    Steps:

    1. Have the user system configured and have a user created.
    2. Go to /login to login with the user id 1.
    3. Go to /test to see the user's information, in my case the following will appear: username, username, username,
    4. Modify the username from the database or elsewhere (I have changed username to modified username).
    5. Go to /test to see the user's information, in my case the following will appear: username, modified username, modified username.
    6. Restart octane and go to /test to see the user's information, in my case the following will appear: modified username, modified username, modified username.

    As you can see, in step 5, the username is not updated.

    opened by mcolominas 13
  • Intermittent unresolvable dependency

    Intermittent unresolvable dependency

    • Octane Version: 0.5.0
    • Laravel Version: 8.4.0
    • PHP Version: 8.0
    • Server & Version: RoadRunner 2.1.1
    • Database Driver & Version: MySQL 8.0.23

    Description:

    I'm getting an intermittent error in our app when testing with Octane. It's always this error:

    Illuminate\Contracts\Container\BindingResolutionException
    Unresolvable dependency resolving [Parameter #0 [ <required> $methods ]] in class Illuminate\Routing\Route
    

    It happens on all URL's. But not all the time. It's pretty difficult to replicate.

    Some background details:

    We have both full-page Livewire components (routes point directly to Livewire) and normal controllers. We get this specific error on Livewire components only. Normal controllers seem to be loading an old version of the controller every now and then, multiple restarts made no difference.

    Switching to Swoole seems to fix the issue.

    If you need more information, let me know. This is a private repository but I'm OK sharing our code in private if needed.

    Steps To Reproduce:

    I was a little hesitant to open this issue because although it does happen, I have not been able to find a consistent way to replicate the issue :(

    opened by ju5t 13
  • The system environment variables got overrided by the .env

    The system environment variables got overrided by the .env

    • Octane Version: v0.4.2
    • Laravel Version: v8.38.0
    • PHP Version: 8.0.3
    • Server: Swoole / RoadRunner (Same issue with both runtime)
    • Database Driver & Version: Mysql 8.0

    Description:

    The system environment variables got override by the .env in Octane but not php-fpm or php-cli. The system environment variables shouldn't be override by the .env in Octane.

    Steps To Reproduce: (max and linux)

    1. Test the laravel/octane in composer.json to v0.2.0
    "laravel/octane": "~0.2.0",
    
    1. Add a test route to web.php
    Route::get('test-sys-vars', function() {
        var_dump($_ENV['DB_USERNAME']);
        var_dump(config('database.connections.mysql.username'));
        var_dump(getenv('DB_USERNAME'));
        var_dump(getenv('DB_USERNAME', true));
        dd(env('DB_USERNAME'));
    });
    
    1. Run command in the current Laravel project directory.
    export DB_USERNAME=example-app && php -dvariables_order=EGPCS artisan octane:start --server=roadrunner --host=0.0.0.0 --port=8000
    
    1. Make sure DB_USERNAME exists in the .env
    DB_USERNAME=homestead
    
    1. Browse http://localhost:8000/test-sys-vars and see result

    Then repeat 1 - 5 again with another version

    "laravel/octane": "^0.4.0",
    

    image

    needs more info 
    opened by litan1106 13
Releases(v1.3.10)
  • v1.3.10(Dec 23, 2022)

  • v1.3.9(Nov 22, 2022)

    Changed

    • Add --rpc-host option for Roadrunner by @matthew-inamdar in https://github.com/laravel/octane/pull/619

    Fixed

    • Resolve typo resulting in deprecation notice by @owenvoke in https://github.com/laravel/octane/pull/614
    Source code(tar.gz)
    Source code(zip)
  • v1.3.8(Nov 15, 2022)

  • v1.3.7(Nov 8, 2022)

  • v1.3.6(Nov 1, 2022)

    Changed

    • Re-do: Configurable Roadrunner log level by @ejulen in https://github.com/laravel/octane/pull/604

    Fixed

    • Read port for http server from environment if no port is passed by @hendrikheil in https://github.com/laravel/octane/pull/605
    Source code(tar.gz)
    Source code(zip)
  • v1.3.5(Oct 26, 2022)

  • v1.3.4(Oct 25, 2022)

    Changed

    • RoadRunner Relay Overrides by @pmccarren in https://github.com/laravel/octane/pull/600
    • Made Roadrunner log level configurable by @ejulen in https://github.com/laravel/octane/pull/601
    Source code(tar.gz)
    Source code(zip)
  • v1.3.3(Oct 4, 2022)

  • v1.3.2(Sep 30, 2022)

  • v1.3.1(Sep 6, 2022)

    Changed

    • Add possibility to launch swoole server with additional php options by @AbdelAbouhassane in https://github.com/laravel/octane/pull/570
    Source code(tar.gz)
    Source code(zip)
  • v1.3.0(Aug 3, 2022)

    Added

    • Adds support for Swoole 5 by @nunomaduro in https://github.com/laravel/octane/pull/560

    Fixed

    • Fix carbon locale when setting it via app locale setter by @nunomaduro in https://github.com/laravel/octane/pull/557
    Source code(tar.gz)
    Source code(zip)
  • v1.2.16(Jul 19, 2022)

  • v1.2.15(Jul 13, 2022)

  • v1.2.14(Jun 28, 2022)

  • v1.2.13(Jun 23, 2022)

  • v1.2.12(May 31, 2022)

  • v1.2.11(May 24, 2022)

    Changed

    • add silent option to RoadRunner reset to remove info output which leads to non error by @ResuBaka in https://github.com/laravel/octane/pull/525
    Source code(tar.gz)
    Source code(zip)
  • v1.2.10(May 17, 2022)

    Changed

    • Revert PaginationState to resolve using new instance of the app by @farmani in https://github.com/laravel/octane/pull/519

    Fixed

    • Warm transaction manager by @taylorotwell in https://github.com/laravel/octane/commit/752d02dc5973a11bf55f332eee0d9e5566442519
    Source code(tar.gz)
    Source code(zip)
  • v1.2.9(May 10, 2022)

  • v1.2.8(Apr 27, 2022)

  • v1.2.7(Apr 12, 2022)

    Fixed

    • Make the bin files used by Swoole and Roadrunner config options by @jedjones-uk in https://github.com/laravel/octane/pull/502
    • Force the processId to int by @sy-records in https://github.com/laravel/octane/pull/507
    Source code(tar.gz)
    Source code(zip)
  • v1.2.6(Apr 5, 2022)

  • v1.2.5(Mar 29, 2022)

  • v1.2.4(Mar 8, 2022)

  • v1.2.3(Feb 21, 2022)

  • v1.2.2(Feb 15, 2022)

    Changed

    • Listener for removing temporary files, which was created during uploading by @tarampampam in https://github.com/laravel/octane/pull/477
    • Fix passing null to cookie for domain by @driesvints in https://github.com/laravel/octane/pull/478
    Source code(tar.gz)
    Source code(zip)
  • v1.2.1(Feb 8, 2022)

  • v1.2.0(Jan 12, 2022)

  • v1.1.3(Jan 5, 2022)

  • v1.1.2(Jan 4, 2022)

Owner
The Laravel Framework
The Laravel Framework
This package provides a high performance HTTP server to speed up your Laravel/Lumen application based on Swoole.

This package provides a high performance HTTP server to speed up your Laravel/Lumen application based on Swoole.

Swoole Taiwan 3.9k Jan 8, 2023
High performance, full-stack PHP framework delivered as a C extension.

Phalcon Framework Phalcon is an open source web framework delivered as a C extension for the PHP language providing high performance and lower resourc

The Phalcon PHP Framework 10.7k Jan 8, 2023
High-Performance Long-Living PHP Framework for modern enterprise application development

Documentation · Discord · Telegram · Twitter Spiral Framework is a High-Performance Long-Living Full-Stack framework and group of over sixty PSR-compa

Spiral Scout 1.4k Jan 1, 2023
High performance HTTP Service Framework for PHP based on Workerman.

webman High performance HTTP Service Framework for PHP based on Workerman. Manual https://www.workerman.net/doc/webman Benchmarks https://www.techempo

walkor 1.3k Jan 2, 2023
🔥High Performance PHP Progressive Framework.

The Core Framework English | 中文 The QueryPHP Application QueryPHP is a modern, high performance PHP progressive framework, to provide a stable and rel

The QueryPHP Framework 306 Dec 14, 2022
💾 High-performance PHP application server, load-balancer and process manager written in Golang. RR2 releases repository.

RoadRunner is an open-source (MIT licensed) high-performance PHP application server, load balancer, and process manager. It supports running as a serv

Spiral Scout 45 Nov 29, 2022
🤯 High-performance PHP application server, load-balancer and process manager written in Golang

RoadRunner is an open-source (MIT licensed) high-performance PHP application server, load balancer, and process manager. It supports running as a serv

Spiral Scout 6.9k Jan 3, 2023
Motan - a cross-language remote procedure call(RPC) framework for rapid development of high performance distributed services

Motan-PHP Overview Motan is a cross-language remote procedure call(RPC) framework for rapid development of high performance distributed services.

Weibo R&D Open Source Projects 81 Nov 19, 2022
Spiral Framework is a High-Performance PHP/Go Full-Stack framework and group of over sixty PSR-compatible components

Spiral HTTP Application Skeleton Spiral Framework is a High-Performance PHP/Go Full-Stack framework and group of over sixty PSR-compatible components.

Spiral Scout 152 Dec 18, 2022
Kit is a lightweight, high-performance and event-driven web services framework that provides core components such as config, container, http, log and route.

Kit What is it Kit is a lightweight, high-performance and event-driven web services framework that provides core components such as config, container,

null 2 Sep 23, 2022
Silex Skeleton - a fully-functional Silex application that you can use as the skeleton for your new applications

Silex Skeleton - a fully-functional Silex application that you can use as the skeleton for your new applications

Silex 789 Dec 5, 2022
Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs.

Slim Framework Slim is a PHP micro-framework that helps you quickly write simple yet powerful web applications and APIs. Installation It's recommended

Slim Framework 11.5k Jan 4, 2023
Asynchronous & Fault-tolerant PHP Framework for Distributed Applications.

Kraken PHP Framework ~ Release the Kraken! Note: This repository contains the core of the Kraken Framework. If you want to start developing new applic

Kraken 1.1k Dec 27, 2022
PPM is a process manager, supercharger and load balancer for modern PHP applications.

PPM - PHP Process Manager PHP-PM is a process manager, supercharger and load balancer for PHP applications. It's based on ReactPHP and works best with

PPM - PHP Process Manager 6.5k Dec 27, 2022
Asynchronous server-side framework for network applications implemented in PHP using libevent

phpDaemon https://github.com/kakserpom/phpdaemon Asynchronous framework in PHP. It has a huge number of features. Designed for highload. Each worker i

Vasily Zorin 1.5k Nov 30, 2022
A powerful yet easy-to-use PHP micro-framework designed to help you build dynamic and robust Web applications - fast!

A powerful yet easy-to-use PHP micro-framework designed to help you build dynamic and robust Web applications - fast! Condensed in a single ~65KB file

Bong Cosca 2.6k Dec 30, 2022
Mind is the PHP code framework designed for developers. It offers a variety of solutions for creating design patterns, applications and code frameworks.

Mind Mind is the PHP code framework designed for developers. It offers a variety of solutions for creating design patterns, applications and code fram

null 0 Dec 13, 2021
An OPCache Preloader for CakePHP 4.x applications

CakePHP Preloader An OPCache preloader for CakePHP. Reference: https://www.php.net/manual/en/opcache.preloading.php This package is meant to provide a

Chris Nizzardini 8 Jun 22, 2022
Woski is a fast and simple lightweight PHP Framework for building applications in the realm of the web.

Woski is a simple fast PHP framework for the Realm The Project Installation Clone the repository $ composer create-project clintonnzedimma/woski myApp

Clinton Nzedimma 19 Aug 15, 2022