Fast Cgi Client Versions Save

A PHP fast CGI client for sending requests (a)synchronously to PHP-FPM

v3.1.7

2 years ago

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

2 years ago

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

3 years ago

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

3 years ago

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

3 years ago

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

3 years ago

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

4 years ago

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

4 years ago

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

4 years ago

v3.0.0

4 years ago

See CHANGELOG.