1
0
mirror of https://github.com/danog/parallel.git synced 2024-11-26 20:34:40 +01:00
parallel/docs/processes.md

55 lines
1.9 KiB
Markdown
Raw Normal View History

2018-11-04 18:35:49 +01:00
---
2018-11-04 18:37:19 +01:00
title: Processes
2018-11-04 18:35:49 +01:00
permalink: /processes
---
`Process` simplifies writing and running PHP in parallel. A script written to be run in parallel must return a callable that will be run in a child process. The callable receives a single argument an instance of `Channel` that can be used to send data between the parent and child processes. Any serializable data can be sent across this channel. The `Process` object is the other end of the communication channel, as it implements `Context`, which extends `Channel`.
In the example below, a child process is used to call a blocking function (`file_get_contents()` is only an example of a blocking function, use [Artax](https://amphp.org/artax) for non-blocking HTTP requests). The result of that function is then sent back to the parent using the `Channel` object. The return value of the child process callable is available using the `Process::join()` method.
2018-11-19 22:58:51 +01:00
## Child Process
2018-11-04 18:35:49 +01:00
```php
# child.php
use Amp\Parallel\Sync\Channel;
return function (Channel $channel): \Generator {
$url = yield $channel->receive();
$data = file_get_contents($url); // Example blocking function
yield $channel->send($data);
return 'Any serializable data';
});
```
2018-11-19 22:58:51 +01:00
## Parent Process
2018-11-04 18:35:49 +01:00
```php
# parent.php
use Amp\Loop;
use Amp\Parallel\Context\Process;
Loop::run(function () {
$process = new Process(__DIR__ . '/child.php');
$pid = yield $process->start();
$url = 'https://google.com';
yield $process->send($url);
2020-02-04 17:08:51 +01:00
$requestData = yield $process->receive();
2018-11-04 18:35:49 +01:00
printf("Received %d bytes from %s\n", \strlen($requestData), $url);
2020-02-04 17:08:51 +01:00
$returnValue = yield $process->join();
2018-11-04 18:35:49 +01:00
printf("Child processes exited with '%s'\n", $returnValue);
});
```
Child processes are also great for CPU-intensive operations such as image manipulation or for running daemons that perform periodic tasks based on input from the parent.