Skip to content

Commit fdd77ad

Browse files
committed
Don't run requests through configuration middleware
While working on another PR that introduces another configuration middleware it dawned on me that we preferably don't requests through middleware that don't do anything. This change will filter it out those middleware before they are passed into the MiddlewareRunner. While running benchmarks I gained around a 10% requests per second gain when running it against example 63.
1 parent cd36b4f commit fdd77ad

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/HttpServer.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use React\Http\Io\IniUtil;
99
use React\Http\Io\MiddlewareRunner;
1010
use React\Http\Io\StreamingServer;
11+
use React\Http\Middleware\IdleConnectionTimeoutMiddleware;
1112
use React\Http\Middleware\LimitConcurrentRequestsMiddleware;
1213
use React\Http\Middleware\StreamingRequestMiddleware;
1314
use React\Http\Middleware\RequestBodyBufferMiddleware;
@@ -247,6 +248,14 @@ public function __construct($requestHandlerOrLoop)
247248

248249
$middleware = \array_merge($middleware, $requestHandlers);
249250

251+
/**
252+
* Filter out any configuration middleware, no need to run requests through something that isn't
253+
* doing anything with the request.
254+
*/
255+
$middleware = \array_filter($middleware, function ($handler) {
256+
return !($handler instanceof StreamingRequestMiddleware);
257+
});
258+
250259
$this->streamingServer = new StreamingServer($loop, new MiddlewareRunner($middleware));
251260

252261
$that = $this;

tests/HttpServerTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,4 +431,32 @@ public function testConstructServerWithMemoryLimitDoesLimitConcurrency()
431431
$this->assertTrue(is_array($middleware));
432432
$this->assertInstanceOf('React\Http\Middleware\LimitConcurrentRequestsMiddleware', $middleware[0]);
433433
}
434+
435+
public function testConstructFiltersOutConfigurationMiddlewareBefore()
436+
{
437+
$old = ini_get('memory_limit');
438+
ini_set('memory_limit', '100M');
439+
440+
$http = new HttpServer(new StreamingRequestMiddleware(), function () { });
441+
442+
ini_set('memory_limit', $old);
443+
444+
$ref = new \ReflectionProperty($http, 'streamingServer');
445+
$ref->setAccessible(true);
446+
447+
$streamingServer = $ref->getValue($http);
448+
449+
$ref = new \ReflectionProperty($streamingServer, 'callback');
450+
$ref->setAccessible(true);
451+
452+
$middlewareRunner = $ref->getValue($streamingServer);
453+
454+
$ref = new \ReflectionProperty($middlewareRunner, 'middleware');
455+
$ref->setAccessible(true);
456+
457+
$middleware = $ref->getValue($middlewareRunner);
458+
459+
$this->assertTrue(is_array($middleware));
460+
$this->assertCount(1, $middleware);
461+
}
434462
}

0 commit comments

Comments
 (0)