2017-11-12 16:13:12 +01:00
< a href = "https://amphp.org/" >
2022-08-17 19:04:49 +02:00
< img src = "https://github.com/amphp/logo/blob/master/repos/amp-v3-logo-with-margin.png?raw=true" width = "250" align = "right" alt = "Amp Logo" >
2017-11-12 16:13:12 +01:00
< / a >
2015-04-29 17:29:09 +02:00
2018-04-30 22:49:57 +02:00
< a href = "https://amphp.org/" > < img alt = "Amp" src = "https://github.com/amphp/logo/blob/master/repos/amp-text.png?raw=true" width = "100" valign = "middle" > < / a >
2015-07-19 19:29:25 +02:00
2022-08-17 19:04:49 +02:00
AMPHP is a collection of event-driven libraries for PHP designed with fibers and concurrency in mind.
`amphp/amp` specifically provides futures and cancellations as fundamental primitives for asynchronous programming.
We're now using [Revolt ](https://revolt.run/ ) instead of shipping an event loop implementation with `amphp/amp` .
2017-03-13 13:16:59 +01:00
2021-12-02 23:35:02 +01:00
Amp makes heavy use of fibers shipped with PHP 8.1 to write asynchronous code just like synchronous, blocking code. In
contrast to earlier versions, there's no need for generator based coroutines or callbacks. Similar to threads, each
fiber has its own call stack, but fibers are scheduled cooperatively by the event loop. Use `Amp\async()` to run things
concurrently.
2013-11-24 17:30:03 +01:00
2018-04-30 22:49:57 +02:00
< a href = "blob/master/LICENSE" > < img src = "https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square" valign = "middle" > < / a >
2019-09-21 21:02:47 +02:00
## Motivation
2022-08-17 19:04:49 +02:00
Traditionally, PHP follows a sequential execution model.
The PHP engine executes one line after the other in sequential order.
Often, however, programs consist of multiple independent sub-programs with can be executed concurrently.
2019-09-21 21:02:47 +02:00
2022-08-17 19:04:49 +02:00
If you query a database, you send the query and wait for the response from the database server in a blocking manner.
Once you have the response, you can start doing the next thing.
Instead of sitting there and doing nothing while waiting, we could already send the next database query, or do an HTTP call to an API.
Let's make use of the time we usually spend on waiting for I/O!
2019-09-21 21:02:47 +02:00
![](docs/images/sequential-vs-concurrent.png)
2022-08-17 19:04:49 +02:00
[Revolt ](https://revolt.run/ ) allows such concurrent I/O operations. We keep the cognitive load low by avoiding callbacks.
Our APIs can be used like any other library, except that things _also_ work concurrently, because we use non-blocking I/O under the hood.
Run things concurrently using `Amp\async()` and await the result using `Future::await()` where and when you need it!
There have been various techniques for implementing concurrency in PHP over the years, e.g. callbacks and generators shipped in PHP 5.
These approaches suffered from the ["What color is your function" ](https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/ ) problem, which we solved by shipping Fibers with PHP 8.1.
They allow for concurrency with multiple independent call stacks.
Fibers are cooperatively scheduled by the [event-loop ](https://revolt.run ), which is why they're also called coroutines.
It's important to understand that only one coroutine is running at any given time, all other coroutines are suspended in the meantime.
You can compare coroutines to a computer running multiple programs using a single CPU core.
Each program gets a timeslot to execute.
Coroutines, however, are not preemptive.
They don't get their fixed timeslot.
They have to voluntarily give up control to the event loop.
Any blocking I/O function blocks the entire process while waiting for I/O.
You'll want to avoid them.
If you haven't read the installation guide, have a look at the [Hello World example ](https://v3.amphp.org/installation#hello-world ) that demonstrates the effect of blocking functions.
The libraries provided by AMPHP avoid blocking for I/O.
2019-09-21 21:02:47 +02:00
2017-03-13 13:16:59 +01:00
## Installation
This package can be installed as a [Composer ](https://getcomposer.org/ ) dependency.
```bash
2017-07-16 18:24:07 +02:00
composer require amphp/amp
2017-03-13 13:16:59 +01:00
```
2022-08-17 19:04:49 +02:00
If you use this library, it's very likely you want to schedule events using [Revolt ](https://revolt.run ),
2021-12-02 23:35:02 +01:00
which you should require separately, even if it's automatically installed as a dependency.
2019-09-21 21:02:47 +02:00
2021-12-02 23:35:02 +01:00
```bash
composer require revolt/event-loop
```
2022-08-17 19:04:49 +02:00
These packages provide the basic building blocks for asynchronous / concurrent applications in PHP. We offer a lot of packages
building on top of these, e.g.
2021-12-02 23:35:02 +01:00
- [`amphp/byte-stream` ](https://github.com/amphp/byte-stream ) providing a stream abstraction
- [`amphp/socket` ](https://github.com/amphp/socket ) providing a socket layer for UDP and TCP including TLS
- [`amphp/parallel` ](https://github.com/amphp/parallel ) providing parallel processing to utilize multiple CPU cores and
offload blocking operations
- [`amphp/http-client` ](https://github.com/amphp/http-client ) providing an HTTP/1.1 and HTTP/2 client
- [`amphp/http-server` ](https://github.com/amphp/http-server ) providing an HTTP/1.1 and HTTP/2 application server
- [`amphp/mysql` ](https://github.com/amphp/mysql ) and [`amphp/postgres` ](https://github.com/amphp/postgres ) for
non-blocking database access
- and [many more packages ](https://github.com/amphp?type=source )
2019-09-21 21:02:47 +02:00
2017-03-13 13:16:59 +01:00
## Requirements
2013-08-05 22:05:08 +02:00
2022-08-17 19:04:49 +02:00
This package requires PHP 8.1+, no extensions required!
2015-07-22 06:06:02 +02:00
2022-08-17 19:04:49 +02:00
< small >
2015-07-22 06:06:02 +02:00
2021-12-02 23:35:02 +01:00
[Extensions ](https://revolt.run/extensions ) are only needed if your app necessitates a high numbers of concurrent socket
connections, usually this limit is configured up to 1024 file descriptors.
2017-11-12 17:15:42 +01:00
2022-08-17 19:04:49 +02:00
< / small >
2019-09-21 21:02:47 +02:00
## Versioning
2017-11-12 17:15:42 +01:00
2019-09-21 21:02:47 +02:00
`amphp/amp` follows the [semver ](http://semver.org/ ) semantic versioning specification like all other `amphp` packages.
2014-08-07 07:35:17 +02:00
2017-03-13 13:16:59 +01:00
## Compatible Packages
Compatible packages should use the [`amphp` ](https://github.com/search?utf8=%E2%9C%93&q=topic%3Aamphp ) topic on GitHub.
## Security
2021-12-02 23:35:02 +01:00
If you discover any security related issues, please email [`me@kelunik.com` ](mailto:me@kelunik.com ) instead of using the
issue tracker.
2017-03-13 13:16:59 +01:00
## License
2017-03-13 15:49:25 +01:00
The MIT License (MIT). Please see [`LICENSE` ](./LICENSE ) for more information.