From 11215534e860bd93136929805f963ff66edf7ebf Mon Sep 17 00:00:00 2001 From: Niklas Keller Date: Sat, 21 Sep 2019 21:02:47 +0200 Subject: [PATCH] Improve README --- README.md | 95 +++++++++++------------ docs/images/sequential-vs-concurrent.png | Bin 0 -> 34324 bytes 2 files changed, 45 insertions(+), 50 deletions(-) create mode 100644 docs/images/sequential-vs-concurrent.png diff --git a/README.md b/README.md index 8b34b80..c47d913 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,22 @@ Promises in combination with generators are used to build coroutines, which allo +## 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 -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 diff --git a/docs/images/sequential-vs-concurrent.png b/docs/images/sequential-vs-concurrent.png new file mode 100644 index 0000000000000000000000000000000000000000..b9815a4242ade6ba629a03a49ef0f4a6245b2f5d GIT binary patch literal 34324 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�M_cDA?OVSLL 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 literal 0 HcmV?d00001