Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Fast Cgi Client Laravel Package

hollodotme/fast-cgi-client

High-performance FastCGI client for PHP that talks directly to PHP-FPM (no web server needed). Send requests, set env vars and stdin, read stdout/stderr, and run scripts in parallel—useful for CLIs, workers, or custom application servers.

View on GitHub
Deep Wiki
Context7
v3.1.7

CHANGELOG

All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning and Keep a CHANGELOG.

3.1.7 - 2021-12-07

  • Make sure length values are within valid bounds

3.1.6 - 2021-09-23

Added

  • PHP 8.1 comaptibility

3.1.5 - 2020-12-10

Fixed

  • Transfer of multipart/form-data blocks - #64
    • Removes base64 encoding for contents of files to transfer
    • Removes Content-Transfer-Encoding: base64 header from multipart block for files
    • Improves determination of file's MIME type via mime_content_type(), if available
    • Adds tests for multipart transfer of files with binary content (images)

3.1.4 - 2020-11-23

Added

  • PHP 8.1 compatibility
  • Makefile to run all tests based on docker-compose config

Fixed

  • TypeError on PHP 8 for a resource that is neither null nor a resource
  • Added ext-xdebug as dev-requirement in composer.json
  • Xdebug 3 coverage filter constant name for PHP 8

Replaced

  • Local shell script to run tests with Makefile

Removed

  • CI Builds on Circle-CI

3.1.3 - 2020-08-13

Fixed

  • Remove broken sockets from socket collection if writing the request to stream fails - #61
  • Do not export docker-compose.yml with composer archives via .gitattributes
  • Stabilize unreliable tests with signaled pool processes

3.1.2 - 2020-05-19

Added

  • .gitattributes file to exclude non-relevant files/directories from archives/releases installed by composer - #58

Fixed

  • Remove link to bin/fcgiget in composer.json as it is a potential security issue (because bin/fcgiget accepts any accessible fastCGI endpoint and may be exposed in some setups)

3.1.1 - 2020-05-06

Fixed

  • Backwards compatibility break in userland classes extending AbstractRequest due to a final constructor. - #56 See also: #55

3.1.0 - 2020-05-06

Added

  • Interface for request content composers with implementations for URL encoded form-data, multipart form-data and JSON data. This was inspired by - #53
  • Named constructor newWithRequestContent to all request classes in order to simplify the use of the new request content type composers.
  • For more information and examples have a look at the documentation section "Request contents".

Fixed

  • Inspection issues found by PHPStan

Updated

  • Test suites to cover PHP versions from 7.1 to 7.4
  • License dates
  • CI moved to GitHub actions

3.0.1 - 2019-10-24

Added

  • PHP 7.4 CI pipeline and docker-compose environment
  • Explicitly set error_reporting=-1 for CI and tests in order to capture deprecation warnings

Fixed

  • Replace usage of curly brace syntax for accessing string offsets, which is deprecated in PHP 7.4 - #51

3.0.0 - 2019-07-29

Please take notice of the backwards incompatible changes (BC breaks) documented below in the changelog of 3.0.0-alpha & 3.0.0-beta.

Added

  • Reserved private constant for ABORT_REQUEST instruction for future use
  • Socket ID is now represented and generated by a proper type class

Improved

  • Import of root namespace functions
  • Dependency injection for socket implementation

3.0.0-beta - 2019-06-24

Backwards incompatible changes (BC breaks)

  • The socket conection parameter was moved from the Client's constructor to

    • Client#sendRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : ProvidesResponseData and
    • Client#sendAsyncRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : int

    in order to allow sending (equal) requests to different FastCGI servers using the same Client instance. - #45

  • Removed method ProvidesResponseData#getRequestId() : int and Response#getRequestId() : int respectively in order to avoid confusion about the semantics of the term "request ID" and misusage by assuming it is a unique ID for each request (which it is not). Also the first constructor parameter of the Response class was removed with this change.

  • Renamed all $requestId(s) parameters to $socketId(s) in order to reflect the correct semantics of the ID. - #39

  • Renamed method Client#getRequestIdsHavingResponse() : array<int> to Client#getSocketIdsHavingResponse() : array<int> in order to reflect the correct semantics of the returned array of IDs. - #39

3.0.0-alpha - 2019-04-30

Backwards incompatible changes (BC breaks)

  • Method Response#getHeaders() : array will now return a two-dimensional array with grouped values to support multi-value headers. Previous versions returned a one-dimensional key-value array.

    # Previous versions
    [
      'Status' => 'HTTP/2 200 OK',
      'Set-Cookie' => 'tasty_cookie=strawberry',
    ]
    
    # Since 3.0.0-alpha
    [
      'Status' => [
        'HTTP/2 200 OK',
      ],
      'Set-Cookie' => [
        'yummy_cookie=choco',
        'tasty_cookie=strawberry',
      ],
    ]
    
  • Method Response#getHeader(string $headerKey) : array will now return an array containing all values for the given header key to support multi-value headers. Previous versions returned the last value as a string.

    echo $response->getHeader('Set-Cookie');
    
    # Previous versions
    'tasty_cookie=strawberry'
    
    # Since 3.0.0-alpha
    [
      'yummy_cookie=choco',
      'tasty_cookie=strawberry'
    ]
    
  • Method Response#getRawResponse() : string is no longer available and its usage must be replaced with Response#getOutput(). The method was deprecated since version 2.6.0.

Added

  • Method Response#getHeaderLine(string $headerKey) : string that returns all values, separated by comma, for the given key. - #35
  • Header keys are now case-insensitive in Response#getHeader(string $headerKey) : array and Response#getHeaderLine(string $headerKey) : string. - #35

Removed

  • Method Response#getRawResponse() : string that was deprecated in version 2.6.0 in favour of Response#getOutput() : string. - #36

2.7.2 - 2019-05-31

Improved

  • Handling of stream_select returning false in case of a system call interrupt. - #41

Fixed

  • Remove/close sockets after fetching their responses triggered async requests in order to prevent halt on further request processing, if the number of requests exceeds php-fpm's pm.max_children setting. - #40

2.7.1 - 2019-04-29

Fixed

  • Remove failed sockets from internal collection that errored out during reading of response in order to prevent infinite tries/re-use of those failed connections. - #37

2.7.0 - 2019-04-28

Added

  • Re-using of idle sockets for successive requests - #33

2.6.0 - 2019-04-02

Added

  • Two new methods to Response class - #27

    • Response#getOutput() which is identical to Response#getRawResponse() and will return the complete output from the STDOUT stream of the response.
    • Response#getError() which will return the complete output of the STDERR stream of the response.
  • Second parameter $errorBuffer in tha pass through callback signature - #27

    $callback = function( string $outputBuffer, string $errorBuffer ) {};
    

    This parameter will contain the contents of the STDERR stream packets.

Deprecated

  • Response#getRawResponse() in favour of consistant naming. This method will be removed in v3.0.0 - #27

Removed

  • ProcessManagerException that was introduced in v2.5.0 - #27 Please read this blog post why this (BC breaking) change was necessary and how to handle server-sent errors now.

Fixed

  • bin/fcgiget to accept full URL paths and print STDOUT and STDERR output

Improved

  • Documentation

2.5.0 - 2019-01-29

Added

  • New ProcessManagerException in case the php-fpm responds with packages of type STDERR. This refers mainly to the error Primary script unknown resp. the response File not found..

  • CI builds for PHP 7.3

2.4.3 - 2018-09-17

Fixes

2.4.2 - 2018-01-28

Fixes

  • Missing data in php://input on worker side when client sends content larger than 65535 bytes - #15

2.4.1 - 2017-11-19

Fixes

  • PHP warning when trying to get ready request IDs - #14

Improves

  • Loop performance

2.4.0 - 2017-09-28

Added

  • Ability to add pass through callbacks in order to access output buffer from a long running callee - #11
    See an example in the documentation for further informaiton.

2.3.0 - 2017-06-15

Changed

  • Replaced methods getHost() and getPort() with getSocketAddress() in interface hollodotme\FastCGI\Interfaces\ConfiguresSocketConnection - #9
  • The transport protocol unix:// must be omitted for the first parameter of hollodotme\FastCGI\SocketConnections\UnixDomainSocket
    Only the socket path must be passed. - #9
  • Replaced fsockopen() with stream_socket_client() for connecting to php-fpm. - #9

2.2.0 - 2017-04-15

Added

  • Method addResponseCallbacks(callable ...$callbacks) to all request classes to enable response evaluation delegation
  • Method addFailureCallbacks(callable ...$callbacks) to all request classes to enable exception handling delegation
  • Method readResponse(int $requestId, ?int $timeoutMs = null) : ProvidesResponseData to read and retrieve a single response
  • Method readResponses(?int $imeoutMs = null, int ...$requestIds) : \Generator to read and yield multiple responses
  • Method readReadyResponses(?int $imeoutMs = null) : \Generator to check for ready responses, read and yield them
  • Method waitForResponses(?int $timeout = null) to Client class for waiting for multiple responses and calling the respective response callbacks - #5
  • Method getRequestIdsHavingResponse() : array to enable reactive read of responses as they occur
  • Method hasUnhandledResponses() : bool to check for outstanding responses
  • Method handleResponse(int $requestId, ?int $timeoutMs = null) to fetch a specific response and notify the respective response callback
  • Method handleResponses(?int $timeoutMs = null, int ...$requestIds) to fetch a specific responses and notify the respective response callbacks
  • Method handleReadyResponses(?int $timeoutMs = null) to check for ready responses, fetch them and notify the respective response callbacks

Changed

  • Method waitForResponse(int $requestId, ?int $timeoutMs = null) is not returning a response anymore, but will call the response callback
    Use readResponse(int $requestId, ?int $timeoutMs = null): ProvidesResponseData if you want to get the response directly.

Removed

  • Optional flag to make a connection persistent (is now always disabled in favour of better timeout handling and FPM pool-children-scalability)
  • Optional flag to keep the server-side connection alive (is now always enabled, affects only network sockets)

Improved

  • Code coverage by automated integration tests
  • Timeout handling on multiple requests

2.1.0 - 2017-03-07

Changed

  • Methods sendRequest and sendAsyncRequest expect to get an object of interface hollodotme\FastCGI\Interfaces\ProvidesRequestData - #5
  • Methods sendRequest and waitForResponse now return an object of interface hollodotme\FastCGI\Interfaces\ProvidesResponseData - #2

Added

  • Public class constants for request methods GET, POST, PUT, PATCH and DELETE in hollodotme\FastCGI\Constants\RequestMethod - #5
  • Public class constants for server protocols HTTP/1.0 and HTTP/1.1 in hollodotme\FastCGI\Constants\ServerProtocol
  • Abstract request class for implementing individual request methods, contains all request default values - #5
  • Request implementations: - #5
    • hollodotme\FastCGI\Requests\GetRequest
    • hollodotme\FastCGI\Requests\PostRequest
    • hollodotme\FastCGI\Requests\PutRequest
    • hollodotme\FastCGI\Requests\PatchRequest
    • hollodotme\FastCGI\Requests\DeleteRequest
  • Response implementation - #2

2.0.1 - 2017-02-23

Fixed

  • Erroneous response returned by Client::sendRequest() and Client::waitForResponse() - #1

Changed

  • Testsuite updated for PHPUnit >= 6

2.0.0 - 2017-01-03

Changed

  • Class constant visibility to private in class Client
  • Class constant visibility to privare in class Encoders\PacketEncoder
  • Class constant visibility to public in class SocketConnections\Defaults
  • Composer requires php >= 7.1

1.0.0 - 2017-01-03

Based on Pierrick Charron's PHP-FastCGI-Client:

Added

  • Socket connection interface ConfiguresSocketConnection
  • Socket connection classes UnixDomainSocket and NetworkSocket
  • Base exception FastCGIClientException
  • Derived exceptions ForbiddenException, ReadFailedException, TimeoutException, WriteFailedException

Changed

  • Constructor of Client now expects a ConfiguresSocketConnection instance
  • Renamed Client->request() to Client->sendRequest()
  • Renamed Client->async_request() to Client->sendAsyncRequest()
  • Renamed Client->wait_for_response() to Client->waitForResponse()

Removed

  • Unused class constants from Client
  • Getters/Setters for connect timeout, read/write timeout, keep alive, socket persistence from Client (now part of the socket connection)
  • Method Client->getValues()
v3.1.6

CHANGELOG

All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning and Keep a CHANGELOG.

3.1.6 - 2021-09-23

Added

  • PHP 8.1 comaptibility

3.1.5 - 2020-12-10

Fixed

  • Transfer of multipart/form-data blocks - #64
    • Removes base64 encoding for contents of files to transfer
    • Removes Content-Transfer-Encoding: base64 header from multipart block for files
    • Improves determination of file's MIME type via mime_content_type(), if available
    • Adds tests for multipart transfer of files with binary content (images)

3.1.4 - 2020-11-23

Added

  • PHP 8.1 compatibility
  • Makefile to run all tests based on docker-compose config

Fixed

  • TypeError on PHP 8 for a resource that is neither null nor a resource
  • Added ext-xdebug as dev-requirement in composer.json
  • Xdebug 3 coverage filter constant name for PHP 8

Replaced

  • Local shell script to run tests with Makefile

Removed

  • CI Builds on Circle-CI

3.1.3 - 2020-08-13

Fixed

  • Remove broken sockets from socket collection if writing the request to stream fails - #61
  • Do not export docker-compose.yml with composer archives via .gitattributes
  • Stabilize unreliable tests with signaled pool processes

3.1.2 - 2020-05-19

Added

  • .gitattributes file to exclude non-relevant files/directories from archives/releases installed by composer - #58

Fixed

  • Remove link to bin/fcgiget in composer.json as it is a potential security issue (because bin/fcgiget accepts any accessible fastCGI endpoint and may be exposed in some setups)

3.1.1 - 2020-05-06

Fixed

  • Backwards compatibility break in userland classes extending AbstractRequest due to a final constructor. - #56 See also: #55

3.1.0 - 2020-05-06

Added

  • Interface for request content composers with implementations for URL encoded form-data, multipart form-data and JSON data. This was inspired by - #53
  • Named constructor newWithRequestContent to all request classes in order to simplify the use of the new request content type composers.
  • For more information and examples have a look at the documentation section "Request contents".

Fixed

  • Inspection issues found by PHPStan

Updated

  • Test suites to cover PHP versions from 7.1 to 7.4
  • License dates
  • CI moved to GitHub actions

3.0.1 - 2019-10-24

Added

  • PHP 7.4 CI pipeline and docker-compose environment
  • Explicitly set error_reporting=-1 for CI and tests in order to capture deprecation warnings

Fixed

  • Replace usage of curly brace syntax for accessing string offsets, which is deprecated in PHP 7.4 - #51

3.0.0 - 2019-07-29

Please take notice of the backwards incompatible changes (BC breaks) documented below in the changelog of 3.0.0-alpha & 3.0.0-beta.

Added

  • Reserved private constant for ABORT_REQUEST instruction for future use
  • Socket ID is now represented and generated by a proper type class

Improved

  • Import of root namespace functions
  • Dependency injection for socket implementation

3.0.0-beta - 2019-06-24

Backwards incompatible changes (BC breaks)

  • The socket conection parameter was moved from the Client's constructor to

    • Client#sendRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : ProvidesResponseData and
    • Client#sendAsyncRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : int

    in order to allow sending (equal) requests to different FastCGI servers using the same Client instance. - #45

  • Removed method ProvidesResponseData#getRequestId() : int and Response#getRequestId() : int respectively in order to avoid confusion about the semantics of the term "request ID" and misusage by assuming it is a unique ID for each request (which it is not). Also the first constructor parameter of the Response class was removed with this change.

  • Renamed all $requestId(s) parameters to $socketId(s) in order to reflect the correct semantics of the ID. - #39

  • Renamed method Client#getRequestIdsHavingResponse() : array<int> to Client#getSocketIdsHavingResponse() : array<int> in order to reflect the correct semantics of the returned array of IDs. - #39

3.0.0-alpha - 2019-04-30

Backwards incompatible changes (BC breaks)

  • Method Response#getHeaders() : array will now return a two-dimensional array with grouped values to support multi-value headers. Previous versions returned a one-dimensional key-value array.

    # Previous versions
    [
      'Status' => 'HTTP/2 200 OK',
      'Set-Cookie' => 'tasty_cookie=strawberry',
    ]
    
    # Since 3.0.0-alpha
    [
      'Status' => [
        'HTTP/2 200 OK',
      ],
      'Set-Cookie' => [
        'yummy_cookie=choco',
        'tasty_cookie=strawberry',
      ],
    ]
    
  • Method Response#getHeader(string $headerKey) : array will now return an array containing all values for the given header key to support multi-value headers. Previous versions returned the last value as a string.

    echo $response->getHeader('Set-Cookie');
    
    # Previous versions
    'tasty_cookie=strawberry'
    
    # Since 3.0.0-alpha
    [
      'yummy_cookie=choco',
      'tasty_cookie=strawberry'
    ]
    
  • Method Response#getRawResponse() : string is no longer available and its usage must be replaced with Response#getOutput(). The method was deprecated since version 2.6.0.

Added

  • Method Response#getHeaderLine(string $headerKey) : string that returns all values, separated by comma, for the given key. - #35
  • Header keys are now case-insensitive in Response#getHeader(string $headerKey) : array and Response#getHeaderLine(string $headerKey) : string. - #35

Removed

  • Method Response#getRawResponse() : string that was deprecated in version 2.6.0 in favour of Response#getOutput() : string. - #36

2.7.2 - 2019-05-31

Improved

  • Handling of stream_select returning false in case of a system call interrupt. - #41

Fixed

  • Remove/close sockets after fetching their responses triggered async requests in order to prevent halt on further request processing, if the number of requests exceeds php-fpm's pm.max_children setting. - #40

2.7.1 - 2019-04-29

Fixed

  • Remove failed sockets from internal collection that errored out during reading of response in order to prevent infinite tries/re-use of those failed connections. - #37

2.7.0 - 2019-04-28

Added

  • Re-using of idle sockets for successive requests - #33

2.6.0 - 2019-04-02

Added

  • Two new methods to Response class - #27

    • Response#getOutput() which is identical to Response#getRawResponse() and will return the complete output from the STDOUT stream of the response.
    • Response#getError() which will return the complete output of the STDERR stream of the response.
  • Second parameter $errorBuffer in tha pass through callback signature - #27

    $callback = function( string $outputBuffer, string $errorBuffer ) {};
    

    This parameter will contain the contents of the STDERR stream packets.

Deprecated

  • Response#getRawResponse() in favour of consistant naming. This method will be removed in v3.0.0 - #27

Removed

  • ProcessManagerException that was introduced in v2.5.0 - #27 Please read this blog post why this (BC breaking) change was necessary and how to handle server-sent errors now.

Fixed

  • bin/fcgiget to accept full URL paths and print STDOUT and STDERR output

Improved

  • Documentation

2.5.0 - 2019-01-29

Added

  • New ProcessManagerException in case the php-fpm responds with packages of type STDERR. This refers mainly to the error Primary script unknown resp. the response File not found..

  • CI builds for PHP 7.3

2.4.3 - 2018-09-17

Fixes

2.4.2 - 2018-01-28

Fixes

  • Missing data in php://input on worker side when client sends content larger than 65535 bytes - #15

2.4.1 - 2017-11-19

Fixes

  • PHP warning when trying to get ready request IDs - #14

Improves

  • Loop performance

2.4.0 - 2017-09-28

Added

  • Ability to add pass through callbacks in order to access output buffer from a long running callee - #11
    See an example in the documentation for further informaiton.

2.3.0 - 2017-06-15

Changed

  • Replaced methods getHost() and getPort() with getSocketAddress() in interface hollodotme\FastCGI\Interfaces\ConfiguresSocketConnection - #9
  • The transport protocol unix:// must be omitted for the first parameter of hollodotme\FastCGI\SocketConnections\UnixDomainSocket
    Only the socket path must be passed. - #9
  • Replaced fsockopen() with stream_socket_client() for connecting to php-fpm. - #9

2.2.0 - 2017-04-15

Added

  • Method addResponseCallbacks(callable ...$callbacks) to all request classes to enable response evaluation delegation
  • Method addFailureCallbacks(callable ...$callbacks) to all request classes to enable exception handling delegation
  • Method readResponse(int $requestId, ?int $timeoutMs = null) : ProvidesResponseData to read and retrieve a single response
  • Method readResponses(?int $imeoutMs = null, int ...$requestIds) : \Generator to read and yield multiple responses
  • Method readReadyResponses(?int $imeoutMs = null) : \Generator to check for ready responses, read and yield them
  • Method waitForResponses(?int $timeout = null) to Client class for waiting for multiple responses and calling the respective response callbacks - #5
  • Method getRequestIdsHavingResponse() : array to enable reactive read of responses as they occur
  • Method hasUnhandledResponses() : bool to check for outstanding responses
  • Method handleResponse(int $requestId, ?int $timeoutMs = null) to fetch a specific response and notify the respective response callback
  • Method handleResponses(?int $timeoutMs = null, int ...$requestIds) to fetch a specific responses and notify the respective response callbacks
  • Method handleReadyResponses(?int $timeoutMs = null) to check for ready responses, fetch them and notify the respective response callbacks

Changed

  • Method waitForResponse(int $requestId, ?int $timeoutMs = null) is not returning a response anymore, but will call the response callback
    Use readResponse(int $requestId, ?int $timeoutMs = null): ProvidesResponseData if you want to get the response directly.

Removed

  • Optional flag to make a connection persistent (is now always disabled in favour of better timeout handling and FPM pool-children-scalability)
  • Optional flag to keep the server-side connection alive (is now always enabled, affects only network sockets)

Improved

  • Code coverage by automated integration tests
  • Timeout handling on multiple requests

2.1.0 - 2017-03-07

Changed

  • Methods sendRequest and sendAsyncRequest expect to get an object of interface hollodotme\FastCGI\Interfaces\ProvidesRequestData - #5
  • Methods sendRequest and waitForResponse now return an object of interface hollodotme\FastCGI\Interfaces\ProvidesResponseData - #2

Added

  • Public class constants for request methods GET, POST, PUT, PATCH and DELETE in hollodotme\FastCGI\Constants\RequestMethod - #5
  • Public class constants for server protocols HTTP/1.0 and HTTP/1.1 in hollodotme\FastCGI\Constants\ServerProtocol
  • Abstract request class for implementing individual request methods, contains all request default values - #5
  • Request implementations: - #5
    • hollodotme\FastCGI\Requests\GetRequest
    • hollodotme\FastCGI\Requests\PostRequest
    • hollodotme\FastCGI\Requests\PutRequest
    • hollodotme\FastCGI\Requests\PatchRequest
    • hollodotme\FastCGI\Requests\DeleteRequest
  • Response implementation - #2

2.0.1 - 2017-02-23

Fixed

  • Erroneous response returned by Client::sendRequest() and Client::waitForResponse() - #1

Changed

  • Testsuite updated for PHPUnit >= 6

2.0.0 - 2017-01-03

Changed

  • Class constant visibility to private in class Client
  • Class constant visibility to privare in class Encoders\PacketEncoder
  • Class constant visibility to public in class SocketConnections\Defaults
  • Composer requires php >= 7.1

1.0.0 - 2017-01-03

Based on Pierrick Charron's PHP-FastCGI-Client:

Added

  • Socket connection interface ConfiguresSocketConnection
  • Socket connection classes UnixDomainSocket and NetworkSocket
  • Base exception FastCGIClientException
  • Derived exceptions ForbiddenException, ReadFailedException, TimeoutException, WriteFailedException

Changed

  • Constructor of Client now expects a ConfiguresSocketConnection instance
  • Renamed Client->request() to Client->sendRequest()
  • Renamed Client->async_request() to Client->sendAsyncRequest()
  • Renamed Client->wait_for_response() to Client->waitForResponse()

Removed

  • Unused class constants from Client
  • Getters/Setters for connect timeout, read/write timeout, keep alive, socket persistence from Client (now part of the socket connection)
  • Method Client->getValues()
v3.1.5

CHANGELOG

All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning and Keep a CHANGELOG.

3.1.5 - 2020-12-10

Fixed

  • Transfer of multipart/form-data blocks - #64
    • Removes base64 encoding for contents of files to transfer
    • Removes Content-Transfer-Encoding: base64 header from multipart block for files
    • Improves determination of file's MIME type via mime_content_type(), if available
    • Adds tests for multipart transfer of files with binary content (images)

3.1.4 - 2020-11-23

Added

  • PHP 8 compatibility
  • Makefile to run all tests based on docker-compose config

Fixed

  • TypeError on PHP 8 for a resource that is neither null nor a resource
  • Added ext-xdebug as dev-requirement in composer.json
  • Xdebug 3 coverage filter constant name for PHP 8

Replaced

  • Local shell script to run tests with Makefile

Removed

  • CI Builds on Circle-CI

3.1.3 - 2020-08-13

Fixed

  • Remove broken sockets from socket collection if writing the request to stream fails - #61
  • Do not export docker-compose.yml with composer archives via .gitattributes
  • Stabilize unreliable tests with signaled pool processes

3.1.2 - 2020-05-19

Added

  • .gitattributes file to exclude non-relevant files/directories from archives/releases installed by composer - #58

Fixed

  • Remove link to bin/fcgiget in composer.json as it is a potential security issue (because bin/fcgiget accepts any accessible fastCGI endpoint and may be exposed in some setups)

3.1.1 - 2020-05-06

Fixed

  • Backwards compatibility break in userland classes extending AbstractRequest due to a final constructor. - #56 See also: #55

3.1.0 - 2020-05-06

Added

  • Interface for request content composers with implementations for URL encoded form-data, multipart form-data and JSON data. This was inspired by - #53
  • Named constructor newWithRequestContent to all request classes in order to simplify the use of the new request content type composers.
  • For more information and examples have a look at the documentation section "Request contents".

Fixed

  • Inspection issues found by PHPStan

Updated

  • Test suites to cover PHP versions from 7.1 to 7.4
  • License dates
  • CI moved to GitHub actions

3.0.1 - 2019-10-24

Added

  • PHP 7.4 CI pipeline and docker-compose environment
  • Explicitly set error_reporting=-1 for CI and tests in order to capture deprecation warnings

Fixed

  • Replace usage of curly brace syntax for accessing string offsets, which is deprecated in PHP 7.4 - #51

3.0.0 - 2019-07-29

Please take notice of the backwards incompatible changes (BC breaks) documented below in the changelog of 3.0.0-alpha & 3.0.0-beta.

Added

  • Reserved private constant for ABORT_REQUEST instruction for future use
  • Socket ID is now represented and generated by a proper type class

Improved

  • Import of root namespace functions
  • Dependency injection for socket implementation

3.0.0-beta - 2019-06-24

Backwards incompatible changes (BC breaks)

  • The socket conection parameter was moved from the Client's constructor to

    • Client#sendRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : ProvidesResponseData and
    • Client#sendAsyncRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : int

    in order to allow sending (equal) requests to different FastCGI servers using the same Client instance. - #45

  • Removed method ProvidesResponseData#getRequestId() : int and Response#getRequestId() : int respectively in order to avoid confusion about the semantics of the term "request ID" and misusage by assuming it is a unique ID for each request (which it is not). Also the first constructor parameter of the Response class was removed with this change. - #39

  • Renamed all $requestId(s) parameters to $socketId(s) in order to reflect the correct semantics of the ID. - #39

  • Renamed method Client#getRequestIdsHavingResponse() : array<int> to Client#getSocketIdsHavingResponse() : array<int> in order to reflect the correct semantics of the returned array of IDs. - #39

3.0.0-alpha - 2019-04-30

Backwards incompatible changes (BC breaks)

  • Method Response#getHeaders() : array will now return a two-dimensional array with grouped values to support multi-value headers. Previous versions returned a one-dimensional key-value array.

    # Previous versions
    [
      'Status' => 'HTTP/2 200 OK',
      'Set-Cookie' => 'tasty_cookie=strawberry',
    ]
    
    # Since 3.0.0-alpha
    [
      'Status' => [
        'HTTP/2 200 OK',
      ],
      'Set-Cookie' => [
        'yummy_cookie=choco',
        'tasty_cookie=strawberry',
      ],
    ]
    
  • Method Response#getHeader(string $headerKey) : array will now return an array containing all values for the given header key to support multi-value headers. Previous versions returned the last value as a string.

    echo $response->getHeader('Set-Cookie');
    
    # Previous versions
    'tasty_cookie=strawberry'
    
    # Since 3.0.0-alpha
    [
      'yummy_cookie=choco',
      'tasty_cookie=strawberry'
    ]
    
  • Method Response#getRawResponse() : string is no longer available and its usage must be replaced with Response#getOutput(). The method was deprecated since version 2.6.0.

Added

  • Method Response#getHeaderLine(string $headerKey) : string that returns all values, separated by comma, for the given key. - #35
  • Header keys are now case-insensitive in Response#getHeader(string $headerKey) : array and Response#getHeaderLine(string $headerKey) : string. - #35

Removed

  • Method Response#getRawResponse() : string that was deprecated in version 2.6.0 in favour of Response#getOutput() : string. - #36

2.7.2 - 2019-05-31

Improved

  • Handling of stream_select returning false in case of a system call interrupt. - #41

Fixed

  • Remove/close sockets after fetching their responses triggered async requests in order to prevent halt on further request processing, if the number of requests exceeds php-fpm's pm.max_children setting. - #40

2.7.1 - 2019-04-29

Fixed

  • Remove failed sockets from internal collection that errored out during reading of response in order to prevent infinite tries/re-use of those failed connections. - #37

2.7.0 - 2019-04-28

Added

  • Re-using of idle sockets for successive requests - #33

2.6.0 - 2019-04-02

Added

  • Two new methods to Response class - #27

    • Response#getOutput() which is identical to Response#getRawResponse() and will return the complete output from the STDOUT stream of the response.
    • Response#getError() which will return the complete output of the STDERR stream of the response.
  • Second parameter $errorBuffer in tha pass through callback signature - #27

    $callback = function( string $outputBuffer, string $errorBuffer ) {};
    

    This parameter will contain the contents of the STDERR stream packets.

Deprecated

  • Response#getRawResponse() in favour of consistant naming. This method will be removed in v3.0.0 - #27

Removed

  • ProcessManagerException that was introduced in v2.5.0 - #27 Please read this blog post why this (BC breaking) change was necessary and how to handle server-sent errors now.

Fixed

  • bin/fcgiget to accept full URL paths and print STDOUT and STDERR output

Improved

  • Documentation

2.5.0 - 2019-01-29

Added

  • New ProcessManagerException in case the php-fpm responds with packages of type STDERR. This refers mainly to the error Primary script unknown resp. the response File not found..

  • CI builds for PHP 7.3

2.4.3 - 2018-09-17

Fixes

2.4.2 - 2018-01-28

Fixes

  • Missing data in php://input on worker side when client sends content larger than 65535 bytes - #15

2.4.1 - 2017-11-19

Fixes

  • PHP warning when trying to get ready request IDs - #14

Improves

  • Loop performance

2.4.0 - 2017-09-28

Added

  • Ability to add pass through callbacks in order to access output buffer from a long running callee - #11
    See an example in the documentation for further informaiton.

2.3.0 - 2017-06-15

Changed

  • Replaced methods getHost() and getPort() with getSocketAddress() in interface hollodotme\FastCGI\Interfaces\ConfiguresSocketConnection - #9
  • The transport protocol unix:// must be omitted for the first parameter of hollodotme\FastCGI\SocketConnections\UnixDomainSocket
    Only the socket path must be passed. - #9
  • Replaced fsockopen() with stream_socket_client() for connecting to php-fpm. - #9

2.2.0 - 2017-04-15

Added

  • Method addResponseCallbacks(callable ...$callbacks) to all request classes to enable response evaluation delegation - #6
  • Method addFailureCallbacks(callable ...$callbacks) to all request classes to enable exception handling delegation
  • Method readResponse(int $requestId, ?int $timeoutMs = null) : ProvidesResponseData to read and retrieve a single response
  • Method readResponses(?int $imeoutMs = null, int ...$requestIds) : \Generator to read and yield multiple responses
  • Method readReadyResponses(?int $imeoutMs = null) : \Generator to check for ready responses, read and yield them
  • Method waitForResponses(?int $timeout = null) to Client class for waiting for multiple responses and calling the respective response callbacks - #5
  • Method getRequestIdsHavingResponse() : array to enable reactive read of responses as they occur
  • Method hasUnhandledResponses() : bool to check for outstanding responses
  • Method handleResponse(int $requestId, ?int $timeoutMs = null) to fetch a specific response and notify the respective response callback
  • Method handleResponses(?int $timeoutMs = null, int ...$requestIds) to fetch a specific responses and notify the respective response callbacks
  • Method handleReadyResponses(?int $timeoutMs = null) to check for ready responses, fetch them and notify the respective response callbacks

Changed

  • Method waitForResponse(int $requestId, ?int $timeoutMs = null) is not returning a response anymore, but will call the response callback
    Use readResponse(int $requestId, ?int $timeoutMs = null): ProvidesResponseData if you want to get the response directly.

Removed

  • Optional flag to make a connection persistent (is now always disabled in favour of better timeout handling and FPM pool-children-scalability)
  • Optional flag to keep the server-side connection alive (is now always enabled, affects only network sockets)

Improved

  • Code coverage by automated integration tests
  • Timeout handling on multiple requests

2.1.0 - 2017-03-07

Changed

  • Methods sendRequest and sendAsyncRequest expect to get an object of interface hollodotme\FastCGI\Interfaces\ProvidesRequestData - #5
  • Methods sendRequest and waitForResponse now return an object of interface hollodotme\FastCGI\Interfaces\ProvidesResponseData - #2

Added

  • Public class constants for request methods GET, POST, PUT, PATCH and DELETE in hollodotme\FastCGI\Constants\RequestMethod - #5
  • Public class constants for server protocols HTTP/1.0 and HTTP/1.1 in hollodotme\FastCGI\Constants\ServerProtocol - #5
  • Abstract request class for implementing individual request methods, contains all request default values - #5
  • Request implementations: - #5
    • hollodotme\FastCGI\Requests\GetRequest
    • hollodotme\FastCGI\Requests\PostRequest
    • hollodotme\FastCGI\Requests\PutRequest
    • hollodotme\FastCGI\Requests\PatchRequest
    • hollodotme\FastCGI\Requests\DeleteRequest
  • Response implementation - #2

2.0.1 - 2017-02-23

Fixed

  • Erroneous response returned by Client::sendRequest() and Client::waitForResponse() - #1

Changed

  • Testsuite updated for PHPUnit >= 6

2.0.0 - 2017-01-03

Changed

  • Class constant visibility to private in class Client
  • Class constant visibility to privare in class Encoders\PacketEncoder
  • Class constant visibility to public in class SocketConnections\Defaults
  • Composer requires php >= 7.1

1.0.0 - 2017-01-03

Based on Pierrick Charron's PHP-FastCGI-Client:

Added

  • Socket connection interface ConfiguresSocketConnection
  • Socket connection classes UnixDomainSocket and NetworkSocket
  • Base exception FastCGIClientException
  • Derived exceptions ForbiddenException, ReadFailedException, TimeoutException, WriteFailedException

Changed

  • Constructor of Client now expects a ConfiguresSocketConnection instance
  • Renamed Client->request() to Client->sendRequest()
  • Renamed Client->async_request() to Client->sendAsyncRequest()
  • Renamed Client->wait_for_response() to Client->waitForResponse()

Removed

  • Unused class constants from Client
  • Getters/Setters for connect timeout, read/write timeout, keep alive, socket persistence from Client (now part of the socket connection)
  • Method Client->getValues()
v3.1.4

CHANGELOG

All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning and Keep a CHANGELOG.

3.1.4 - 2020-11-23

Added

  • PHP 8 compatibility
  • Makefile to run all tests based on docker-compose config

Fixed

  • TypeError on PHP 8 for a resource that is neither null nor a resource
  • Added ext-xdebug as dev-requirement in composer.json
  • Xdebug 3 coverage filter constant name for PHP 8

Replaced

  • Local shell script to run tests with Makefile

Removed

  • CI Builds on Circle-CI

3.1.3 - 2020-08-13

Fixed

  • Remove broken sockets from socket collection if writing the request to stream fails - #61
  • Do not export docker-compose.yml with composer archives via .gitattributes
  • Stabilize unreliable tests with signaled pool processes

3.1.2 - 2020-05-19

Added

  • .gitattributes file to exclude non-relevant files/directories from archives/releases installed by composer - #58

Fixed

  • Remove link to bin/fcgiget in composer.json as it is a potential security issue (because bin/fcgiget accepts any accessible fastCGI endpoint and may be exposed in some setups)

3.1.1 - 2020-05-06

Fixed

  • Backwards compatibility break in userland classes extending AbstractRequest due to a final constructor. - #56 See also: #55

3.1.0 - 2020-05-06

Added

  • Interface for request content composers with implementations for URL encoded form-data, multipart form-data and JSON data. This was inspired by - #53
  • Named constructor newWithRequestContent to all request classes in order to simplify the use of the new request content type composers.
  • For more information and examples have a look at the documentation section "Request contents".

Fixed

  • Inspection issues found by PHPStan

Updated

  • Test suites to cover PHP versions from 7.1 to 7.4
  • License dates
  • CI moved to GitHub actions

3.0.1 - 2019-10-24

Added

  • PHP 7.4 CI pipeline and docker-compose environment
  • Explicitly set error_reporting=-1 for CI and tests in order to capture deprecation warnings

Fixed

  • Replace usage of curly brace syntax for accessing string offsets, which is deprecated in PHP 7.4 - #51

3.0.0 - 2019-07-29

Please take notice of the backwards incompatible changes (BC breaks) documented below in the changelog of 3.0.0-alpha & 3.0.0-beta.

Added

  • Reserved private constant for ABORT_REQUEST instruction for future use
  • Socket ID is now represented and generated by a proper type class

Improved

  • Import of root namespace functions
  • Dependency injection for socket implementation

3.0.0-beta - 2019-06-24

Backwards incompatible changes (BC breaks)

  • The socket conection parameter was moved from the Client's constructor to

    • Client#sendRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : ProvidesResponseData and
    • Client#sendAsyncRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : int

    in order to allow sending (equal) requests to different FastCGI servers using the same Client instance. - #45

  • Removed method ProvidesResponseData#getRequestId() : int and Response#getRequestId() : int respectively in order to avoid confusion about the semantics of the term "request ID" and misusage by assuming it is a unique ID for each request (which it is not). Also the first constructor parameter of the Response class was removed with this change. - #39

  • Renamed all $requestId(s) parameters to $socketId(s) in order to reflect the correct semantics of the ID. - #39

  • Renamed method Client#getRequestIdsHavingResponse() : array<int> to Client#getSocketIdsHavingResponse() : array<int> in order to reflect the correct semantics of the returned array of IDs. - #39

3.0.0-alpha - 2019-04-30

Backwards incompatible changes (BC breaks)

  • Method Response#getHeaders() : array will now return a two-dimensional array with grouped values to support multi-value headers. Previous versions returned a one-dimensional key-value array.

    # Previous versions
    [
      'Status' => 'HTTP/2 200 OK',
      'Set-Cookie' => 'tasty_cookie=strawberry',
    ]
    
    # Since 3.0.0-alpha
    [
      'Status' => [
        'HTTP/2 200 OK',
      ],
      'Set-Cookie' => [
        'yummy_cookie=choco',
        'tasty_cookie=strawberry',
      ],
    ]
    
  • Method Response#getHeader(string $headerKey) : array will now return an array containing all values for the given header key to support multi-value headers. Previous versions returned the last value as a string.

    echo $response->getHeader('Set-Cookie');
    
    # Previous versions
    'tasty_cookie=strawberry'
    
    # Since 3.0.0-alpha
    [
      'yummy_cookie=choco',
      'tasty_cookie=strawberry'
    ]
    
  • Method Response#getRawResponse() : string is no longer available and its usage must be replaced with Response#getOutput(). The method was deprecated since version 2.6.0.

Added

  • Method Response#getHeaderLine(string $headerKey) : string that returns all values, separated by comma, for the given key. - #35
  • Header keys are now case-insensitive in Response#getHeader(string $headerKey) : array and Response#getHeaderLine(string $headerKey) : string. - #35

Removed

  • Method Response#getRawResponse() : string that was deprecated in version 2.6.0 in favour of Response#getOutput() : string. - #36

2.7.2 - 2019-05-31

Improved

  • Handling of stream_select returning false in case of a system call interrupt. - #41

Fixed

  • Remove/close sockets after fetching their responses triggered async requests in order to prevent halt on further request processing, if the number of requests exceeds php-fpm's pm.max_children setting. - #40

2.7.1 - 2019-04-29

Fixed

  • Remove failed sockets from internal collection that errored out during reading of response in order to prevent infinite tries/re-use of those failed connections. - #37

2.7.0 - 2019-04-28

Added

  • Re-using of idle sockets for successive requests - #33

2.6.0 - 2019-04-02

Added

  • Two new methods to Response class - #27

    • Response#getOutput() which is identical to Response#getRawResponse() and will return the complete output from the STDOUT stream of the response.
    • Response#getError() which will return the complete output of the STDERR stream of the response.
  • Second parameter $errorBuffer in tha pass through callback signature - #27

    $callback = function( string $outputBuffer, string $errorBuffer ) {};
    

    This parameter will contain the contents of the STDERR stream packets.

Deprecated

  • Response#getRawResponse() in favour of consistant naming. This method will be removed in v3.0.0 - #27

Removed

  • ProcessManagerException that was introduced in v2.5.0 - #27 Please read this blog post why this (BC breaking) change was necessary and how to handle server-sent errors now.

Fixed

  • bin/fcgiget to accept full URL paths and print STDOUT and STDERR output

Improved

  • Documentation

2.5.0 - 2019-01-29

Added

  • New ProcessManagerException in case the php-fpm responds with packages of type STDERR. This refers mainly to the error Primary script unknown resp. the response File not found..

  • CI builds for PHP 7.3

2.4.3 - 2018-09-17

Fixes

2.4.2 - 2018-01-28

Fixes

  • Missing data in php://input on worker side when client sends content larger than 65535 bytes - #15

2.4.1 - 2017-11-19

Fixes

  • PHP warning when trying to get ready request IDs - #14

Improves

  • Loop performance

2.4.0 - 2017-09-28

Added

  • Ability to add pass through callbacks in order to access output buffer from a long running callee - #11
    See an example in the documentation for further informaiton.

2.3.0 - 2017-06-15

Changed

  • Replaced methods getHost() and getPort() with getSocketAddress() in interface hollodotme\FastCGI\Interfaces\ConfiguresSocketConnection - #9
  • The transport protocol unix:// must be omitted for the first parameter of hollodotme\FastCGI\SocketConnections\UnixDomainSocket
    Only the socket path must be passed. - #9
  • Replaced fsockopen() with stream_socket_client() for connecting to php-fpm. - #9

2.2.0 - 2017-04-15

Added

  • Method addResponseCallbacks(callable ...$callbacks) to all request classes to enable response evaluation delegation - #6
  • Method addFailureCallbacks(callable ...$callbacks) to all request classes to enable exception handling delegation
  • Method readResponse(int $requestId, ?int $timeoutMs = null) : ProvidesResponseData to read and retrieve a single response
  • Method readResponses(?int $imeoutMs = null, int ...$requestIds) : \Generator to read and yield multiple responses
  • Method readReadyResponses(?int $imeoutMs = null) : \Generator to check for ready responses, read and yield them
  • Method waitForResponses(?int $timeout = null) to Client class for waiting for multiple responses and calling the respective response callbacks - #5
  • Method getRequestIdsHavingResponse() : array to enable reactive read of responses as they occur
  • Method hasUnhandledResponses() : bool to check for outstanding responses
  • Method handleResponse(int $requestId, ?int $timeoutMs = null) to fetch a specific response and notify the respective response callback
  • Method handleResponses(?int $timeoutMs = null, int ...$requestIds) to fetch a specific responses and notify the respective response callbacks
  • Method handleReadyResponses(?int $timeoutMs = null) to check for ready responses, fetch them and notify the respective response callbacks

Changed

  • Method waitForResponse(int $requestId, ?int $timeoutMs = null) is not returning a response anymore, but will call the response callback
    Use readResponse(int $requestId, ?int $timeoutMs = null): ProvidesResponseData if you want to get the response directly.

Removed

  • Optional flag to make a connection persistent (is now always disabled in favour of better timeout handling and FPM pool-children-scalability)
  • Optional flag to keep the server-side connection alive (is now always enabled, affects only network sockets)

Improved

  • Code coverage by automated integration tests
  • Timeout handling on multiple requests

2.1.0 - 2017-03-07

Changed

  • Methods sendRequest and sendAsyncRequest expect to get an object of interface hollodotme\FastCGI\Interfaces\ProvidesRequestData - #5
  • Methods sendRequest and waitForResponse now return an object of interface hollodotme\FastCGI\Interfaces\ProvidesResponseData - #2

Added

  • Public class constants for request methods GET, POST, PUT, PATCH and DELETE in hollodotme\FastCGI\Constants\RequestMethod - #5
  • Public class constants for server protocols HTTP/1.0 and HTTP/1.1 in hollodotme\FastCGI\Constants\ServerProtocol - #5
  • Abstract request class for implementing individual request methods, contains all request default values - #5
  • Request implementations: - #5
    • hollodotme\FastCGI\Requests\GetRequest
    • hollodotme\FastCGI\Requests\PostRequest
    • hollodotme\FastCGI\Requests\PutRequest
    • hollodotme\FastCGI\Requests\PatchRequest
    • hollodotme\FastCGI\Requests\DeleteRequest
  • Response implementation - #2

2.0.1 - 2017-02-23

Fixed

  • Erroneous response returned by Client::sendRequest() and Client::waitForResponse() - #1

Changed

  • Testsuite updated for PHPUnit >= 6

2.0.0 - 2017-01-03

Changed

  • Class constant visibility to private in class Client
  • Class constant visibility to privare in class Encoders\PacketEncoder
  • Class constant visibility to public in class SocketConnections\Defaults
  • Composer requires php >= 7.1

1.0.0 - 2017-01-03

Based on Pierrick Charron's PHP-FastCGI-Client:

Added

  • Socket connection interface ConfiguresSocketConnection
  • Socket connection classes UnixDomainSocket and NetworkSocket
  • Base exception FastCGIClientException
  • Derived exceptions ForbiddenException, ReadFailedException, TimeoutException, WriteFailedException

Changed

  • Constructor of Client now expects a ConfiguresSocketConnection instance
  • Renamed Client->request() to Client->sendRequest()
  • Renamed Client->async_request() to Client->sendAsyncRequest()
  • Renamed Client->wait_for_response() to Client->waitForResponse()

Removed

  • Unused class constants from Client
  • Getters/Setters for connect timeout, read/write timeout, keep alive, socket persistence from Client (now part of the socket connection)
  • Method Client->getValues()
v3.1.3

CHANGELOG

All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning and Keep a CHANGELOG.

3.1.3 - 2020-08-13

Fixed

  • Remove broken sockets from socket collection if writing the request to stream fails - #61
  • Do not export docker-compose.yml with composer archives via .gitattributes
  • Stabilize unreliable tests with signaled pool processes

3.1.2 - 2020-05-19

Added

  • .gitattributes file to exclude non-relevant files/directories from archives/releases installed by composer - #58

Fixed

  • Remove link to bin/fcgiget in composer.json as it is a potential security issue (because bin/fcgiget accepts any accessible fastCGI endpoint and may be exposed in some setups)

3.1.1 - 2020-05-06

Fixed

  • Backwards compatibility break in userland classes extending AbstractRequest due to a final constructor. - #56 See also: #55

3.1.0 - 2020-05-06

Added

  • Interface for request content composers with implementations for URL encoded form-data, multipart form-data and JSON data. This was inspired by - #53
  • Named constructor newWithRequestContent to all request classes in order to simplify the use of the new request content type composers.
  • For more information and examples have a look at the documentation section "Request contents".

Fixed

  • Inspection issues found by PHPStan

Updated

  • Test suites to cover PHP versions from 7.1 to 7.4
  • License dates
  • CI moved to GitHub actions

3.0.1 - 2019-10-24

Added

  • PHP 7.4 CI pipeline and docker-compose environment
  • Explicitly set error_reporting=-1 for CI and tests in order to capture deprecation warnings

Fixed

  • Replace usage of curly brace syntax for accessing string offsets, which is deprecated in PHP 7.4 - #51

3.0.0 - 2019-07-29

Please take notice of the backwards incompatible changes (BC breaks) documented below in the changelog of 3.0.0-alpha & 3.0.0-beta.

Added

  • Reserved private constant for ABORT_REQUEST instruction for future use
  • Socket ID is now represented and generated by a proper type class

Improved

  • Import of root namespace functions
  • Dependency injection for socket implementation

3.0.0-beta - 2019-06-24

Backwards incompatible changes (BC breaks)

  • The socket conection parameter was moved from the Client's constructor to

    • Client#sendRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : ProvidesResponseData and
    • Client#sendAsyncRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : int

    in order to allow sending (equal) requests to different FastCGI servers using the same Client instance. - #45

  • Removed method ProvidesResponseData#getRequestId() : int and Response#getRequestId() : int resepctivly in order to avoid confusion about the semantics of the term "request ID" and misusage by assuming it is a unique ID for each request (which it is not). Also the first constructor parameter of the Response class was removed wiht this change. - #39

  • Renamed all $requestId(s) parameters to $socketId(s) in order to reflect the correct semantics of the ID. - #39

  • Renamed method Client#getRequestIdsHavingResponse() : array<int> to Client#getSocketIdsHavingResponse() : array<int> in order to reflect the correct semantics of the returned array of IDs. - #39

3.0.0-alpha - 2019-04-30

Backwards incompatible changes (BC breaks)

  • Method Response#getHeaders() : array will now return a two-dimensional array with grouped values to support multi-value headers. Previous versions returned a one-dimensional key-value array.

    # Previous versions
    [
      'Status' => 'HTTP/2 200 OK',
      'Set-Cookie' => 'tasty_cookie=strawberry',
    ]
    
    # Since 3.0.0-alpha
    [
      'Status' => [
        'HTTP/2 200 OK',
      ],
      'Set-Cookie' => [
        'yummy_cookie=choco',
        'tasty_cookie=strawberry',
      ],
    ]
    
  • Method Response#getHeader(string $headerKey) : array will now return an array containing all values for the given header key to support multi-value headers. Previous versions returned the last value as a string.

    echo $response->getHeader('Set-Cookie');
    
    # Previous versions
    'tasty_cookie=strawberry'
    
    # Since 3.0.0-alpha
    [
      'yummy_cookie=choco',
      'tasty_cookie=strawberry'
    ]
    
  • Method Response#getRawResponse() : string is no longer available and its usage must be replaced with Response#getOutput(). The method was deprecated since version 2.6.0.

Added

  • Method Response#getHeaderLine(string $headerKey) : string that returns all values, separated by comma, for the given key. - #35
  • Header keys are now case-insensitive in Response#getHeader(string $headerKey) : array and Response#getHeaderLine(string $headerKey) : string. - #35

Removed

  • Method Response#getRawResponse() : string that was deprecated in version 2.6.0 in favour of Response#getOutput() : string. - #36

2.7.2 - 2019-05-31

Improved

  • Handling of stream_select returning false in case of a system call interrupt. - #41

Fixed

  • Remove/close sockets after fetching their responses triggered async requests in order to prevent halt on further request processing, if the number of requests exceeds php-fpm's pm.max_children setting. - #40

2.7.1 - 2019-04-29

Fixed

  • Remove failed sockets from internal collection that errored out during reading of response in order to prevent infinite tries/re-use of those failed connections. - #37

2.7.0 - 2019-04-28

Added

  • Re-using of idle sockets for successive requests - #33

2.6.0 - 2019-04-02

Added

  • Two new methods to Response class - #27

    • Response#getOutput() which is identical to Response#getRawResponse() and will return the complete output from the STDOUT stream of the response.
    • Response#getError() which will return the complete output of the STDERR stream of the response.
  • Second parameter $errorBuffer in tha pass through callback signature - #27

    $callback = function( string $outputBuffer, string $errorBuffer ) {};
    

    This parameter will contain the contents of the STDERR stream packets.

Deprecated

  • Response#getRawResponse() in favour of consistant naming. This method will be removed in v3.0.0 - #27

Removed

  • ProcessManagerException that was introduced in v2.5.0 - #27 Please read this blog post why this (BC breaking) change was necessary and how to handle server-sent errors now.

Fixed

  • bin/fcgiget to accept full URL paths and print STDOUT and STDERR output

Improved

  • Documentation

2.5.0 - 2019-01-29

Added

  • New ProcessManagerException in case the php-fpm responds with packages of type STDERR. This refers mainly to the error Primary script unknown resp. the response File not found..

  • CI builds for PHP 7.3

2.4.3 - 2018-09-17

Fixes

2.4.2 - 2018-01-28

Fixes

  • Missing data in php://input on worker side when client sends content larger than 65535 bytes - #15

2.4.1 - 2017-11-19

Fixes

  • PHP warning when trying to get ready request IDs - #14

Improves

  • Loop performance

2.4.0 - 2017-09-28

Added

  • Ability to add pass through callbacks in order to access output buffer from a long running callee - #11
    See an example in the documentation for further informaiton.

2.3.0 - 2017-06-15

Changed

  • Replaced methods getHost() and getPort() with getSocketAddress() in interface hollodotme\FastCGI\Interfaces\ConfiguresSocketConnection - #9
  • The transport protocol unix:// must be omitted for the first parameter of hollodotme\FastCGI\SocketConnections\UnixDomainSocket
    Only the socket path must be passed. - #9
  • Replaced fsockopen() with stream_socket_client() for connecting to php-fpm. - #9

2.2.0 - 2017-04-15

Added

  • Method addResponseCallbacks(callable ...$callbacks) to all request classes to enable response evaluation delegation - #6
  • Method addFailureCallbacks(callable ...$callbacks) to all request classes to enable exception handling delegation
  • Method readResponse(int $requestId, ?int $timeoutMs = null) : ProvidesResponseData to read and retrieve a single response
  • Method readResponses(?int $imeoutMs = null, int ...$requestIds) : \Generator to read and yield multiple responses
  • Method readReadyResponses(?int $imeoutMs = null) : \Generator to check for ready responses, read and yield them
  • Method waitForResponses(?int $timeout = null) to Client class for waiting for multiple responses and calling the respective response callbacks - #5
  • Method getRequestIdsHavingResponse() : array to enable reactive read of responses as they occur
  • Method hasUnhandledResponses() : bool to check for outstanding responses
  • Method handleResponse(int $requestId, ?int $timeoutMs = null) to fetch a specific response and notify the respective response callback
  • Method handleResponses(?int $timeoutMs = null, int ...$requestIds) to fetch a specific responses and notify the respective response callbacks
  • Method handleReadyResponses(?int $timeoutMs = null) to check for ready responses, fetch them and notify the respective response callbacks

Changed

  • Method waitForResponse(int $requestId, ?int $timeoutMs = null) is not returning a response anymore, but will call the response callback
    Use readResponse(int $requestId, ?int $timeoutMs = null): ProvidesResponseData if you want to get the response directly.

Removed

  • Optional flag to make a connection persistent (is now always disabled in favour of better timeout handling and FPM pool-children-scalability)
  • Optional flag to keep the server-side connection alive (is now always enabled, affects only network sockets)

Improved

  • Code coverage by automated integration tests
  • Timeout handling on multiple requests

2.1.0 - 2017-03-07

Changed

  • Methods sendRequest and sendAsyncRequest expect to get an object of interface hollodotme\FastCGI\Interfaces\ProvidesRequestData - #5
  • Methods sendRequest and waitForResponse now return an object of interface hollodotme\FastCGI\Interfaces\ProvidesResponseData - #2

Added

  • Public class constants for request methods GET, POST, PUT, PATCH and DELETE in hollodotme\FastCGI\Constants\RequestMethod - #5
  • Public class constants for server protocols HTTP/1.0 and HTTP/1.1 in hollodotme\FastCGI\Constants\ServerProtocol - #5
  • Abstract request class for implementing individual request methods, contains all request default values - #5
  • Request implementations: - #5
    • hollodotme\FastCGI\Requests\GetRequest
    • hollodotme\FastCGI\Requests\PostRequest
    • hollodotme\FastCGI\Requests\PutRequest
    • hollodotme\FastCGI\Requests\PatchRequest
    • hollodotme\FastCGI\Requests\DeleteRequest
  • Response implementation - #2

2.0.1 - 2017-02-23

Fixed

  • Erroneous response returned by Client::sendRequest() and Client::waitForResponse() - #1

Changed

  • Testsuite updated for PHPUnit >= 6

2.0.0 - 2017-01-03

Changed

  • Class constant visibility to private in class Client
  • Class constant visibility to privare in class Encoders\PacketEncoder
  • Class constant visibility to public in class SocketConnections\Defaults
  • Composer requires php >= 7.1

1.0.0 - 2017-01-03

Based on Pierrick Charron's PHP-FastCGI-Client:

Added

  • Socket connection interface ConfiguresSocketConnection
  • Socket connection classes UnixDomainSocket and NetworkSocket
  • Base exception FastCGIClientException
  • Derived exceptions ForbiddenException, ReadFailedException, TimeoutException, WriteFailedException

Changed

  • Constructor of Client now expects a ConfiguresSocketConnection instance
  • Renamed Client->request() to Client->sendRequest()
  • Renamed Client->async_request() to Client->sendAsyncRequest()
  • Renamed Client->wait_for_response() to Client->waitForResponse()

Removed

  • Unused class constants from Client
  • Getters/Setters for connect timeout, read/write timeout, keep alive, socket persistence from Client (now part of the socket connection)
  • Method Client->getValues()
v3.1.2

CHANGELOG

All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning and Keep a CHANGELOG.

3.1.2 - 2020-05-19

Added

  • .gitattributes file to exclude non-relevant files/directories from archives/releases installed by composer - #58

Fixed

  • Remove link to bin/fcgiget in composer.json as it is a potential security issue (because bin/fcgiget accepts any accessible fastCGI endpoint and may be exposed in some setups)

3.1.1 - 2020-05-06

Fixed

  • Backwards compatibility break in userland classes extending AbstractRequest due to a final constructor. - #56 See also: #55

3.1.0 - 2020-05-06

Added

  • Interface for request content composers with implementations for URL encoded form-data, multipart form-data and JSON data. This was inspired by - #53
  • Named constructor newWithRequestContent to all request classes in order to simplify the use of the new request content type composers.
  • For more information and examples have a look at the documentation section "Request contents".

Fixed

  • Inspection issues found by PHPStan

Updated

  • Test suites to cover PHP versions from 7.1 to 7.4
  • License dates
  • CI moved to GitHub actions

3.0.1 - 2019-10-24

Added

  • PHP 7.4 CI pipeline and docker-compose environment
  • Explicitly set error_reporting=-1 for CI and tests in order to capture deprecation warnings

Fixed

  • Replace usage of curly brace syntax for accessing string offsets, which is deprecated in PHP 7.4 - #51

3.0.0 - 2019-07-29

Please take notice of the backwards incompatible changes (BC breaks) documented below in the changelog of 3.0.0-alpha & 3.0.0-beta.

Added

  • Reserved private constant for ABORT_REQUEST instruction for future use
  • Socket ID is now represented and generated by a proper type class

Improved

  • Import of root namespace functions
  • Dependency injection for socket implementation

3.0.0-beta - 2019-06-24

Backwards incompatible changes (BC breaks)

  • The socket conection parameter was moved from the Client's constructor to

    • Client#sendRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : ProvidesResponseData and
    • Client#sendAsyncRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : int

    in order to allow sending (equal) requests to different FastCGI servers using the same Client instance. - #45

  • Removed method ProvidesResponseData#getRequestId() : int and Response#getRequestId() : int resepctivly in order to avoid confusion about the semantics of the term "request ID" and misusage by assuming it is a unique ID for each request (which it is not). Also the first constructor parameter of the Response class was removed wiht this change. - #39

  • Renamed all $requestId(s) parameters to $socketId(s) in order to reflect the correct semantics of the ID. - #39

  • Renamed method Client#getRequestIdsHavingResponse() : array<int> to Client#getSocketIdsHavingResponse() : array<int> in order to reflect the correct semantics of the returned array of IDs. - #39

3.0.0-alpha - 2019-04-30

Backwards incompatible changes (BC breaks)

  • Method Response#getHeaders() : array will now return a two-dimensional array with grouped values to support multi-value headers. Previous versions returned a one-dimensional key-value array.

    # Previous versions
    [
      'Status' => 'HTTP/2 200 OK',
      'Set-Cookie' => 'tasty_cookie=strawberry',
    ]
    
    # Since 3.0.0-alpha
    [
      'Status' => [
        'HTTP/2 200 OK',
      ],
      'Set-Cookie' => [
        'yummy_cookie=choco',
        'tasty_cookie=strawberry',
      ],
    ]
    
  • Method Response#getHeader(string $headerKey) : array will now return an array containing all values for the given header key to support multi-value headers. Previous versions returned the last value as a string.

    echo $response->getHeader('Set-Cookie');
    
    # Previous versions
    'tasty_cookie=strawberry'
    
    # Since 3.0.0-alpha
    [
      'yummy_cookie=choco',
      'tasty_cookie=strawberry'
    ]
    
  • Method Response#getRawResponse() : string is no longer available and its usage must be replaced with Response#getOutput(). The method was deprecated since version 2.6.0.

Added

  • Method Response#getHeaderLine(string $headerKey) : string that returns all values, separated by comma, for the given key. - #35
  • Header keys are now case-insensitive in Response#getHeader(string $headerKey) : array and Response#getHeaderLine(string $headerKey) : string. - #35

Removed

  • Method Response#getRawResponse() : string that was deprecated in version 2.6.0 in favour of Response#getOutput() : string. - #36

2.7.2 - 2019-05-31

Improved

  • Handling of stream_select returning false in case of a system call interrupt. - #41

Fixed

  • Remove/close sockets after fetching their responses triggered async requests in order to prevent halt on further request processing, if the number of requests exceeds php-fpm's pm.max_children setting. - #40

2.7.1 - 2019-04-29

Fixed

  • Remove failed sockets from internal collection that errored out during reading of response in order to prevent infinite tries/re-use of those failed connections. - #37

2.7.0 - 2019-04-28

Added

  • Re-using of idle sockets for successive requests - #33

2.6.0 - 2019-04-02

Added

  • Two new methods to Response class - #27

    • Response#getOutput() which is identical to Response#getRawResponse() and will return the complete output from the STDOUT stream of the response.
    • Response#getError() which will return the complete output of the STDERR stream of the response.
  • Second parameter $errorBuffer in tha pass through callback signature - #27

    $callback = function( string $outputBuffer, string $errorBuffer ) {};
    

    This parameter will contain the contents of the STDERR stream packets.

Deprecated

  • Response#getRawResponse() in favour of consistant naming. This method will be removed in v3.0.0 - #27

Removed

  • ProcessManagerException that was introduced in v2.5.0 - #27 Please read this blog post why this (BC breaking) change was necessary and how to handle server-sent errors now.

Fixed

  • bin/fcgiget to accept full URL paths and print STDOUT and STDERR output

Improved

  • Documentation

2.5.0 - 2019-01-29

Added

  • New ProcessManagerException in case the php-fpm responds with packages of type STDERR. This refers mainly to the error Primary script unknown resp. the response File not found..

  • CI builds for PHP 7.3

2.4.3 - 2018-09-17

Fixes

2.4.2 - 2018-01-28

Fixes

  • Missing data in php://input on worker side when client sends content larger than 65535 bytes - #15

2.4.1 - 2017-11-19

Fixes

  • PHP warning when trying to get ready request IDs - #14

Improves

  • Loop performance

2.4.0 - 2017-09-28

Added

  • Ability to add pass through callbacks in order to access output buffer from a long running callee - #11
    See an example in the documentation for further informaiton.

2.3.0 - 2017-06-15

Changed

  • Replaced methods getHost() and getPort() with getSocketAddress() in interface hollodotme\FastCGI\Interfaces\ConfiguresSocketConnection - #9
  • The transport protocol unix:// must be omitted for the first parameter of hollodotme\FastCGI\SocketConnections\UnixDomainSocket
    Only the socket path must be passed. - #9
  • Replaced fsockopen() with stream_socket_client() for connecting to php-fpm. - #9

2.2.0 - 2017-04-15

Added

  • Method addResponseCallbacks(callable ...$callbacks) to all request classes to enable response evaluation delegation - #6
  • Method addFailureCallbacks(callable ...$callbacks) to all request classes to enable exception handling delegation
  • Method readResponse(int $requestId, ?int $timeoutMs = null) : ProvidesResponseData to read and retrieve a single response
  • Method readResponses(?int $imeoutMs = null, int ...$requestIds) : \Generator to read and yield multiple responses
  • Method readReadyResponses(?int $imeoutMs = null) : \Generator to check for ready responses, read and yield them
  • Method waitForResponses(?int $timeout = null) to Client class for waiting for multiple responses and calling the respective response callbacks - #5
  • Method getRequestIdsHavingResponse() : array to enable reactive read of responses as they occur
  • Method hasUnhandledResponses() : bool to check for outstanding responses
  • Method handleResponse(int $requestId, ?int $timeoutMs = null) to fetch a specific response and notify the respective response callback
  • Method handleResponses(?int $timeoutMs = null, int ...$requestIds) to fetch a specific responses and notify the respective response callbacks
  • Method handleReadyResponses(?int $timeoutMs = null) to check for ready responses, fetch them and notify the respective response callbacks

Changed

  • Method waitForResponse(int $requestId, ?int $timeoutMs = null) is not returning a response anymore, but will call the response callback
    Use readResponse(int $requestId, ?int $timeoutMs = null): ProvidesResponseData if you want to get the response directly.

Removed

  • Optional flag to make a connection persistent (is now always disabled in favour of better timeout handling and FPM pool-children-scalability)
  • Optional flag to keep the server-side connection alive (is now always enabled, affects only network sockets)

Improved

  • Code coverage by automated integration tests
  • Timeout handling on multiple requests

2.1.0 - 2017-03-07

Changed

  • Methods sendRequest and sendAsyncRequest expect to get an object of interface hollodotme\FastCGI\Interfaces\ProvidesRequestData - #5
  • Methods sendRequest and waitForResponse now return an object of interface hollodotme\FastCGI\Interfaces\ProvidesResponseData - #2

Added

  • Public class constants for request methods GET, POST, PUT, PATCH and DELETE in hollodotme\FastCGI\Constants\RequestMethod - #5
  • Public class constants for server protocols HTTP/1.0 and HTTP/1.1 in hollodotme\FastCGI\Constants\ServerProtocol - #5
  • Abstract request class for implementing individual request methods, contains all request default values - #5
  • Request implementations: - #5
    • hollodotme\FastCGI\Requests\GetRequest
    • hollodotme\FastCGI\Requests\PostRequest
    • hollodotme\FastCGI\Requests\PutRequest
    • hollodotme\FastCGI\Requests\PatchRequest
    • hollodotme\FastCGI\Requests\DeleteRequest
  • Response implementation - #2

2.0.1 - 2017-02-23

Fixed

  • Erroneous response returned by Client::sendRequest() and Client::waitForResponse() - #1

Changed

  • Testsuite updated for PHPUnit >= 6

2.0.0 - 2017-01-03

Changed

  • Class constant visibility to private in class Client
  • Class constant visibility to privare in class Encoders\PacketEncoder
  • Class constant visibility to public in class SocketConnections\Defaults
  • Composer requires php >= 7.1

1.0.0 - 2017-01-03

Based on Pierrick Charron's PHP-FastCGI-Client:

Added

  • Socket connection interface ConfiguresSocketConnection
  • Socket connection classes UnixDomainSocket and NetworkSocket
  • Base exception FastCGIClientException
  • Derived exceptions ForbiddenException, ReadFailedException, TimeoutException, WriteFailedException

Changed

  • Constructor of Client now expects a ConfiguresSocketConnection instance
  • Renamed Client->request() to Client->sendRequest()
  • Renamed Client->async_request() to Client->sendAsyncRequest()
  • Renamed Client->wait_for_response() to Client->waitForResponse()

Removed

  • Unused class constants from Client
  • Getters/Setters for connect timeout, read/write timeout, keep alive, socket persistence from Client (now part of the socket connection)
  • Method Client->getValues()
v3.1.1

CHANGELOG

All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning and Keep a CHANGELOG.

3.1.1 - 2020-05-06

Fixed

  • Backwards compatibility break in userland classes extending AbstractRequest due to a final constructor. - #56 See also: #55

3.1.0 - 2020-05-06

Added

  • Interface for request content composers with implementations for URL encoded form-data, multipart form-data and JSON data. This was inspired by - #53
  • Named constructor newWithRequestContent to all request classes in order to simplify the use of the new request content type composers.
  • For more information and examples have a look at the documentation section "Request contents".

Fixed

  • Inspection issues found by PHPStan

Updated

  • Test suites to cover PHP versions from 7.1 to 7.4
  • License dates
  • CI moved to GitHub actions

3.0.1 - 2019-10-24

Added

  • PHP 7.4 CI pipeline and docker-compose environment
  • Explicitly set error_reporting=-1 for CI and tests in order to capture deprecation warnings

Fixed

  • Replace usage of curly brace syntax for accessing string offsets, which is deprecated in PHP 7.4 - #51

3.0.0 - 2019-07-29

Please take notice of the backwards incompatible changes (BC breaks) documented below in the changelog of 3.0.0-alpha & 3.0.0-beta.

Added

  • Reserved private constant for ABORT_REQUEST instruction for future use
  • Socket ID is now represented and generated by a proper type class

Improved

  • Import of root namespace functions
  • Dependency injection for socket implementation

3.0.0-beta - 2019-06-24

Backwards incompatible changes (BC breaks)

  • The socket conection parameter was moved from the Client's constructor to

    • Client#sendRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : ProvidesResponseData and
    • Client#sendAsyncRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : int

    in order to allow sending (equal) requests to different FastCGI servers using the same Client instance. - #45

  • Removed method ProvidesResponseData#getRequestId() : int and Response#getRequestId() : int resepctivly in order to avoid confusion about the semantics of the term "request ID" and misusage by assuming it is a unique ID for each request (which it is not). Also the first constructor parameter of the Response class was removed wiht this change. - #39

  • Renamed all $requestId(s) parameters to $socketId(s) in order to reflect the correct semantics of the ID. - #39

  • Renamed method Client#getRequestIdsHavingResponse() : array<int> to Client#getSocketIdsHavingResponse() : array<int> in order to reflect the correct semantics of the returned array of IDs. - #39

3.0.0-alpha - 2019-04-30

Backwards incompatible changes (BC breaks)

  • Method Response#getHeaders() : array will now return a two-dimensional array with grouped values to support multi-value headers. Previous versions returned a one-dimensional key-value array.

    # Previous versions
    [
      'Status' => 'HTTP/2 200 OK',
      'Set-Cookie' => 'tasty_cookie=strawberry',
    ]
    
    # Since 3.0.0-alpha
    [
      'Status' => [
        'HTTP/2 200 OK',
      ],
      'Set-Cookie' => [
        'yummy_cookie=choco',
        'tasty_cookie=strawberry',
      ],
    ]
    
  • Method Response#getHeader(string $headerKey) : array will now return an array containing all values for the given header key to support multi-value headers. Previous versions returned the last value as a string.

    echo $response->getHeader('Set-Cookie');
    
    # Previous versions
    'tasty_cookie=strawberry'
    
    # Since 3.0.0-alpha
    [
      'yummy_cookie=choco',
      'tasty_cookie=strawberry'
    ]
    
  • Method Response#getRawResponse() : string is no longer available and its usage must be replaced with Response#getOutput(). The method was deprecated since version 2.6.0.

Added

  • Method Response#getHeaderLine(string $headerKey) : string that returns all values, separated by comma, for the given key. - #35
  • Header keys are now case-insensitive in Response#getHeader(string $headerKey) : array and Response#getHeaderLine(string $headerKey) : string. - #35

Removed

  • Method Response#getRawResponse() : string that was deprecated in version 2.6.0 in favour of Response#getOutput() : string. - #36

2.7.2 - 2019-05-31

Improved

  • Handling of stream_select returning false in case of a system call interrupt. - #41

Fixed

  • Remove/close sockets after fetching their responses triggered async requests in order to prevent halt on further request processing, if the number of requests exceeds php-fpm's pm.max_children setting. - #40

2.7.1 - 2019-04-29

Fixed

  • Remove failed sockets from internal collection that errored out during reading of response in order to prevent infinite tries/re-use of those failed connections. - #37

2.7.0 - 2019-04-28

Added

  • Re-using of idle sockets for successive requests - #33

2.6.0 - 2019-04-02

Added

  • Two new methods to Response class - #27

    • Response#getOutput() which is identical to Response#getRawResponse() and will return the complete output from the STDOUT stream of the response.
    • Response#getError() which will return the complete output of the STDERR stream of the response.
  • Second parameter $errorBuffer in tha pass through callback signature - #27

    $callback = function( string $outputBuffer, string $errorBuffer ) {};
    

    This parameter will contain the contents of the STDERR stream packets.

Deprecated

  • Response#getRawResponse() in favour of consistant naming. This method will be removed in v3.0.0 - #27

Removed

  • ProcessManagerException that was introduced in v2.5.0 - #27 Please read this blog post why this (BC breaking) change was necessary and how to handle server-sent errors now.

Fixed

  • bin/fcgiget to accept full URL paths and print STDOUT and STDERR output

Improved

  • Documentation

2.5.0 - 2019-01-29

Added

  • New ProcessManagerException in case the php-fpm responds with packages of type STDERR. This refers mainly to the error Primary script unknown resp. the response File not found..

  • CI builds for PHP 7.3

2.4.3 - 2018-09-17

Fixes

2.4.2 - 2018-01-28

Fixes

  • Missing data in php://input on worker side when client sends content larger than 65535 bytes - #15

2.4.1 - 2017-11-19

Fixes

  • PHP warning when trying to get ready request IDs - #14

Improves

  • Loop performance

2.4.0 - 2017-09-28

Added

  • Ability to add pass through callbacks in order to access output buffer from a long running callee - #11
    See an example in the documentation for further informaiton.

2.3.0 - 2017-06-15

Changed

  • Replaced methods getHost() and getPort() with getSocketAddress() in interface hollodotme\FastCGI\Interfaces\ConfiguresSocketConnection - #9
  • The transport protocol unix:// must be omitted for the first parameter of hollodotme\FastCGI\SocketConnections\UnixDomainSocket
    Only the socket path must be passed. - #9
  • Replaced fsockopen() with stream_socket_client() for connecting to php-fpm. - #9

2.2.0 - 2017-04-15

Added

  • Method addResponseCallbacks(callable ...$callbacks) to all request classes to enable response evaluation delegation - #6
  • Method addFailureCallbacks(callable ...$callbacks) to all request classes to enable exception handling delegation
  • Method readResponse(int $requestId, ?int $timeoutMs = null) : ProvidesResponseData to read and retrieve a single response
  • Method readResponses(?int $imeoutMs = null, int ...$requestIds) : \Generator to read and yield multiple responses
  • Method readReadyResponses(?int $imeoutMs = null) : \Generator to check for ready responses, read and yield them
  • Method waitForResponses(?int $timeout = null) to Client class for waiting for multiple responses and calling the respective response callbacks - #5
  • Method getRequestIdsHavingResponse() : array to enable reactive read of responses as they occur
  • Method hasUnhandledResponses() : bool to check for outstanding responses
  • Method handleResponse(int $requestId, ?int $timeoutMs = null) to fetch a specific response and notify the respective response callback
  • Method handleResponses(?int $timeoutMs = null, int ...$requestIds) to fetch a specific responses and notify the respective response callbacks
  • Method handleReadyResponses(?int $timeoutMs = null) to check for ready responses, fetch them and notify the respective response callbacks

Changed

  • Method waitForResponse(int $requestId, ?int $timeoutMs = null) is not returning a response anymore, but will call the response callback
    Use readResponse(int $requestId, ?int $timeoutMs = null): ProvidesResponseData if you want to get the response directly.

Removed

  • Optional flag to make a connection persistent (is now always disabled in favour of better timeout handling and FPM pool-children-scalability)
  • Optional flag to keep the server-side connection alive (is now always enabled, affects only network sockets)

Improved

  • Code coverage by automated integration tests
  • Timeout handling on multiple requests

2.1.0 - 2017-03-07

Changed

  • Methods sendRequest and sendAsyncRequest expect to get an object of interface hollodotme\FastCGI\Interfaces\ProvidesRequestData - #5
  • Methods sendRequest and waitForResponse now return an object of interface hollodotme\FastCGI\Interfaces\ProvidesResponseData - #2

Added

  • Public class constants for request methods GET, POST, PUT, PATCH and DELETE in hollodotme\FastCGI\Constants\RequestMethod - #5
  • Public class constants for server protocols HTTP/1.0 and HTTP/1.1 in hollodotme\FastCGI\Constants\ServerProtocol - #5
  • Abstract request class for implementing individual request methods, contains all request default values - #5
  • Request implementations: - #5
    • hollodotme\FastCGI\Requests\GetRequest
    • hollodotme\FastCGI\Requests\PostRequest
    • hollodotme\FastCGI\Requests\PutRequest
    • hollodotme\FastCGI\Requests\PatchRequest
    • hollodotme\FastCGI\Requests\DeleteRequest
  • Response implementation - #2

2.0.1 - 2017-02-23

Fixed

  • Erroneous response returned by Client::sendRequest() and Client::waitForResponse() - #1

Changed

  • Testsuite updated for PHPUnit >= 6

2.0.0 - 2017-01-03

Changed

  • Class constant visibility to private in class Client
  • Class constant visibility to privare in class Encoders\PacketEncoder
  • Class constant visibility to public in class SocketConnections\Defaults
  • Composer requires php >= 7.1

1.0.0 - 2017-01-03

Based on Pierrick Charron's PHP-FastCGI-Client:

Added

  • Socket connection interface ConfiguresSocketConnection
  • Socket connection classes UnixDomainSocket and NetworkSocket
  • Base exception FastCGIClientException
  • Derived exceptions ForbiddenException, ReadFailedException, TimeoutException, WriteFailedException

Changed

  • Constructor of Client now expects a ConfiguresSocketConnection instance
  • Renamed Client->request() to Client->sendRequest()
  • Renamed Client->async_request() to Client->sendAsyncRequest()
  • Renamed Client->wait_for_response() to Client->waitForResponse()

Removed

  • Unused class constants from Client
  • Getters/Setters for connect timeout, read/write timeout, keep alive, socket persistence from Client (now part of the socket connection)
  • Method Client->getValues()
v3.1.0

CHANGELOG

All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning and Keep a CHANGELOG.

3.1.0 - 2020-05-06

Added

  • Interface for request content composers with implementations for URL encoded form-data, multipart form-data and JSON data. This was inspired by - [53]
  • Named constructor newWithRequestContent to all request classes in order to simplify the use of the new request content type composers.
  • For more information and examples have a look at the documentation section "Request contents".

Fixed

  • Inspection issues found by PHPStan

Updated

  • Test suites to cover PHP versions from 7.1 to 7.4
  • License dates
  • CI moved to GitHub actions

3.0.1 - 2019-10-24

Added

  • PHP 7.4 CI pipeline and docker-compose environment
  • Explicitly set error_reporting=-1 for CI and tests in order to capture deprecation warnings

Fixed

  • Replace usage of curly brace syntax for accessing string offsets, which is deprecated in PHP 7.4 - #51

3.0.0 - 2019-07-29

Please take notice of the backwards incompatible changes (BC breaks) documented below in the changelog of 3.0.0-alpha & 3.0.0-beta.

Added

  • Reserved private constant for ABORT_REQUEST instruction for future use
  • Socket ID is now represented and generated by a proper type class

Improved

  • Import of root namespace functions
  • Dependency injection for socket implementation

3.0.0-beta - 2019-06-24

Backwards incompatible changes (BC breaks)

  • The socket conection parameter was moved from the Client's constructor to

    • Client#sendRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : ProvidesResponseData and
    • Client#sendAsyncRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : int

    in order to allow sending (equal) requests to different FastCGI servers using the same Client instance. - #45

  • Removed method ProvidesResponseData#getRequestId() : int and Response#getRequestId() : int resepctivly in order to avoid confusion about the semantics of the term "request ID" and misusage by assuming it is a unique ID for each request (which it is not). Also the first constructor parameter of the Response class was removed wiht this change. - #39

  • Renamed all $requestId(s) parameters to $socketId(s) in order to reflect the correct semantics of the ID. - #39

  • Renamed method Client#getRequestIdsHavingResponse() : array<int> to Client#getSocketIdsHavingResponse() : array<int> in order to reflect the correct semantics of the returned array of IDs. - #39

3.0.0-alpha - 2019-04-30

Backwards incompatible changes (BC breaks)

  • Method Response#getHeaders() : array will now return a two-dimensional array with grouped values to support multi-value headers. Previous versions returned a one-dimensional key-value array.

    # Previous versions
    [
      'Status' => 'HTTP/2 200 OK',
      'Set-Cookie' => 'tasty_cookie=strawberry',
    ]
    
    # Since 3.0.0-alpha
    [
      'Status' => [
        'HTTP/2 200 OK',
      ],
      'Set-Cookie' => [
        'yummy_cookie=choco',
        'tasty_cookie=strawberry',
      ],
    ]
    
  • Method Response#getHeader(string $headerKey) : array will now return an array containing all values for the given header key to support multi-value headers. Previous versions returned the last value as a string.

    echo $response->getHeader('Set-Cookie');
    
    # Previous versions
    'tasty_cookie=strawberry'
    
    # Since 3.0.0-alpha
    [
      'yummy_cookie=choco',
      'tasty_cookie=strawberry'
    ]
    
  • Method Response#getRawResponse() : string is no longer available and its usage must be replaced with Response#getOutput(). The method was deprecated since version 2.6.0.

Added

  • Method Response#getHeaderLine(string $headerKey) : string that returns all values, separated by comma, for the given key. - #35
  • Header keys are now case-insensitive in Response#getHeader(string $headerKey) : array and Response#getHeaderLine(string $headerKey) : string. - #35

Removed

  • Method Response#getRawResponse() : string that was deprecated in version 2.6.0 in favour of Response#getOutput() : string. - #36

2.7.2 - 2019-05-31

Improved

  • Handling of stream_select returning false in case of a system call interrupt. - #41

Fixed

  • Remove/close sockets after fetching their responses triggered async requests in order to prevent halt on further request processing, if the number of requests exceeds php-fpm's pm.max_children setting. - #40

2.7.1 - 2019-04-29

Fixed

  • Remove failed sockets from internal collection that errored out during reading of response in order to prevent infinite tries/re-use of those failed connections. - #37

2.7.0 - 2019-04-28

Added

  • Re-using of idle sockets for successive requests - #33

2.6.0 - 2019-04-02

Added

  • Two new methods to Response class - #27

    • Response#getOutput() which is identical to Response#getRawResponse() and will return the complete output from the STDOUT stream of the response.
    • Response#getError() which will return the complete output of the STDERR stream of the response.
  • Second parameter $errorBuffer in tha pass through callback signature - #27

    $callback = function( string $outputBuffer, string $errorBuffer ) {};
    

    This parameter will contain the contents of the STDERR stream packets.

Deprecated

  • Response#getRawResponse() in favour of consistant naming. This method will be removed in v3.0.0 - #27

Removed

  • ProcessManagerException that was introduced in v2.5.0 - #27 Please read this blog post why this (BC breaking) change was necessary and how to handle server-sent errors now.

Fixed

  • bin/fcgiget to accept full URL paths and print STDOUT and STDERR output

Improved

  • Documentation

2.5.0 - 2019-01-29

Added

  • New ProcessManagerException in case the php-fpm responds with packages of type STDERR. This refers mainly to the error Primary script unknown resp. the response File not found..

  • CI builds for PHP 7.3

2.4.3 - 2018-09-17

Fixes

2.4.2 - 2018-01-28

Fixes

  • Missing data in php://input on worker side when client sends content larger than 65535 bytes - #15

2.4.1 - 2017-11-19

Fixes

  • PHP warning when trying to get ready request IDs - #14

Improves

  • Loop performance

2.4.0 - 2017-09-28

Added

  • Ability to add pass through callbacks in order to access output buffer from a long running callee - #11
    See an example in the documentation for further informaiton.

2.3.0 - 2017-06-15

Changed

  • Replaced methods getHost() and getPort() with getSocketAddress() in interface hollodotme\FastCGI\Interfaces\ConfiguresSocketConnection - #9
  • The transport protocol unix:// must be omitted for the first parameter of hollodotme\FastCGI\SocketConnections\UnixDomainSocket
    Only the socket path must be passed. - #9
  • Replaced fsockopen() with stream_socket_client() for connecting to php-fpm. - #9

2.2.0 - 2017-04-15

Added

  • Method addResponseCallbacks(callable ...$callbacks) to all request classes to enable response evaluation delegation - #6
  • Method addFailureCallbacks(callable ...$callbacks) to all request classes to enable exception handling delegation
  • Method readResponse(int $requestId, ?int $timeoutMs = null) : ProvidesResponseData to read and retrieve a single response
  • Method readResponses(?int $imeoutMs = null, int ...$requestIds) : \Generator to read and yield multiple responses
  • Method readReadyResponses(?int $imeoutMs = null) : \Generator to check for ready responses, read and yield them
  • Method waitForResponses(?int $timeout = null) to Client class for waiting for multiple responses and calling the respective response callbacks - #5
  • Method getRequestIdsHavingResponse() : array to enable reactive read of responses as they occur
  • Method hasUnhandledResponses() : bool to check for outstanding responses
  • Method handleResponse(int $requestId, ?int $timeoutMs = null) to fetch a specific response and notify the respective response callback
  • Method handleResponses(?int $timeoutMs = null, int ...$requestIds) to fetch a specific responses and notify the respective response callbacks
  • Method handleReadyResponses(?int $timeoutMs = null) to check for ready responses, fetch them and notify the respective response callbacks

Changed

  • Method waitForResponse(int $requestId, ?int $timeoutMs = null) is not returning a response anymore, but will call the response callback
    Use readResponse(int $requestId, ?int $timeoutMs = null): ProvidesResponseData if you want to get the response directly.

Removed

  • Optional flag to make a connection persistent (is now always disabled in favour of better timeout handling and FPM pool-children-scalability)
  • Optional flag to keep the server-side connection alive (is now always enabled, affects only network sockets)

Improved

  • Code coverage by automated integration tests
  • Timeout handling on multiple requests

2.1.0 - 2017-03-07

Changed

  • Methods sendRequest and sendAsyncRequest expect to get an object of interface hollodotme\FastCGI\Interfaces\ProvidesRequestData - #5
  • Methods sendRequest and waitForResponse now return an object of interface hollodotme\FastCGI\Interfaces\ProvidesResponseData - #2

Added

  • Public class constants for request methods GET, POST, PUT, PATCH and DELETE in hollodotme\FastCGI\Constants\RequestMethod - #5
  • Public class constants for server protocols HTTP/1.0 and HTTP/1.1 in hollodotme\FastCGI\Constants\ServerProtocol - #5
  • Abstract request class for implementing individual request methods, contains all request default values - #5
  • Request implementations: - #5
    • hollodotme\FastCGI\Requests\GetRequest
    • hollodotme\FastCGI\Requests\PostRequest
    • hollodotme\FastCGI\Requests\PutRequest
    • hollodotme\FastCGI\Requests\PatchRequest
    • hollodotme\FastCGI\Requests\DeleteRequest
  • Response implementation - #2

2.0.1 - 2017-02-23

Fixed

  • Erroneous response returned by Client::sendRequest() and Client::waitForResponse() - #1

Changed

  • Testsuite updated for PHPUnit >= 6

2.0.0 - 2017-01-03

Changed

  • Class constant visibility to private in class Client
  • Class constant visibility to privare in class Encoders\PacketEncoder
  • Class constant visibility to public in class SocketConnections\Defaults
  • Composer requires php >= 7.1

1.0.0 - 2017-01-03

Based on Pierrick Charron's PHP-FastCGI-Client:

Added

  • Socket connection interface ConfiguresSocketConnection
  • Socket connection classes UnixDomainSocket and NetworkSocket
  • Base exception FastCGIClientException
  • Derived exceptions ForbiddenException, ReadFailedException, TimeoutException, WriteFailedException

Changed

  • Constructor of Client now expects a ConfiguresSocketConnection instance
  • Renamed Client->request() to Client->sendRequest()
  • Renamed Client->async_request() to Client->sendAsyncRequest()
  • Renamed Client->wait_for_response() to Client->waitForResponse()

Removed

  • Unused class constants from Client
  • Getters/Setters for connect timeout, read/write timeout, keep alive, socket persistence from Client (now part of the socket connection)
  • Method Client->getValues()
v3.0.1
v3.0.0

See CHANGELOG.

v3.0.0-beta

See CHANGELOG

v2.7.2

See CHANGELOG

v3.0.0-alpha

See CHANGELOG and please mind the BC break section

v2.7.1

See CHANGELOG

v2.7.0

See CHANGELOG

v2.6.0

See CHANGELOG

v2.5.0

See CHANGELOG

v2.4.3

See CHANGELOG

v2.4.2

See CHANGELOG.

v2.4.1

See CHANGELOG

v1.4.1

See CHANGELOG

v2.4.0

See CHANGELOG

v1.4.0

See CHANGELOG

v2.3.0

See CHANGELOG

v1.3.0

See CHANGELOG

v2.2.0

See CHANGELOG

v2.1.0

See CHANGELOG.

v2.0.1

See CHANGELOG

v1.0.1

See CHANGELOG.

v2.0.0

See CHANGELOG

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport