Build fast, concurrent applications with PHP
Benefit from concurrency by replacing your blocking I/O with non-blocking I/O,
or designing your system with non-blocking I/O from the ground up.
We shipped fibers in PHP 8.1 to extend its capabilities for concurrent applications.
The PHP standard library has already provided everything else we needed for years now, but it only ships the low-level building blocks. AMPHP provides higher-level libraries using non-blocking I/O under the hood. Fibers allow these libraries to just work, no matter whether they're used in concurrent or traditional contexts.
Latest Releases
-
amphp/sql-common 2.0.1
What’s Changed
- Changed syntax in
SqlCommonConnectionPool
when awaiting aFuture
to attempt to address a crash possibly caused by PHP opcache.
Full Changelog: https://github.com/amphp/sql-common/compare/v2.0.0…v2.0.1
- Changed syntax in
-
amphp/http-client-guzzle-adapter 1.1.1
What’s Changed
- Updated requirements to allow guzzlehttp/psr7@^1
Full Changelog: https://github.com/amphp/http-client-guzzle-adapter/compare/v1.1.0…v1.1.1
-
amphp/http-client-psr7 1.1.0
What’s Changed
- Updated requirements to allow
psr/http-message@^2
- Replaced development dependency on
laminas/laminas-diactoros
withguzzlehttp/psr7
Full Changelog: https://github.com/amphp/http-client-psr7/compare/v1.0.0…v1.1.0
- Updated requirements to allow
-
amphp/file 3.1.1
What’s Changed
- Dropped support for ext-uv < 0.3.0.
- Changed the version check for ext-uv to avoid an ext-opcache bug (see https://github.com/amphp/http-client/issues/365).
Full Changelog: https://github.com/amphp/file/compare/v3.1.0…v3.1.1
-
amphp/sync 2.3.0
What’s Changed
- Fixed posix semaphore blocking thread when there is no space left on device by @azjezz in https://github.com/amphp/sync/pull/29
- Added a buffer size parameter to
createChannelPair()
to specify a number of items which may be buffered in memory before back pressure is applied.
New Contributors
- @azjezz made their first contribution in https://github.com/amphp/sync/pull/29
Full Changelog: https://github.com/amphp/sync/compare/v2.2.0…v2.3.0
-
amphp/redis 2.0.1
What’s Changed
- Fixed return type for
RedistList::get()
by @Bilge in https://github.com/amphp/redis/pull/96
Full Changelog: https://github.com/amphp/redis/compare/v2.0.0…v2.0.1
- Fixed return type for
-
amphp/pipeline 1.2.1
What’s Changed
- Fix a potential race condition when using a
Queue
to create aConcurrentIterator
. AnError
with message “Must call suspend() before calling throw()” was thrown when aCancellation
provided toConcurrentIterator::continue()
was cancelled and the underlyingQueue
instance was simultaneously completed. See #22.
Full Changelog: https://github.com/amphp/pipeline/compare/v1.2.0…v1.2.1
- Fix a potential race condition when using a
-
amphp/dns 2.2.0
What’s Changed
- Added
StaticDnsConfigLoader
- Fixed support for docker 26+ by @xtrime-ru in https://github.com/amphp/dns/pull/118
New Contributors
- @xtrime-ru made their first contribution in https://github.com/amphp/dns/pull/118
Full Changelog: https://github.com/amphp/dns/compare/v2.1.2…v2.2.0
- Added
-
amphp/amp 3.0.2
What’s Changed
- Changed
Closure(mixed...)
annotation toClosure(...)
to support PHPStan.
Full Changelog: https://github.com/amphp/amp/compare/v3.0.1…v3.0.2
- Changed
-
amphp/http-client 5.1.0
What’s Changed
- Add
BufferedContent::fromJson()
by @trowski in https://github.com/amphp/http-client/pull/355 - Add
Form::addNestedFields()
by @trowski in https://github.com/amphp/http-client/pull/356 - Make implicit nullable types explicit to avoid deprecation notice in PHP 8.4
RequestBody
->HttpContent
by @ShiSHcat in https://github.com/amphp/http-client/pull/358
New Contributors
- @ShiSHcat made their first contribution in https://github.com/amphp/http-client/pull/358
Full Changelog: https://github.com/amphp/http-client/compare/v5.0.1…v5.1.0
- Add
-
amphp/http-server 3.3.1
What’s Changed
- Made implicit nullable types explicit to avoid deprecation notice in PHP 8.4
- Typo in README.md by @tncrazvan in https://github.com/amphp/http-server/pull/361
New Contributors
- @tncrazvan made their first contribution in https://github.com/amphp/http-server/pull/361
Full Changelog: https://github.com/amphp/http-server/compare/v3.3.0…v3.3.1
-
amphp/socket 2.3.1
What’s Changed
- Make implicit nullable types explicit to avoid deprecation notice in PHP 8.4.
Full Changelog: https://github.com/amphp/socket/compare/v2.3.0…v2.3.1
-
amphp/cache 2.0.1
What’s Changed
- Make implicit nullable types explicit to avoid deprecation notice in PHP 8.4.
Full Changelog: https://github.com/amphp/cache/compare/v2.0.0…v2.0.1
-
amphp/process 2.0.3
What’s Changed
- Make implicit nullable types explicit to avoid deprecation notice in PHP 8.4.
Full Changelog: https://github.com/amphp/process/compare/v2.0.2…v2.0.3
-
amphp/php-cs-fixer-config 2.1.0
What’s Changed
- Add
nullable_type_declaration_for_default_null_value
to the default rules by @alexandre-daubois in https://github.com/amphp/php-cs-fixer-config/pull/8
New Contributors
- @alexandre-daubois made their first contribution in https://github.com/amphp/php-cs-fixer-config/pull/8
Full Changelog: https://github.com/amphp/php-cs-fixer-config/compare/v2.0.1…v2.1.0
- Add
-
amphp/http 2.1.1
What’s Changed
- Security: Fix Denial of Service via HTTP/2 CONTINUATION Frames by @kelunik
References
- https://github.com/amphp/http/security/advisories/GHSA-qjfw-cvjf-f4fm
- https://kb.cert.org/vuls/id/421644
Full Changelog: https://github.com/amphp/http/compare/v2.1.0…2.1.1
-
amphp/parallel 2.2.9
What’s Changed
- Fixed a race condition if outstanding accept calls were pending when closing
SocketIpcHub
. - Removed use of error-suppression operator to avoid warnings from mis-configured error handlers (#200).
Full Changelog: https://github.com/amphp/parallel/compare/v2.2.8…v2.2.9
- Fixed a race condition if outstanding accept calls were pending when closing
-
amphp/parser 1.1.1
What’s Changed
- Make implicit nullable types explicit by @nicolas-grekas in https://github.com/amphp/parser/pull/6
New Contributors
- @nicolas-grekas made their first contribution in https://github.com/amphp/parser/pull/6
Full Changelog: https://github.com/amphp/parser/compare/v1.1.0…v1.1.1
-
amphp/hpack 3.2.1
What’s Changed
- Make implicit nullable types explicit by @nicolas-grekas in https://github.com/amphp/hpack/pull/16
Full Changelog: https://github.com/amphp/hpack/compare/v3.2.0…v3.2.1
-
amphp/rpc 2.0.0
Stable release compatible with AMPHP v3 and fibers! 🎉
As with other libraries compatible with AMPHP v3, most cases of parameters or returns of
Promise<ResolutionType>
have been replaced withResolutionType
. -
amphp/mysql 3.0.0
Stable release compatible with AMPHP v3 and fibers! 🎉
As with other libraries compatible with AMPHP v3, most cases of parameters or returns of
Promise<ResolutionType>
have been replaced withResolutionType
.- Classes and interfaces now are prefixed with
Mysql
to avoid collisions with similar names from other libraries. - Marked most classes as internal, leaving only interfaces and concrete implementations required to use the API or create a custom connector.
MysqlTransaction
now extendsMysqlLink
instead ofMysqlExecutor
to support nested transactions.MysqlDataType
is now an enum of MySQL data type codes and methods to decode data based on type.- Result set field data is now available from
MysqlResult::getColumnDefinitions()
which returns an array ofMysqlColumnDefinition
objects corresponding to the result set rows. - The second param of
MysqlStatement::bind()
now requires a string. Binding only makes sense with long strings anyway. MysqlConnection
is now an interface extendingSqlConnection
, withSocketMysqlConnection
being the implementation.- Removed
MysqlConnector
since the interface was replaced by template types onSqlConnector
, i.e.SqlConnector<MysqlConfig, MysqlConnection>
- Classes and interfaces now are prefixed with
-
amphp/postgres 2.0.0
Stable release compatible with AMPHP v3 and fibers! 🎉
As with other libraries compatible with AMPHP v3, most cases of parameters or returns of
Promise<ResolutionType>
have been replaced withResolutionType
.- Non-extension-specific classes and interfaces now are prefixed with
Postgres
to avoid collisions with similar names from other libraries. - Result sets now implement
Traversable
, allowing them to be used withforeach
to iterate over result rows. - Marked most classes as internal, leaving only interfaces and concrete implementations required to use the API or create a custom connector.
PostgresTransaction
now extendsPostgresLink
instead ofPostgresExecutor
to support nested transactions.- Removed
TimeoutConnector
in favor ofDefaultPostgresConnector
which has aCancellation
parameter onconnect()
which may be used with anAmp\TimeoutCancellation
. - Removed
PostgresConnector
since the interface was replaced by template types onSqlConnector
, i.e.SqlConnector<PostgresConfig, PostgresConnection>
- Added support for
BYTEA
fields. (#57) - Added the
PostgresConnection
interface extendingPostgresLink
. - Removed the
Receiver
interface. These methods are now a part ofPostgresConnection
. - Removed the
Quoter
Interface. These methods are now a part ofPostgresExecutor
.
- Non-extension-specific classes and interfaces now are prefixed with
-
amphp/sql 2.0.0
Stable release compatible with AMPHP v3 and fibers! 🎉
As with other libraries compatible with AMPHP v3, most cases of parameters or returns of
Promise<ResolutionType>
have been replaced withResolutionType
.- Added template types to interfaces for better type expression on implementations and extensions.
- All classes now start with
Sql
as a prefix to avoid name collisions with other libraries. - Combined
ResultSet
andCommandResult
into a single interface,SqlResult
. SqlTransaction
now extendsSqlLink
instead ofSqlExecutor
to support nested transactions.- Added
onCommit()
andonRollback()
methods toSqlTransaction
. These methods attach callbacks after the transaction is either committed or rolled back, respectively. - Removed the methods
createSavepoint()
,rollbackTo()
, andreleaseSavepont()
fromSqlTransaction
. Use nested transactions throughSqlTransaction::beginTransaction()
instead. SqlPool
now extendsSqlConnection
instead ofSqlLink
.SqlPool::extractConnection()
returns an instance ofSqlConnection
instead ofSqlLink
.- Added
SqlResult::fetchRow()
, which will return a single row (associative array) from the result set on each call until no further rows remain in the result. SqlTransientResource
and now extendsAmp\Closable
.- Added
SqlTransactionIsolation
and an enum-based implementation,SqlTransactionIsolationLevel
. - Renamed
ConnectionConfig
toSqlConfig
. - Renamed
FailureException
toSqlException
.
-
amphp/byte-stream 2.1.1
What’s Changed
- Fixed cancellation not being forwarded to
split()
insplitLines()
.
Full Changelog: https://github.com/amphp/byte-stream/compare/v2.1.0…v2.1.1
- Fixed cancellation not being forwarded to
-
amphp/windows-registry 1.0.1
What’s Changed
- Removed nullability from return type of
WindowsRegistry::read()
, the method throws if the key is not found.
Full Changelog: https://github.com/amphp/windows-registry/compare/v1.0.0…v1.0.1
- Removed nullability from return type of
-
amphp/websocket-server 4.0.0
The
4.0.0
release fixes compression support with a couple small compatibility breaks from3.x
.Users of
2.x
should upgrade directly to4.0.0
.Users of
3.x
can upgrade directly to4.0.0
if compression is not being used. If a customWebsocketAcceptor
was created to support compression, this custom implementation may be dropped, instead passing an instance ofWebsocketCompressionContextFactory
to eachWebsocket
request handler.Backward Compatibility Breaks
- The
WebsocketCompressionContextFactory
constructor parameter ofRfc6455ClientFactory
has been removed and is instead a constructor parameter of theWebsocket
class. - A nullable
WebsocketCompressionContext
parameter was added toWebsocketClientFactory::createClient()
.
- The
-
amphp/websocket 2.0.3
What’s Changed
WebsocketException
now extendsAmp\ByteStream\StreamException
to avoid violating theReadableStream
interface by throwing a non-StreamException
from a stream method.
Full Changelog: https://github.com/amphp/websocket/compare/v2.0.2…v2.0.3
-
amphp/websocket-client 2.0.0
Stable release compatible with AMPHP v3 and fibers! 🎉
As with other libraries compatible with AMPHP v3, most cases of parameters or returns of
Promise<ResolutionType>
have been replaced withResolutionType
.This release is compatible with
amphp/http-client@^5
andamphp/websocket@^2
. See the release notes of these libraries for further change notes.Similar to
v1
, a Websocket connection is created usingAmp\Websocket\Client\connect()
or using an instance ofWebsocketConnector
, callingWebsocketConnector::connect()
. The returnedWebsocketConnection
then is used to send and receive WebSocket messages.- Renamed most classes and interfaces to add
Websocket
as a prefix to avoid name collisions with similarly named classes in other packages which are frequently used together. For example,Connection
is nowWebsocketConnection
. - Advanced handshake and connection parameters may be specified using a
Rfc6455ConnectionFactory
instance provided when constructing aRfc6455Connector
. - A global
WebsocketConnector
instance may be accessed and set viaAmp\Websocket\Client\websocketConnector()
.
- Renamed most classes and interfaces to add
-
amphp/parallel-functions 2.0.0
Stable release compatible with AMPHP v3 and fibers! 🎉
As with other libraries compatible with AMPHP v3, most cases of parameters or returns of
Promise<ResolutionType>
have been replaced withResolutionType
. -
amphp/http-client-cookies 2.0.0
Stable release compatible with AMPHP v3 and fibers! 🎉
As with other libraries compatible with AMPHP v3, most cases of parameters or returns of
Promise<ResolutionType>
have been replaced withResolutionType
.- Renamed
InMemoryCookieJar
toLocalCookieJar
- Renamed
-
amphp/http-server-form-parser 2.0.0
This release is compatible with
amphp/http-server@^3
.- Renamed
BufferingParser
andStreamingParser
toFormParser
andStreamingFormParser
, respectively. - Removed the
parseForm
function in favor of theForm::fromRequest()
static method. - Removed
ParsingMiddleware
. UseForm::fromRequest()
instead. - Removed
ParseException
. Form parsing errors will throw anHttpErrorException
fromamphp/http-server
instead, which do not need to be caught (the server will automatically return an error response).
- Renamed
-
amphp/http-server-session 3.0.0
This release is compatible with
amphp/http-server@^3
.- Renamed
Storage
,InMemoryStorage
,RedisStorage
,DefaultIdGenerator
, andDriver
toSessionStorage
,LocalSessionStorage
,RedisSessionStorage
,Base64UrlSessionIdGenerator
, andSessionFactory
, respectively - Renamed methods on
Session
:open()
tolock()
,save()
tocommit()
- Added
Session::rollback()
to undo local changes and re-read the session data from storage - Added
SessionTrainer
for examining session changes unit testing
- Renamed
-
amphp/http-server-static-content 2.0.0
This release is compatible with
amphp/http-server@^3
.DocumentRoot
now requires an instance ofHttpServer
andErrorHandler
to construct- Removed
DocumentRoot::onStart()
andDocumentRoot::onStop()
, as it’s now internally registered - Removed support for
ServerObserver
, as it’s been removed fromamphp/http-server
- Added
StaticResource
to serve a single static file
-
amphp/http-server-router 2.0.0
This release is compatible with
amphp/http-server@^3
.- A PSR-3 logger is now required in the
Router
constructor - Starting the server with an empty
Router
is now allowed and only logs a notice instead of throwing an exception - Middleware can be added via
addMiddleware()
instead ofstack()
- Removed support for adding middleware directly via
addRoute()
, usestackMiddleware()
instead if you need this - Removed
Router::onStart()
, as it’s now internally registered - Removed support for
ServerObserver
, as it’s been removed fromamphp/http-server
- A PSR-3 logger is now required in the
-
amphp/log 2.0.0
- Increased minimum PHP version to 8.1
- Make use of fibers with Amp v3 and Revolt
- Added support for Monolog v3.x
This release does not contain any changes in comparison to
v2.0.0-beta.2
. -
amphp/phpunit-util 3.0.0
This package has been redesigned for compatibility with AMPHP v3 and fibers.
AsyncTestCase
serves a similar purpose as before, providing helper methods for unit testing within an async context. Each test case is run within a unique fiber to allow suspending during the test run.AsyncTestCase::setUpAsync()
andtearDownAsync()
have been removed. UseAsyncTestCase::setUp()
andtearDown()
instead, as both of these methods are now able to execute async using fibers.AsyncTestCase::createCallback()
now returns aClosure
. Additionally, an optional parameter for expected arguments upon invocation have been added (usesInvocationMocker::with(...)
to set expected arguments).
-
amphp/cluster 1.0.1
Update to use
amphp/file
v2.x
. -
amphp/beanstalk 0.3.2
- Added support for Symfony YAML library v4 and v5. (#34)
-
amphp/serialization 1.0.0
Initial release.
-
amphp/http-tunnel 1.0.0
Initial release.
-
amphp/http-client-cache 1.0.0
Initial release.
-
amphp/react-adapter 2.1.0
React\EventLoop\Factory
is now automatically replaced with another implementation that throws on each usage to prevent two loops existing concurrently by accident. SetAMP_REACT_ADAPTER_DISABLE_FACTORY_OVERRIDE=1
as environment variable or constant to disable this protection.
-
amphp/react-stream-adapter 0.1.0
Initial release.