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
- PHP 8.1 comaptibility
3.1.5 - 2020-12-10
- 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
- PHP 8.1 compatibility
- Makefile to run all tests based on docker-compose config
- TypeError on PHP 8 for a resource that is neither
null
nor aresource
- Added ext-xdebug as dev-requirement in composer.json
- Xdebug 3 coverage filter constant name for PHP 8
- Local shell script to run tests with Makefile
- CI Builds on Circle-CI
3.1.3 - 2020-08-13
- 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
.gitattributes
file to exclude non-relevant files/directories from archives/releases installed by composer - #58
- Remove link to
bin/fcgiget
incomposer.json
as it is a potential security issue (becausebin/fcgiget
accepts any accessible fastCGI endpoint and may be exposed in some setups)
3.1.1 - 2020-05-06
- Backwards compatibility break in userland classes extending
AbstractRequest
due to a final constructor. - #56 See also: #55
3.1.0 - 2020-05-06
- 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".
- Inspection issues found by PHPStan
- 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
- PHP 7.4 CI pipeline and docker-compose environment
- Explicitly set
error_reporting=-1
for CI and tests in order to capture deprecation warnings
- 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.
- Reserved private constant for ABORT_REQUEST instruction for future use
- Socket ID is now represented and generated by a proper type class
- Import of root namespace functions
- Dependency injection for socket implementation
3.0.0-beta - 2019-06-24
-
The socket conection parameter was moved from the
Client
's constructor toClient#sendRequest(ConfiguresSocketConnection $connection, ProvidesRequestData $request) : ProvidesResponseData
andClient#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
andResponse#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 theResponse
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>
toClient#getSocketIdsHavingResponse() : array<int>
in order to reflect the correct semantics of the returned array of IDs. - #39
3.0.0-alpha - 2019-04-30
-
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 withResponse#getOutput()
. The method was deprecated since version 2.6.0.
- 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
andResponse#getHeaderLine(string $headerKey) : string
. - #35
- Method
Response#getRawResponse() : string
that was deprecated in version 2.6.0 in favour ofResponse#getOutput() : string
. - #36
2.7.2 - 2019-05-31
- Handling of
stream_select
returningfalse
in case of a system call interrupt. - #41
- 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
- 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
- Re-using of idle sockets for successive requests - #33
2.6.0 - 2019-04-02
-
Two new methods to Response class - #27
Response#getOutput()
which is identical toResponse#getRawResponse()
and will return the complete output from theSTDOUT
stream of the response.Response#getError()
which will return the complete output of theSTDERR
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.
Response#getRawResponse()
in favour of consistant naming. This method will be removed inv3.0.0
- #27
ProcessManagerException
that was introduced inv2.5.0
- #27 Please read this blog post why this (BC breaking) change was necessary and how to handle server-sent errors now.
bin/fcgiget
to accept full URL paths and print STDOUT and STDERR output
- Documentation
2.5.0 - 2019-01-29
-
New
ProcessManagerException
in case the php-fpm responds with packages of typeSTDERR
. This refers mainly to the errorPrimary script unknown
resp. the responseFile not found.
. -
CI builds for PHP 7.3
2.4.3 - 2018-09-17
- Value of Client::STREAM_SELECT_USEC was to low with
20000
and was updated to200000
as recommended in the official PHP documentation. - #20
2.4.2 - 2018-01-28
- Missing data in
php://input
on worker side when client sends content larger than 65535 bytes - #15
2.4.1 - 2017-11-19
- PHP warning when trying to get ready request IDs - #14
- Loop performance
2.4.0 - 2017-09-28
- 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
- Replaced methods
getHost()
andgetPort()
withgetSocketAddress()
in interfacehollodotme\FastCGI\Interfaces\ConfiguresSocketConnection
- #9 - The transport protocol
unix://
must be omitted for the first parameter ofhollodotme\FastCGI\SocketConnections\UnixDomainSocket
Only the socket path must be passed. - #9 - Replaced
fsockopen()
withstream_socket_client()
for connecting to php-fpm. - #9
2.2.0 - 2017-04-15
- 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)
toClient
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
- Method
waitForResponse(int $requestId, ?int $timeoutMs = null)
is not returning a response anymore, but will call the response callback
UsereadResponse(int $requestId, ?int $timeoutMs = null): ProvidesResponseData
if you want to get the response directly.
- 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)
- Code coverage by automated integration tests
- Timeout handling on multiple requests
2.1.0 - 2017-03-07
- Methods
sendRequest
andsendAsyncRequest
expect to get an object of interfacehollodotme\FastCGI\Interfaces\ProvidesRequestData
- #5 - Methods
sendRequest
andwaitForResponse
now return an object of interfacehollodotme\FastCGI\Interfaces\ProvidesResponseData
- #2
- Public class constants for request methods
GET
,POST
,PUT
,PATCH
andDELETE
inhollodotme\FastCGI\Constants\RequestMethod
- #5 - Public class constants for server protocols
HTTP/1.0
andHTTP/1.1
inhollodotme\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
- Erroneous response returned by Client::sendRequest() and Client::waitForResponse() - #1
- Testsuite updated for PHPUnit >= 6
2.0.0 - 2017-01-03
- 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:
- Socket connection interface
ConfiguresSocketConnection
- Socket connection classes
UnixDomainSocket
andNetworkSocket
- Base exception
FastCGIClientException
- Derived exceptions
ForbiddenException
,ReadFailedException
,TimeoutException
,WriteFailedException
- Constructor of
Client
now expects aConfiguresSocketConnection
instance - Renamed
Client->request()
toClient->sendRequest()
- Renamed
Client->async_request()
toClient->sendAsyncRequest()
- Renamed
Client->wait_for_response()
toClient->waitForResponse()
- 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()