Temporal is an open-source workflow engine that manage and execute reliable, durable and fault-tolerant workflows in a distributed manner. But the only way to use it in PHP is with RoadRunner. It makes it super easy to integrate your PHP app with Temporal, so you can start using it right away.
One cool thing about Temporal is that you can write your workflows and activities in any supported language. So for example, you could have a workflow written in PHP, but handle some of the activities with code written in Go or vice versa. This can be really helpful if you have a team with different language preferences, or if you want to take advantage of the strengths of different languages for different tasks.
Use Temporal when you have to manage complex data flows or ensure reliable transaction processing across multiple business domains. it provides timers, retry mechanisms and much more.
To use Temporal in your PHP project, you need to install the spiral/temporal-bridge
package.
Here's how:
composer require spiral/temporal-bridge
After the package is installed, you will need to activate the component using the bootloader:
public function defineBootloaders(): array
{
return [
// ...
\Spiral\TemporalBridge\Bootloader\TemporalBridgeBootloader::class,
// ...
];
}
Read more about bootloaders in the Framework — Bootloaders section.
To start using Temporal quickly, use a development server.
First, install the Temporal CLI - follow the instructions on the Temporal website.
After the CLI is installed, you can start the Temporal server by running the following command:
temporal server start-dev
Note
There are other ways to start a Temporal server. For example, you can use Docker. You can find docker-compose files in the Temporal repository.
All you need is to specify the address of your Temporal server in the .env
file:
TEMPORAL_ADDRESS=127.0.0.1:7233
If you want to precisely configure your application, you can create the temporal.php
configuration file. There you can
specify options such as a task queue, and individual worker configurations.
Here is an example configuration file:
use Temporal\Worker\WorkerFactoryInterface;
use Temporal\Worker\WorkerOptions;
return [
'address' => env('TEMPORAL_ADDRESS', '127.0.0.1:7233'),
'defaultWorker' => WorkerFactoryInterface::DEFAULT_TASK_QUEUE,
'temporalNamespace' => 'default',
'workers' => [
'someTaskQueue' => WorkerOptions::new(),
// ...
],
'interceptors' => [],
'clientOptions' => null,
];
Client options are used to configure various aspects of a Temporal client's behavior.
For example:
use Temporal\Client\ClientOptions;
return [
// ...
'clientOptions' => (new ClientOptions())
->withNamespace('default')
->withIdentity('customer-service'),
];
Note
temporalNamespace
option will be used only ifclientOptions
is not specified. IfclientOptions
is not specified then ClientOptions will be created withtemporalNamespace
option value.
Worker options are used to configure various aspects of a Temporal worker's behavior.
WorkerOptions
class helps in effectively managing system resources. This is crucial for maintaining system
stability and efficiency, especially in high-load scenarios.You can define worker options for each task queue. For example:
use Temporal\Worker\WorkerOptions;
return [
// ...
'workers' => [
'workerName' => WorkerOptions::new(),
'default' => WorkerOptions::new()
->withMaxConcurrentActivityExecutionSize(10)
->withWorkerActivitiesPerSecond(100),
],
];
There is also an ability to use alternative way to define worker options. For example:
use Temporal\Worker\WorkerOptions;
return [
// ...
'workers' => [
'workerName' => [
'options' => WorkerOptions::new(),
'exception_interceptor' => new ExceptionInterceptor(),
]
],
];
Using this way you can additionally define an exception interceptor. Read more about interceptors in the Temporal — Interceptors section.
Interceptors are used to intercept workflow and activity invocations. They can be used to add custom logic to the invocation process, such as logging or metrics collection.
Read more about interceptors in the Temporal — Interceptors section.
In your RoadRunner configuration file .rr.yaml
, add a section temporal
. This lets you set the server address and the
number of workers. For example:
...
temporal:
address: localhost:7233
activities:
num_workers: 10
For more details on configuring Temporal with RoadRunner, read the RoadRunner documentation.
That's it! Happy workflow building!