Async HTTP proxy connector, tunnel any TCP/IP-based protocol through an HTTP CONNECT proxy server, built on top of ReactPHP.

Overview

clue/reactphp-http-proxy

CI status installs on Packagist

Async HTTP proxy connector, tunnel any TCP/IP-based protocol through an HTTP CONNECT proxy server, built on top of ReactPHP.

HTTP CONNECT proxy servers (also commonly known as "HTTPS proxy" or "SSL proxy") are commonly used to tunnel HTTPS traffic through an intermediary ("proxy"), to conceal the origin address (anonymity) or to circumvent address blocking (geoblocking). While many (public) HTTP CONNECT proxy servers often limit this to HTTPS port 443 only, this can technically be used to tunnel any TCP/IP-based protocol (HTTP, SMTP, IMAP etc.). This library provides a simple API to create these tunneled connections for you. Because it implements ReactPHP's standard ConnectorInterface, it can simply be used in place of a normal connector. This makes it fairly simple to add HTTP CONNECT proxy support to pretty much any existing higher-level protocol implementation.

  • Async execution of connections - Send any number of HTTP CONNECT requests in parallel and process their responses as soon as results come in. The Promise-based design provides a sane interface to working with out of order responses and possible connection errors.
  • Standard interfaces - Allows easy integration with existing higher-level components by implementing ReactPHP's standard ConnectorInterface.
  • Lightweight, SOLID design - Provides a thin abstraction that is just good enough and does not get in your way. Builds on top of well-tested components and well-established concepts instead of reinventing the wheel.
  • Good test coverage - Comes with an automated tests suite and is regularly tested against actual proxy servers in the wild.

Table of contents

Support us

We invest a lot of time developing, maintaining and updating our awesome open-source projects. You can help us sustain this high-quality of our work by becoming a sponsor on GitHub. Sponsors get numerous benefits in return, see our sponsoring page for details.

Let's take these projects to the next level together! 🚀

Quickstart example

The following example code demonstrates how this library can be used to send a secure HTTPS request to google.com through a local HTTP proxy server:

<?php

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

$proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080');

$connector = new React\Socket\Connector(array(
    'tcp' => $proxy,
    'dns' => false
));

$browser = new React\Http\Browser($connector);

$browser->get('https://google.com/')->then(function (Psr\Http\Message\ResponseInterface $response) {
    var_dump($response->getHeaders(), (string) $response->getBody());
}, function (Exception $e) {
    echo 'Error: ' . $e->getMessage() . PHP_EOL;
});

See also the examples.

Usage

ProxyConnector

The ProxyConnector is responsible for creating plain TCP/IP connections to any destination by using an intermediary HTTP CONNECT proxy.

[you] -> [proxy] -> [destination]

Its constructor simply accepts an HTTP proxy URL with the proxy server address:

$proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080');

The proxy URL may or may not contain a scheme and port definition. The default port will be 80 for HTTP (or 443 for HTTPS), but many common HTTP proxy servers use custom ports (often the alternative HTTP port 8080).

If you need custom connector settings (DNS resolution, TLS parameters, timeouts, proxy servers etc.), you can explicitly pass a custom instance of the ConnectorInterface:

$connector = new React\Socket\Connector(array(
    'dns' => '127.0.0.1',
    'tcp' => array(
        'bindto' => '192.168.10.1:0'
    ),
    'tls' => array(
        'verify_peer' => false,
        'verify_peer_name' => false
    )
));

$proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080', $connector);

This is the main class in this package. Because it implements ReactPHP's standard ConnectorInterface, it can simply be used in place of a normal connector. Accordingly, it provides only a single public method, the connect() method. The connect(string $uri): PromiseInterface<ConnectionInterface, Exception> method can be used to establish a streaming connection. It returns a Promise which either fulfills with a ConnectionInterface on success or rejects with an Exception on error.

This makes it fairly simple to add HTTP CONNECT proxy support to pretty much any higher-level component:

- $acme = new AcmeApi($connector);
+ $proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080', $connector);
+ $acme = new AcmeApi($proxy);

Plain TCP connections

HTTP CONNECT proxies are most frequently used to issue HTTPS requests to your destination. However, this is actually performed on a higher protocol layer and this connector is actually inherently a general-purpose plain TCP/IP connector. As documented above, you can simply invoke its connect() method to establish a streaming plain TCP/IP connection and use any higher level protocol like so:

$proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080');

$proxy->connect('tcp://smtp.googlemail.com:587')->then(function (React\Socket\ConnectionInterface $connection) {
    $connection->write("EHLO local\r\n");
    $connection->on('data', function ($chunk) use ($connection) {
        echo $chunk;
    });
});

You can either use the ProxyConnector directly or you may want to wrap this connector in ReactPHP's Connector:

$proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080');

$connector = new React\Socket\Connector(array(
    'tcp' => $proxy,
    'dns' => false
));

$connector->connect('tcp://smtp.googlemail.com:587')->then(function (React\Socket\ConnectionInterface $connection) {
    $connection->write("EHLO local\r\n");
    $connection->on('data', function ($chunk) use ($connection) {
        echo $chunk;
    });
});

Note that HTTP CONNECT proxies often restrict which ports one may connect to. Many (public) proxy servers do in fact limit this to HTTPS (443) only.

Secure TLS connections

This class can also be used if you want to establish a secure TLS connection (formerly known as SSL) between you and your destination, such as when using secure HTTPS to your destination site. You can simply wrap this connector in ReactPHP's Connector:

$proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080');

$connector = new React\Socket\Connector(array(
    'tcp' => $proxy,
    'dns' => false
));

$connector->connect('tls://smtp.googlemail.com:465')->then(function (React\Socket\ConnectionInterface $connection) {
    $connection->write("EHLO local\r\n");
    $connection->on('data', function ($chunk) use ($connection) {
        echo $chunk;
    });
});

Note how secure TLS connections are in fact entirely handled outside of this HTTP CONNECT client implementation.

HTTP requests

This library also allows you to send HTTP requests through an HTTP CONNECT proxy server.

In order to send HTTP requests, you first have to add a dependency for ReactPHP's async HTTP client. This allows you to send both plain HTTP and TLS-encrypted HTTPS requests like this:

$proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080');

$connector = new React\Socket\Connector(array(
    'tcp' => $proxy,
    'dns' => false
));

$browser = new React\Http\Browser($connector);

$browser->get('https://example.com/')->then(function (Psr\Http\Message\ResponseInterface $response) {
    var_dump($response->getHeaders(), (string) $response->getBody());
}, function (Exception $e) {
    echo 'Error: ' . $e->getMessage() . PHP_EOL;
});

See also ReactPHP's HTTP client and any of the examples for more details.

Connection timeout

By default, the ProxyConnector does not implement any timeouts for establishing remote connections. Your underlying operating system may impose limits on pending and/or idle TCP/IP connections, anywhere in a range of a few minutes to several hours.

Many use cases require more control over the timeout and likely values much smaller, usually in the range of a few seconds only.

You can use ReactPHP's Connector to decorate any given ConnectorInterface instance. It provides the same connect() method, but will automatically reject the underlying connection attempt if it takes too long:

$proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080');

$connector = new React\Socket\Connector(array(
    'tcp' => $proxy,
    'dns' => false,
    'timeout' => 3.0
));

$connector->connect('tcp://google.com:80')->then(function ($connection) {
    // connection succeeded within 3.0 seconds
});

See also any of the examples.

Note how the connection timeout is in fact entirely handled outside of this HTTP CONNECT client implementation.

DNS resolution

By default, the ProxyConnector does not perform any DNS resolution at all and simply forwards any hostname you're trying to connect to the remote proxy server. The remote proxy server is thus responsible for looking up any hostnames via DNS (this default mode is thus called remote DNS resolution).

As an alternative, you can also send the destination IP to the remote proxy server. In this mode you either have to stick to using IPs only (which is ofen unfeasable) or perform any DNS lookups locally and only transmit the resolved destination IPs (this mode is thus called local DNS resolution).

The default remote DNS resolution is useful if your local ProxyConnector either can not resolve target hostnames because it has no direct access to the internet or if it should not resolve target hostnames because its outgoing DNS traffic might be intercepted.

As noted above, the ProxyConnector defaults to using remote DNS resolution. However, wrapping the ProxyConnector in ReactPHP's Connector actually performs local DNS resolution unless explicitly defined otherwise. Given that remote DNS resolution is assumed to be the preferred mode, all other examples explicitly disable DNS resolution like this:

$proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080');

$connector = new React\Socket\Connector(array(
    'tcp' => $proxy,
    'dns' => false
));

If you want to explicitly use local DNS resolution, you can use the following code:

$proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080');

// set up Connector which uses Google's public DNS (8.8.8.8)
$connector = new React\Socket\Connector(array(
    'tcp' => $proxy,
    'dns' => '8.8.8.8'
));

Note how local DNS resolution is in fact entirely handled outside of this HTTP CONNECT client implementation.

Authentication

If your HTTP proxy server requires authentication, you may pass the username and password as part of the HTTP proxy URL like this:

$proxy = new Clue\React\HttpProxy\ProxyConnector('alice:[email protected]:8080');

Note that both the username and password must be percent-encoded if they contain special characters:

$user = 'he:llo';
$pass = 'p@ss';
$url = rawurlencode($user) . ':' . rawurlencode($pass) . '@127.0.0.1:8080';

$proxy = new Clue\React\HttpProxy\ProxyConnector($url);

The authentication details will be used for basic authentication and will be transferred in the Proxy-Authorization HTTP request header for each connection attempt. If the authentication details are missing or not accepted by the remote HTTP proxy server, it is expected to reject each connection attempt with a 407 (Proxy Authentication Required) response status code and an exception error code of SOCKET_EACCES (13).

Advanced HTTP headers

The ProxyConnector constructor accepts an optional array of custom request headers to send in the CONNECT request. This can be useful if you're using a custom proxy setup or authentication scheme if the proxy server does not support basic authentication as documented above. This is rarely used in practice, but may be useful for some more advanced use cases. In this case, you may simply pass an assoc array of additional request headers like this:

$proxy = new Clue\React\HttpProxy\ProxyConnector(
    '127.0.0.1:8080',
    null,
    array(
        'Proxy-Authorization' => 'Bearer abc123',
        'User-Agent' => 'ReactPHP'
    )
);

Advanced secure proxy connections

Note that communication between the client and the proxy is usually via an unencrypted, plain TCP/IP HTTP connection. Note that this is the most common setup, because you can still establish a TLS connection between you and the destination host as above.

If you want to connect to a (rather rare) HTTPS proxy, you may want use the https:// scheme (HTTPS default port 443) to create a secure connection to the proxy:

$proxy = new Clue\React\HttpProxy\ProxyConnector('https://127.0.0.1:443');

$proxy->connect('tcp://smtp.googlemail.com:587');

Advanced Unix domain sockets

HTTP CONNECT proxy servers support forwarding TCP/IP based connections and higher level protocols. In some advanced cases, it may be useful to let your HTTP CONNECT proxy server listen on a Unix domain socket (UDS) path instead of a IP:port combination. For example, this allows you to rely on file system permissions instead of having to rely on explicit authentication.

You can simply use the http+unix:// URI scheme like this:

$proxy = new Clue\React\HttpProxy\ProxyConnector('http+unix:///tmp/proxy.sock');

$proxy->connect('tcp://google.com:80')->then(function (React\Socket\ConnectionInterface $connection) {
    // connected…
});

Similarly, you can also combine this with authentication like this:

$proxy = new Clue\React\HttpProxy\ProxyConnector('http+unix://alice:password@/tmp/proxy.sock');

Note that Unix domain sockets (UDS) are considered advanced usage and PHP only has limited support for this. In particular, enabling secure TLS may not be supported.

Note that the HTTP CONNECT protocol does not support the notion of UDS paths. The above works reasonably well because UDS is only used for the connection between client and proxy server and the path will not actually passed over the protocol. This implies that this does not support connecting to UDS destination paths.

Install

The recommended way to install this library is through Composer. New to Composer?

This project follows SemVer. This will install the latest supported version:

$ composer require clue/http-proxy-react:^1.7

See also the CHANGELOG for details about version upgrades.

This project aims to run on any platform and thus does not require any PHP extensions and supports running on legacy PHP 5.3 through current PHP 8+ and HHVM. It's highly recommended to use the latest supported PHP version for this project.

Tests

To run the test suite, you first need to clone this repo and then install all dependencies through Composer:

$ composer install

To run the test suite, go to the project root and run:

$ vendor/bin/phpunit

The test suite contains tests that rely on a working internet connection, alternatively you can also run it like this:

$ vendor/bin/phpunit --exclude-group internet

License

This project is released under the permissive MIT license.

Did you know that I offer custom development services and issuing invoices for sponsorships of releases and for contributions? Contact me (@clue) for details.

More

  • If you want to learn more about how the ConnectorInterface and its usual implementations look like, refer to the documentation of the underlying react/socket component.
  • If you want to learn more about processing streams of data, refer to the documentation of the underlying react/stream component.
  • As an alternative to an HTTP CONNECT proxy, you may also want to look into using a SOCKS (SOCKS4/SOCKS5) proxy instead. You may want to use clue/reactphp-socks which also provides an implementation of the same ConnectorInterface so that supporting either proxy protocol should be fairly trivial.
  • As an alternative to an HTTP CONNECT proxy, you may also want to look into using an SSH proxy (SSH tunnel) instead. You may want to use clue/reactphp-ssh-proxy which also provides an implementation of the same ConnectorInterface so that supporting either proxy protocol should be fairly trivial.
  • If you're dealing with public proxies, you'll likely have to work with mixed quality and unreliable proxies. You may want to look into using clue/reactphp-connection-manager-extra which allows retrying unreliable ones, implying connection timeouts, concurrently working with multiple connectors and more.
  • If you're looking for an end-user HTTP CONNECT proxy server daemon, you may want to use LeProxy.
Comments
  • proxy not working with some servers

    proxy not working with some servers

    Hello

    I am using the proxy to connect to domain whois server to fetch results, it works well with most of the servers such as whois.nic.cx , whois.nic.gs etc

    but it does not work with this whois server whois.nic.world ,this is my code reference url

    https://paste.ofcode.org/kjHA8hYeX4QgSpHnbWwPzi

    question 
    opened by erichuang2015 6
  • Reduce memory consumption by avoiding circular reference from stream reader

    Reduce memory consumption by avoiding circular reference from stream reader

    Stream reader has a circular reference to itself here: https://github.com/clue/php-http-proxy-react/blob/7258a76f492357874d0af1fe1f50a08209f61174/src/ProxyConnector.php#L137 so it can be cleaned only with GC. When a proxy is doing a lot of disconnects, it is turning into a nightmare.

    maintenance new feature 
    opened by valga 6
  • Forward compatibility with upcoming Promise v3

    Forward compatibility with upcoming Promise v3

    Builds on top of https://github.com/reactphp/promise/pull/75, https://github.com/clue/reactphp-block/pull/61 and https://github.com/reactphp/socket/pull/214

    new feature 
    opened by clue 3
  • Fix invalid references in exception stack trace

    Fix invalid references in exception stack trace

    This changeset fixes any invalid references in the exception stack trace. This is a pretty nasty bug that has been introduced a while ago with #23 that only happens on PHP 7+ when printing the exception trace ($exception->getTraceAsString()). This is now covered by the updated test suite and should work across all supported PHP versions.

    Builds on top of https://github.com/clue/reactphp-socks/pull/104 and #23

    bug 
    opened by clue 2
  • Use together reactphp-socks,reactphp-http-proxy?

    Use together reactphp-socks,reactphp-http-proxy?

    Hello! Thanks for your code. I am trying to do a quick check whois through a proxy. Please tell me how can I use both classes of php proxies? https://github.com/clue/reactphp-http-proxy/ https://github.com/clue/reactphp-socks

    I am new to react php, so if you give an example of the code I will be very grateful. For example, just get google.com whois data from whois.verisign-grs.com:43. :)

    Best regards, Roundik

    question 
    opened by Roundik 1
  • pass param to the connection

    pass param to the connection

    Hello

    I would like to use this lib to query domain whois server , for examle the whois.nic.cx with port 43

    $connector->connect('whois.nic.cx:43')->then(function (ConnectionInterface $stream) { $stream->on('data', function ($chunk) { echo $chunk; }); }, 'printf');

    how can I pass domain name to this connection and get whois data back ?

    question 
    opened by erichuang2015 1
  • Fix HHVM build for now again and ignore future HHVM build errors

    Fix HHVM build for now again and ignore future HHVM build errors

    The HHVM build reports an error once again. Let's fix this once again by updating the base distro from precise to trusty and ignore any future HHVM build errors.

    See https://github.com/travis-ci/travis-ci/issues/7712#issuecomment-300553336

    maintenance new feature 
    opened by clue 1
  • Mark passwords and URIs as `#[\SensitiveParameter]` (PHP 8.2+)

    Mark passwords and URIs as `#[\SensitiveParameter]` (PHP 8.2+)

    As @clue describes in https://github.com/friends-of-reactphp/mysql/pull/162:

    This changeset marks all passwords and URIs containing passwords as #[\SensitiveParameter] to avoid these parameter from potentially showing up in exception traces in PHP 8.2+. Older PHP versions are not affected by this change and continue to work as is. See also RFC: https://wiki.php.net/rfc/redact_parameters_in_back_traces

    Refs #48

    new feature 
    opened by SimonFrings 0
  • Support PHP 8.1

    Support PHP 8.1

    This changeset adds support for PHP 8.1 and adds convertDeprecationsToExceptions="true" to the phpunit.xml configuration to make sure we'll see future deprecation notices.

    Builds on top of #38.

    maintenance new feature 
    opened by SimonFrings 0
  • Simplify usage by supporting new Socket API without nullable loop

    Simplify usage by supporting new Socket API without nullable loop

    Builds on top of #41, https://github.com/reactphp/socket/pull/264 and https://github.com/reactphp/http/pull/419 Refs https://github.com/clue/reactphp-ssh-proxy/pull/28

    new feature 
    opened by clue 0
  • Simplify usage by updating to new default loop and making `Connector` optional

    Simplify usage by updating to new default loop and making `Connector` optional

    This changeset simplifies usage by supporting the new default loop.

    // old (still supported)
    $proxy = new Clue\React\HttpProxy\ProxyConnector(
        '127.0.0.1:8080',
        new React\Socket\Connector($loop)
    );
    
    // new (using default loop)
    $proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080');
    

    Builds on top of https://github.com/reactphp/event-loop/pull/232, https://github.com/reactphp/socket/pull/260 and https://github.com/reactphp/http/pull/410 Refs https://github.com/clue/reactphp-ssh-proxy/pull/27

    new feature 
    opened by clue 0
  • Use reactphp/async instead of clue/reactphp-block

    Use reactphp/async instead of clue/reactphp-block

    See https://github.com/reactphp/async

    Ref: https://github.com/clue/reactphp-block/pull/67, https://github.com/clue/reactphp-block/issues/68, https://github.com/reactphp/http/pull/464 and https://github.com/clue/reactphp-mq/pull/34

    opened by dinooo13 0
Releases(v1.8.0)
  • v1.8.0(Sep 1, 2022)

    • Feature: Full support for PHP 8.1 and PHP 8.2. (#47 and #48 by @SimonFrings)

    • Feature: Mark passwords and URIs as #[\SensitiveParameter] (PHP 8.2+). (#49 by @SimonFrings)

    • Feature: Forward compatibility with upcoming Promise v3. (#44 by @clue)

    • Fix: Fix invalid references in exception stack trace. (#45 by @clue)

    • Improve test suite and fix legacy HHVM build. (#46 by @SimonFrings)

    Source code(tar.gz)
    Source code(zip)
  • v1.7.0(Aug 6, 2021)

    • Feature: Simplify usage by supporting new default loop and making Connector optional. (#41 and #42 by @clue)

      // old (still supported)
      $proxy = new Clue\React\HttpProxy\ProxyConnector(
          '127.0.0.1:8080',
          new React\Socket\Connector($loop)
      );
      
      // new (using default loop)
      $proxy = new Clue\React\HttpProxy\ProxyConnector('127.0.0.1:8080');
      
    • Documentation improvements and updated examples. (#39 and #43 by @clue and #40 by @PaulRotmann)

    • Improve test suite and use GitHub actions for continuous integration (CI). (#38 by @SimonFrings)

    Source code(tar.gz)
    Source code(zip)
  • v1.6.0(Oct 23, 2020)

    • Enhanced documentation for ReactPHP's new HTTP client. (#35 and #37 by @SimonFrings)

    • Improve test suite, prepare PHP 8 support and support PHPUnit 9.3. (#36 by @SimonFrings)

    Source code(tar.gz)
    Source code(zip)
  • v1.5.0(Jun 19, 2020)

    • Feature / Fix: Support PHP 7.4 by skipping unneeded cleanup of exception trace args. (#33 by @clue)

    • Clean up test suite and add .gitattributes to exclude dev files from exports. Run tests on PHP 7.4, PHPUnit 9 and simplify test matrix. Link to using SSH proxy (SSH tunnel) as an alternative. (#27 by @clue and #31, #32 and #34 by @SimonFrings)

    Source code(tar.gz)
    Source code(zip)
  • v1.4.0(Oct 30, 2018)

    • Feature: Improve error reporting for failed connection attempts and improve cancellation forwarding during proxy connection setup. (#23 and #26 by @clue)

      All error messages now always contain a reference to the remote URI to give more details which connection actually failed and the reason for this error. Similarly, any underlying connection issues to the proxy server will now be reported as part of the previous exception.

      For most common use cases this means that simply reporting the Exception message should give the most relevant details for any connection issues:

      $promise = $proxy->connect('tcp://example.com:80');
      $promise->then(function (ConnectionInterface $conn) use ($loop) {
          // …
      }, function (Exception $e) {
          echo $e->getMessage();
      });
      
    • Feature: Add support for custom HTTP request headers. (#25 by @valga and @clue)

      // new: now supports custom HTTP request headers
      $proxy = new ProxyConnector('127.0.0.1:8080', $connector, array(
          'Proxy-Authorization' => 'Bearer abc123',
          'User-Agent' => 'ReactPHP'
      ));
      
    • Fix: Fix connecting to IPv6 destination hosts. (#22 by @clue)

    • Link to clue/reactphp-buzz for HTTP requests and update project homepage. (#21 and #24 by @clue)

    Source code(tar.gz)
    Source code(zip)
  • v1.3.0(Feb 13, 2018)

    • Feature: Support communication over Unix domain sockets (UDS) (#20 by @clue)

      // new: now supports communication over Unix domain sockets (UDS)
      $proxy = new ProxyConnector('http+unix:///tmp/proxy.sock', $connector);
      
    • Reduce memory consumption by avoiding circular reference from stream reader (#18 by @valga)

    • Improve documentation (#19 by @clue)

    Source code(tar.gz)
    Source code(zip)
  • v1.2.0(Aug 30, 2017)

    • Feature: Use socket error codes for connection rejections (#17 by @clue)

      $promise = $proxy->connect('imap.example.com:143');
      $promise->then(null, function (Exeption $e) {
          if ($e->getCode() === SOCKET_EACCES) {
              echo 'Failed to authenticate with proxy!';
          }
          throw $e;
      });
      
    • Improve test suite by locking Travis distro so new defaults will not break the build and optionally exclude tests that rely on working internet connection (#15 and #16 by @clue)

    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Jun 11, 2017)

  • v1.0.0(Jun 10, 2017)

  • v0.3.2(Jun 10, 2017)

    • Fix: Fix rejecting invalid URIs and unexpected URI schemes (#13 by @clue)

    • Fix HHVM build for now again and ignore future HHVM build errors (#12 by @clue)

    • Documentation for Connector concepts (TCP/TLS, timeouts, DNS resolution) (#11 by @clue)

    Source code(tar.gz)
    Source code(zip)
  • v0.3.1(May 10, 2017)

  • v0.3.0(Apr 10, 2017)

    • Feature / BC break: Replace deprecated SocketClient with new Socket component (#9 by @clue)

      This implies that the ProxyConnector from this package now implements the React\Socket\ConnectorInterface instead of the legacy React\SocketClient\ConnectorInterface.

    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Apr 10, 2017)

    • Feature / BC break: Update SocketClient to v0.7 or v0.6 and use connect($uri) instead of create($host, $port) (#8 by @clue)

      // old
      $connector->create($host, $port)->then(function (Stream $conn) {
          $conn->write("…");
      });
      
      // new
      $connector->connect($uri)->then(function (ConnectionInterface $conn) {
          $conn->write("…");
      });
      
    • Improve test suite by adding PHPUnit to require-dev (#7 by @clue)

    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Nov 1, 2016)

Owner
Christian Lück
@reactphp maintainer / Freelance Software Engineer, all things web, passionate about coaching others building awesome things… Reach out if you need help
Christian Lück
PHP HI-REL SOCKET TCP/UDP/ICMP/Serial .高可靠性PHP通信&控制框架SOCKET-TCP/UDP/ICMP/硬件Serial-RS232/RS422/RS485 AND MORE!

OHSCE高可靠性的PHP通信框架. Hey!I'm come back! 官方网站:WWW.OHSCE.ORG WWW.OHSCE.COM 最新版本V0.2.0.2 2017-05-10 开发者QQ群:374756165(新2016-09) 捐助: http://www.ohsce.com/ind

null 212 Dec 26, 2022
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
FrankenPHP is a modern application server for PHP built on top of the Caddy web server

FrankenPHP: Modern App Server for PHP FrankenPHP is a modern application server for PHP built on top of the Caddy web server. FrankenPHP gives superpo

Kévin Dunglas 2.8k Jan 2, 2023
FreeSWITCH's Event Socket Layer is a TCP control interface enabling the development of complex dynamic dialplans/workflows

Asynchronous Event Socket Layer library for PHP Quickstart FreeSWITCH's Event Socket Layer is a TCP control interface enabling the development of comp

rtckit 3 Oct 11, 2022
Tarantool connector for yii2 framework. Allow to use activerecord, schemas, widgets and more.

Tarantool connector for yii2 framework Tarantool connector for yii2 framework. Allow to use framework abstractions such as ActiveRecord, Schema, Table

Andrey 11 Nov 21, 2021
Slim Framework view helper built on top of the Twig templating component

Slim Framework Twig View This is a Slim Framework view helper built on top of the Twig templating component. You can use this component to create and

Slim Framework 321 Dec 16, 2022
PHPUnit assertions for testing ReactPHP promises

ReactPHP Promises Testing A library that provides a set of convenient assertions for testing ReactPHP promises. Under the hood uses clue/php-block-rea

Sergey Zhuk 30 Dec 8, 2022
Simple and universal connection pool for ReactPHP applications.

szado/reactphp-connection-pool Async and flexible pool for any type of connections built on top of ReactPHP. Connection pooling allows you to easily m

shado 2 Apr 30, 2022
Socks5 proxy server written in Swoole PHP

php-socks This is a Socks5 proxy server implementation built with PHP & Swoole. To start the proxy server, clone this repo, run composer install to in

Nazmul Alam 3 Jan 23, 2022
Dazzle Async IPC Messaging

Dazzle Async IPC Abstraction Note: This repository is part of Dazzle Project - the next-gen library for PHP. The project's purpose is to provide PHP d

Dazzle PHP 5 Feb 12, 2022
Make observables foreachable using async & await

ReactPHP awaitable observable Installation To install via Composer, use the command below, it will automatically detect the latest version and bind it

Cees-Jan Kiewiet 2 Nov 3, 2022
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
XStatic is a PHP library for enabling static proxy interfaces

XStatic is a PHP library for enabling static proxy interfaces—similar to Laravel 4+ "Facades"—but with any PHP project. XStatic was created by Jeremy Lindblom.

Jeremy Lindblom 104 Dec 8, 2022
Slim PHP static proxy library

#SlimStatic Slim PHP static proxy library. Contents About Usage API Customizing License About SlimStatic provides a simple static interface to various

John Stevenson 17 May 12, 2022
💫 Vega is a CLI mode HTTP web framework written in PHP support Swoole, WorkerMan / Vega 是一个用 PHP 编写的 CLI 模式 HTTP 网络框架,支持 Swoole、WorkerMan

Mix Vega 中文 | English Vega is a CLI mode HTTP web framework written in PHP support Swoole, WorkerMan Vega 是一个用 PHP 编写的 CLI 模式 HTTP 网络框架,支持 Swoole、Work

Mix PHP 46 Apr 28, 2022
jojo, another http server written in PHP 8.0

جوجو | jojo جوجو، وب‌سروری در ابعاد جوجه برای کارهای کوچک داستان نوشتن جوجو وب‌سروری که تنظیمات مودم TP-link TD-8811 توی اتاقم رو serve میکنه اسمش mic

Amirhossein Baghaie 6 Dec 25, 2022
This JSON marshaller is based on the one built into FEAST framework

Standalone JSON marshaller based off the one built into FEAST framework at feast/framework on packagist or feastframework/framework on github

null 13 Dec 9, 2022
Symprowire is a PHP MVC Framework based and built on Symfony, using the ProcessWire CMS as DBAL and Service Provider.

Symprowire - PHP MVC Framework for ProcessWire 3.x Symprowire is a PHP MVC Framework based and built on Symfony using ProcessWire 3.x as DBAL and Serv

Luis Mendez 7 Jan 16, 2022
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