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/websocket 2.0.1
- Fixed invoking the onClose handler attached to a client when the client socket is closed abruptly (that is, without sending a close frame).
-
amphp/websocket-server 3.0.0
Stable release compatible with AMPHP v3 and fibers! 🎉
This release is compatible with
amphp/http-server@^3
andamphp/websocket@^2
.As with other libraries compatible with AMPHP v3, most cases of parameters or returns of
Promise<ResolutionType>
have been replaced withResolutionType
.Similar to
v2
, a Websocket is created by creating an instance ofWebsocket
and using it as a request handler on an HTTP server. However, the constructor arguments have changed to reflect the changes below and the removal of theOptions
object fromamphp/websocket
.A gateway object is no longer provided automatically to a client handler. A client handler may create one or more
WebsocketClientGateway
objects to hold a collection of clients and asynchronously broadcast messages to all (or only some) clients within a gateway.- 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,ClientHandler
is nowWebsocketClientHandler
,ClientFactory
is nowWebsocketClientFactory
. - The handshake accepting functionality of
ClientHandler
has been split into a separate interface,WebsocketAcceptor
. In general, most applications will want to useAllowOriginAcceptor
. For more flexibility, create your own implementation by delegating toRfc6455Acceptor
and adding your own logic inhandleHandshake()
. WebsocketServerObserver
has been removed. Use theonStart()
andonStop()
methods ofHttpServer
if an action is needed when starting or stopping the HTTP server.
- Renamed most classes and interfaces to add
-
amphp/hpack 3.2.0
- Improved detection of
libnghttp2
, i.e.libnghttp2.so.14
and looking in the Homebrew path
Full Changelog: https://github.com/amphp/hpack/compare/v3.1.7…v3.2.0
- Improved detection of
-
amphp/byte-stream 2.0.2
- Fixed throwing an
Error
when invokinggetStdin()
,getStdout()
, andgetStderr()
if the corresponding STDIO stream had been previously closed. Instead, an already closed stream instance is returned.
- Fixed throwing an
-
amphp/parallel 2.2.2
- Fixed potential hang of a
ProcessContext
created byDefaultContextFactory
if output buffers fill by piping STDOUT and STDERR to the same pipes on the parent process. This also provides parity with the default behavior ofThreadContext
.
- Fixed potential hang of a
-
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 3.2.0
- Allowed
league/[email protected]
andpsr/message@v2
- Added previous param to
HttpErrorException
constructor
Full Changelog: https://github.com/amphp/http-server/compare/v3.1.0…v3.2.0
- Allowed
-
amphp/http 2.1.0
- Updated
league/uri-components
requirements to^2.4.2 | ^7.1
as part of fixing #24 and allowpsr/message@v2
- Changed request query string encoding to use RFC3986 rules to as part of fixing #24
Full Changelog: https://github.com/amphp/http/compare/v2.0.0…v2.1.0
- Updated
-
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/redis 2.0.0
Initial release compatible with AMPHP v3. As with other libraries compatible with AMPHP v3, most cases of parameters or returns of
Promise<ResolutionType>
have been replaced withResolutionType
.- Added
RedisParcel
in theSync
sub-namespace implementing theParcel
interface fromamphp/sync
- Added
RedisConnector
interface to decouple connecting and init commands such asAUTH
andSELECT
- Reorganized class names / namespaces for better overview
Redis
moved toRedisClient
Subscriber
/Subscription
moved toRedisSubscriber
/RedisSubscription
Cache
moved toRedisCache
Mutex
sub-namespace has been changed toSync
. All classes within now have a prefix of Redis, e.g.,Mutex
→RedisMutex
,MutexOptions
→RedisMutexOptions
Config
moved toRedisConfig
RespSocket
moved toAmp\Redis\Connection\RedisConnection
and is an interface nowRespParser
moved toAmp\Redis\Protocol\RespParser
QueryExecutor
moved toAmp\Redis\Connection\RedisLink
RemoteExecutor
moved toAmp\Redis\Connection\ReconnectingRedisLink
RedisHyperLogLog
moved toAmp\Redis\Command\RedisHyperLogLog
RedisList
moved toAmp\Redis\Command\RedisList
RedisMap
moved toAmp\Redis\Command\RedisMap
RedisSet
moved toAmp\Redis\Command\RedisSet
RedisSortedSet
moved toAmp\Redis\Command\RedisSortedSet
SortOptions
moved toAmp\Redis\Command\Option\SortOptions
SetOptions
moved toAmp\Redis\Command\Option\SetOptions
SocketException
moved toAmp\Redis\Connection/RedisConnectionException
ParserException
moved toAmp\Redis\Protocol\ProtocolException
QueryException
moved toAmp\Redis\Protocol\QueryException
RedisSubscription
is now a simple PHP iterator now thatAmp\Iterator
is no longer necessary with fibers.
- Added
-
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/socket 2.2.0
What’s Changed
- Add support for
league/uri
7.x - Undefined variable
$socket
in example by @61-6c-69 in https://github.com/amphp/socket/pull/106
New Contributors
- @61-6c-69 made their first contribution in https://github.com/amphp/socket/pull/106
Full Changelog: https://github.com/amphp/socket/compare/v2.1.0…v2.2.0
- Add support for
-
amphp/sync 2.1.0
What’s Changed
- Added re-entry support to
synchronized()
by @kelunik in https://github.com/amphp/sync/pull/26 - Fixed error handling in
SharedMemoryParcel
- Fixed a typo by @thgs in https://github.com/amphp/sync/pull/25
New Contributors
- @thgs made their first contribution in https://github.com/amphp/sync/pull/25
Full Changelog: https://github.com/amphp/sync/compare/v2.0.0…v2.1.0
- Added re-entry support to
-
amphp/http-client 4.6.3
What’s Changed
- Allow
psr/http-message
^2 by @drealecs in https://github.com/amphp/http-client/pull/328 - Allow
league/uri
^7 by @nicolas-grekas in https://github.com/amphp/http-client/pull/335 - Fix HTTP/2 cancellation while receiving the response
New Contributors
- @drealecs made their first contribution in https://github.com/amphp/http-client/pull/328
Full Changelog: https://github.com/amphp/http-client/compare/v4.6.2…v4.6.3
- Allow
-
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/process 2.0.1
- Fixed error handling if the started process fails immediately.
Full Changelog: https://github.com/amphp/process/compare/v2.0.0…v2.0.1
-
amphp/file 3.0.1
What’s Changed
- Fix
touch()
on non-existent files in ext-uv and ext-eio by @kelunik (#73) - Fix
write()
truncation with ext-uv and ext-eio by @danog in (#76)
Full Changelog: https://github.com/amphp/file/compare/v3.0.0…v3.0.1
- Fix
-
amphp/dns 2.0.1
What’s Changed
- Fix fallback to blocking resolver by @danog and @kelunik in https://github.com/amphp/dns/pull/108 and https://github.com/amphp/dns/pull/109
- Try entire search list when resolve type is restricted by @trowski:
9d988e31
- Improve static analysis with more specific DnsResolver return types by @trowski:
7344cceb
Full Changelog: https://github.com/amphp/dns/compare/v2.0.0…v2.0.1
-
amphp/windows-registry 1.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
.WindowsRegistry
offers the methods as static methods now instead of instance methods.
-
amphp/cache 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
ArrayCache
toLocalCache
, swapping the constructor argument order - Modified
LocalCache
to implementIteratorAggregate
andCountable
, acting as an LRU cache now (#20) - Support arbitrary values in
LocalCache
,NullCache
, andPrefixCache
- Changed
Cache
to support arbitrary values - Introduced separate
StringCache
interface for caching only strings - Added
StringCacheAdapter
to use anyCache
in place of aStringCache
- Removed
FileCache
(will be available inamphp/file
instead)
- Renamed
-
amphp/postgres 1.4.5
- Fixed cancelling an active query if a connection is closed when using
ext-pgsql
(#54)
- Fixed cancelling an active query if a connection is closed when using
-
amphp/sql-common 1.1.4
- Fixed potential double deferred resolve when a connection pool is full.
-
amphp/parser 1.1.0
- PHP 7.4 now required
- Improved performance of the parser when requesting small chunks of data and when yielding an integer length delimiter
-
amphp/pipeline 1.0.0
Initial stable release 🎉
Changes from 1.0.0 Beta 7
- Marked
ConcurrentArrayIterator
,ConcurrentChainedIterator
, andConcurrentIterableIterator
as@internal
. Instead of these classes, usePipeline::fromIterable()
orPipeline::concat()
Pipeline::concat()
now accepts an array of anyiterable
, not only otherPipeline
objects
- Marked
-
amphp/sql 1.0.2
- Fix a deprecation notice on PHP 8.1 if a configuration key does not have a value.
-
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/amp 3.0.0
Event Loop
Amp no longer ships its own event loop. It’s now based on Revolt.
Revolt\EventLoop
is quite similar to Amp’s previousAmp\Loop
. A very important difference is usingfloat $seconds
instead ofint $milliseconds
for timers though!Promises
Future
is a replacement for the previousPromise
. There’s no need for callbacks oryield
anymore! Itsawait()
method is based on fibers and replaces generator based coroutines /Amp\Promise\wait()
.- Renamed
Amp\Deferred
toAmp\DeferredFuture
. - Removed
Amp\Promise\wait()
: UseAmp\Future::await()
instead, which can be called in any (nested) context unlike before. - Removed
Amp\call()
: Remove the passed closure boilerplate and allyield
keywords, interruption is handled via fibers now instead of generator coroutines. - Removed
Amp\asyncCall()
: Replace invocations withAmp\async()
, which starts a new fiber instead of using generators. - Removed
Amp\coroutine()
: There’s no direct replacement. - Removed
Amp\asyncCoroutine()
: There’s no direct replacement. - Removed
Amp\Promise\timeout()
:Future::await()
accepts an optionalCancellation
, which can be used as a replacement. - Removed
Amp\Promise\rethrow()
: Unhandled errors are now automatically thrown into the event loop, so there’s no need for that function anymore. - Unhandled errors can be ignored using
Future::ignore()
if needed, but should usually be handled in some way. - Removed
Amp\Promise\wrap()
: UseFuture::finally()
instead. - Renamed
Amp\getCurrentTime()
toAmp\now()
returning the time in seconds instead of milliseconds. - Changed
Amp\delay()
to accept the delay in seconds now instead of milliseconds. - Added
Amp\weakClosure()
to allow a class to hold a self-referencing Closure without creating a circular reference that prevents automatic garbage collection. - Added
Amp\trapSignal()
to await one or multiple signals.
Promise Combinators
Promise combinators have been renamed:
Amp\Promise\race()
has been renamed toAmp\Future\awaitFirst()
Amp\Promise\first()
has been renamed toAmp\Future\awaitAny()
Amp\Promise\some()
has been renamed toAmp\Future\awaitAnyN()
Amp\Promise\any()
has been renamed toAmp\Future\awaitAll()
Amp\Promise\all()
has been renamed toAmp\Future\await()
CancellationToken
CancellationToken
has been renamed toCancellation
.CancellationTokenSource
has been renamed toDeferredCancellation
.NullCancellationToken
has been renamed toNullCancellation
.TimeoutCancellationToken
has been renamed toTimeoutCancellation
.CombinedCancellationToken
has been renamed toCompositeCancellation
.SignalCancellation
has been added.
Iterators
Iterators have been removed from
amphp/amp
as normal PHP iterators can be used with fibers now and there’s no need for a separate API. However, there’s still some need for concurrent iterators, which is covered by the newamphp/pipeline
library now.Closable
Amp\Closable
has been added as a new basic interface for closable resources such as streams or sockets.Strict Types
Strict types now declared in all library files. This will affect callbacks invoked within this library’s code which use scalar types as parameters. Functions used with
Amp\async()
are the most likely to be affected by this change — these functions will now be invoked within a strict-types context. - Renamed
-
amphp/php-cs-fixer-config 2.0.0
- Common code style for all packages based on Amp v3.
- Now includes
strict_types
and several other minor updates.
-
amphp/websocket-client 1.0.1
- Ignore
/docs
in.gitattributes
to avoid broken symlink (#38)
Full Changelog: https://github.com/amphp/websocket-client/compare/v1.0.0…v1.0.1
- Ignore
-
amphp/parallel-functions 1.1.0
What’s Changed
- Update to
laravel/serializable-closure
instead ofopis/closure
by @owenvoke - Increase minimum PHP version to PHP 7.4 by @owenvoke
New Contributors
- @sci3ma made their first contribution in https://github.com/amphp/parallel-functions/pull/24
- @owenvoke made their first contribution in https://github.com/amphp/parallel-functions/pull/31
Full Changelog: https://github.com/amphp/parallel-functions/compare/v1.0.0…v1.1.0
- Update to
-
amphp/rpc 1.0.0
Initial release.
-
amphp/cluster 1.0.1
Update to use
amphp/file
v2.x
. -
amphp/mysql 2.1.2
- Fixed a bug when decoding a JSON field (#113)
-
amphp/http-client-cookies 1.2.0
- Added compatibility with
amphp/file
v2 - Updated public suffix list
- Added compatibility with
-
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.