Version 3.1.6
CHANGELOG
All notable changes to this project will be documented in this file. This project adheres
to Semantic Versioning and Keep a CHANGELOG.
3.1.6 - 2021-09-23
Added
- PHP 8.1 comaptibility
3.1.5 - 2020-12-10
Fixed
- Transfer of multipart/form-data blocks - #64
- Removes base64 encoding for contents of files to transfer
- Removes
Content-Transfer-Encoding: base64
header from multipart block for files - Improves determination of file's MIME type via
mime_content_type()
, if available - Adds tests for multipart transfer of files with binary content (images)
3.1.4 - 2020-11-23
Added
- PHP 8.1 compatibility
- Makefile to run all tests based on docker-compose config
Fixed
- TypeError on PHP 8 for a resource that is neither
null
nor aresource
- 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
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
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 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
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
withResponse#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
andResponse#getHeaderLine(string $headerKey) : string
. - #35
Removed
- Method
Response#getRawResponse() : string
that was deprecated in version 2.6.0 in favour
ofResponse#getOutput() : string
. - #36
2.7.2 - 2019-05-31
Improved
- Handling of
stream_select
returningfalse
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'spm.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 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.
Deprecated
Response#getRawResponse()
in favour of consistant naming. This method will be removed inv3.0.0
- #27
Removed
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.
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 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
Fixes
- 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
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()
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
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)
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
Changed
- 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.
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
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
Added
- 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
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
andNetworkSocket
- Base exception
FastCGIClientException
- Derived exceptions
ForbiddenException
,ReadFailedException
,TimeoutException
,WriteFailedException
Changed
- 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()
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()