rfc:cli_server_http2

This is an old revision of the document!


PHP RFC: Add HTTP/2 Support to the CLI Server

Introduction

As more clients support HTTP/2 (e.g. 60% of browsers, curl, etc) we run into the issue of not being able to test new HTTP/2 functionality being added to PHP without external dependencies (e.g. a web server).

To solve this, it has been proposed that we update the cli-server to support HTTP/2.

Proposal

For supporting HTTP/2, it is pretty well agreed 1) that we should use a third party library to implement it, with libnghttp2 being my proposed suggestion. While HTTP/2 can function without SSL support (TLS), no browser implementation supports this — this change therefore also requires an SSL library (probably openssl, as we already support it).

Given that this introduces two new required dependencies there are two ways we can implement this functionality:

  1. Make it optional, allowing you to build the current HTTP/1.x cli-server and requiring no additional dependencies
  2. Make it required

It should be noted that libnghttp2 is also used by curl, and therefore if you're doing HTTP/2 work and have curl, you already have it.

With either implementation, we can also make HTTP/2 always enabled (if built in), or we can make it de/activated with a flag, such as: --[no-]http2. I believe we should have this flag as it makes it possible to test HTTP/1.x fallback for HTTP/2 clients, as well as HTTP/2.

In addition, we should consider adding the HTTP/2 SETTINGS to $_SERVER so we can both detect that the request is using HTTP/2 and make intelligent decisions on how the application performs (e.g. server push of multiple CSS files vs minifying/concatenating).

We should also support the ability to do server push using HTTP headers (current community thinking is leaning towards Link: <resource>; rel=push header)

Backward Incompatible Changes

If we make this required for cli-server, then the new dependency requirements could be considered a BC break

Proposed PHP Version(s)

Next 7.x

RFC Impact

Adds two newly required dependencies, and their dependencies

To SAPIs

Adds HTTP/2 support to cli-server, potentially with a new flag. Meaning you could start the server like so:

php -S 0.0.0.0:8080 --http2 -t ./public/ ./public/index.html

To Existing Extensions

None

To Opcache

I do not believe this will affect opcache in any way

Open Issues

Unaffected PHP Functionality

Future Scope

Proposed Voting Choices

Patches and Tests

None yet, help needed

Implementation

After the project is implemented, this section should contain

  1. the version(s) it was merged to
  2. a link to the git commit(s)
  3. a link to the PHP manual entry for the feature

References

Rejected Features

Keep this updated with features that were discussed on the mail lists.

1)
see references
rfc/cli_server_http2.1452288363.txt.gz · Last modified: 2017/09/22 13:28 (external edit)