mirror of
https://github.com/danog/amp.git
synced 2024-12-02 17:37:50 +01:00
Improve README
This commit is contained in:
parent
f5463656f4
commit
11215534e8
95
README.md
95
README.md
@ -12,6 +12,22 @@ Promises in combination with generators are used to build coroutines, which allo
|
||||
<a href="https://coveralls.io/github/amphp/amp?branch=master"><img src="https://img.shields.io/coveralls/amphp/amp/master.svg?style=flat-square" valign="middle"></a>
|
||||
<a href="blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square" valign="middle"></a>
|
||||
|
||||
## Motivation
|
||||
|
||||
Traditionally, PHP has a synchronous execution flow, doing one thing at a time.
|
||||
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.
|
||||
|
||||
Making use of the time we usually spend on waiting for I/O can speed up the total execution time.
|
||||
The following diagram shows the execution flow with dependencies between the different tasks, once executed sequentially and once concurrently.
|
||||
|
||||
![](docs/images/sequential-vs-concurrent.png)
|
||||
|
||||
Amp allows such concurrent I/O operations while keeping the cognitive load low by avoiding callbacks.
|
||||
Instead, the results of asynchronous operations can be awaited using `yield` resulting in code which is structured like traditional blocking I/O code while the actual execution flow is handled by Amp.
|
||||
|
||||
## Installation
|
||||
|
||||
This package can be installed as a [Composer](https://getcomposer.org/) dependency.
|
||||
@ -20,72 +36,51 @@ This package can be installed as a [Composer](https://getcomposer.org/) dependen
|
||||
composer require amphp/amp
|
||||
```
|
||||
|
||||
This installs the basic building blocks for asynchronous applications in PHP.
|
||||
We offer a lot of repositories building on top of this repository, e.g.
|
||||
|
||||
- [`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)
|
||||
|
||||
## Documentation
|
||||
|
||||
Documentation can be found on [amphp.org](https://amphp.org/) as well as in the [`./docs`](./docs) directory.
|
||||
Each packages has it's own `./docs` directory.
|
||||
|
||||
## Requirements
|
||||
|
||||
- PHP 7.0+
|
||||
This package requires PHP 7.0 or later.
|
||||
Many of the other packages raised their requirement to PHP 7.1.
|
||||
No extensions required!
|
||||
|
||||
##### Optional Extension Backends
|
||||
##### Optional Extensions
|
||||
|
||||
Extensions are only needed if your app necessitates a high numbers of concurrent socket connections.
|
||||
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.
|
||||
|
||||
- [ev](https://pecl.php.net/package/ev)
|
||||
- [event](https://pecl.php.net/package/event)
|
||||
- [php-uv](https://github.com/bwoebi/php-uv) (experimental fork)
|
||||
- [`ev`](https://pecl.php.net/package/ev)
|
||||
- [`event`](https://pecl.php.net/package/event)
|
||||
- [`uv`](https://github.com/bwoebi/php-uv)
|
||||
|
||||
## Examples
|
||||
|
||||
This simple example uses our [Artax](https://amphp.org/artax/) HTTP client to fetch multiple HTTP resources concurrently.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Amp\Artax\Response;
|
||||
use Amp\Loop;
|
||||
|
||||
require __DIR__ . '/../vendor/autoload.php';
|
||||
|
||||
Loop::run(function () {
|
||||
$uris = [
|
||||
"https://google.com/",
|
||||
"https://github.com/",
|
||||
"https://stackoverflow.com/",
|
||||
];
|
||||
|
||||
$client = new Amp\Artax\DefaultClient;
|
||||
$client->setOption(Amp\Artax\Client::OP_DISCARD_BODY, true);
|
||||
|
||||
try {
|
||||
foreach ($uris as $uri) {
|
||||
$promises[$uri] = $client->request($uri);
|
||||
}
|
||||
|
||||
$responses = yield $promises;
|
||||
|
||||
foreach ($responses as $uri => $response) {
|
||||
print $uri . " - " . $response->getStatus() . $response->getReason() . PHP_EOL;
|
||||
}
|
||||
} catch (Amp\Artax\HttpException $error) {
|
||||
// If something goes wrong Amp will throw the exception where the promise was yielded.
|
||||
// The Client::request() method itself will never throw directly, but returns a promise.
|
||||
print $error->getMessage() . PHP_EOL;
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
Further examples can be found in the [`./examples`](./examples) directory of this repository as well as in the `./examples` directory of [our other libraries](https://github.com/amphp?utf8=%E2%9C%93&q=&type=public&language=php)
|
||||
Examples can be found in the [`./examples`](./examples) directory of this repository as well as in the `./examples` directory of [our other libraries](https://github.com/amphp?utf8=%E2%9C%93&q=&type=public&language=php).
|
||||
|
||||
## Versioning
|
||||
|
||||
`amphp/amp` follows the [semver](http://semver.org/) semantic versioning specification like all other `amphp` packages.
|
||||
|
||||
| Version | Bug Fixes Until | Security Fixes Until |
|
||||
| ------- | --------------- | -------------------- |
|
||||
| 2.x | TBA | TBA |
|
||||
| 1.x | 2017-12-31 | 2018-12-31 |
|
||||
##### v2.x
|
||||
|
||||
Supported. We don't have plans to release v3, yet.
|
||||
|
||||
##### v1.x
|
||||
|
||||
No longer supported. We stopped providing bug fixes 2017-12-31 and stopped providing security fixes 2018-12-31.
|
||||
|
||||
## Compatible Packages
|
||||
|
||||
@ -93,7 +88,7 @@ Compatible packages should use the [`amphp`](https://github.com/search?utf8=%E2%
|
||||
|
||||
## Security
|
||||
|
||||
If you discover any security related issues, please email [`bobwei9@hotmail.com`](mailto:bobwei9@hotmail.com) or [`me@kelunik.com`](mailto:me@kelunik.com) instead of using the issue tracker.
|
||||
If you discover any security related issues, please email [`me@kelunik.com`](mailto:me@kelunik.com) instead of using the issue tracker.
|
||||
|
||||
## License
|
||||
|
||||
|
BIN
docs/images/sequential-vs-concurrent.png
Normal file
BIN
docs/images/sequential-vs-concurrent.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
Loading…
Reference in New Issue
Block a user