Connection Management Layer

Issue #224

In the Service Client, a method getConnection()has been added, which returns a ConnectionInterface. ConnectionInterface includes public methods isConnected(), disconnect(), connect(float $timeout), allowing control over the connection to the Temporal server.

A gRPC connection is lazy in PHP and is established only when the first gRPC method is called. Using the connect()method, users can immediately establish and verify connection credentials without the need for gRPC method calls. Users can sequentially call connect()and disconnect()without causing errors related to closed gRPC channels, as the channels are recreated under the hood.

/** @var \Temporal\Client\WorkflowClient $workflowClient */ // Establish a connection with the server. // An exception will be thrown if the connection is not established within 5 seconds. $workflowClient->getServiceClient()->getConnection()->connect(5);

Server Capabilities info now is cached in the Connection object and will be updated on each reconnect.

/** @var \Temporal\Client\WorkflowClient $workflowClient */ // Establish a connection with the server and call getSystemInfo() RPC method. $capabilities = $workflowClient->getServiceClient()->getServerCapabilities(); if (!$capabilities?->supportsSchedules) } { throw new \Temporal\Exception\TemporalException('Server does not support schedules'); }

Service Client with Secure Connection

A deprecation error will now be triggered when a ServiceClientis created directly through the constructor. Static factories are the only recommended way to create a ServiceClient.

One of such static methods has changes: in ServiceClient::createSSL(), the root certificate parameter has been made optional because it should be skipped when connecting to the Temporal Cloud. All keys can be passed as a string payload (previously, only by file name was allowed). If the provided file cannot be read, a clear exception will be thrown.

Service Client with API auth key

The ClientService now can accept an API key for authentication.

$serviceClient = \Temporal\Client\GRPC\ServiceClient::createSSL( '', __DIR__ . '/my-project.key', __DIR__ . '/my-project.crt', )->withAuthKey($key); // $key is a string or a \Stringable object $workflowClient = new \Temporal\Client\WorkflowClient($serviceClient);

You may pass your own Stringableimplementation as the $key argument to be able to change the key dynamically.

New methods for all the Clients (Workflow and Schedule)

Issue #338

Added new methods to WorkflowClient, ScheduleClient and ScheduleHandle:

  • withTimeout(float $timeout)

  • withDeadline()

  • withRetryOptions()

  • withMetadata()

They may be used before calling any method that sends a gRPC request to the server.

/** @var \Temporal\Client\ScheduleClient $scheduleClient */ $list = $scheduleClient->withTimeout(5)->listSchedules();

All the new methods are immutable and return a new instance of the client that will use the same connection as the original client, but with the specified timeout, deadline or retry options.

/** @var \Temporal\Client\WorkflowClient $workflowClient */ // All the calls $workflow->* will be executed with a 5-second timeout. $workflow = $workflowClient->withTimeout(5)->newWorkflowStub(MyWorkflow::class); // Will be called with a 10-second timeout. $workflowClient->withTimeout(10)->start($workflow, 'foo', 'bar') // Will be called with a 5-second timeout because the stub was created with a 5-second timeout client. $workflow->signal();

Note: WorkflowClientInterfaceand ScheduleClientInterfacehave been updated with the new methods.

RPC Retry Policy

Issue #421

Client RPC requests have a new algorithm for calculating the timeout until the next retry attempt:

  • Added Jitter, which introduces a random variation to the calculated time (default is 10%).

  • InitialInterval has been changed from 500ms to 50ms. For the


    error, the interval is 1000ms.

All settings are configurable:

$workflowClient->withRetryOptions( \Temporal\Client\Common\RpcRetryOptions::new() ->withInitialInterval('500 milliseconds') ->withCongestionInitialInterval('5 seconds') ->withMaximumInterval('5 minutes') ->withBackoffCoefficient(5) ->withMaximumAttempts(4) ->withJitter(0.25) );

Namespace Inheritance in Client methods

A mistake was made in the implementation of several client functions last time: instead of using the Namespace value from ClientOptions, a parameter with the default value "default" was used. This complicates the use of Temporal Cloud, where user's Namespace differs from "default".

Affected methods are:

  • WorkflowClient::listWorkflowExecutions()

  • WorkflowClient::countWorkflowExecutions()

  • WorkflowClient::getWorkflowHistory()

  • ScheduleClient::getHandle()

The $namespaceparameter is now nullby default. If a method receives null, the Namespace from ClientOptions will be used.

Describe a Workflow

Use the API to obtain comprehensive information about a started Workflow.

$stub = $workflowClient->newWorkflowStub(SimpleWorkflow::class); $run = $workflowClient->start($stub, 'Hello World!'); /** @var WorkflowExecutionDescription $description */ $description = $run->describe();

You can use the Workflow Describe feature to get the status of a running Workflow.

$stub = $workflowClient->newUntypedRunningWorkflowStub($wfId); /** @var WorkflowExecutionStatus $status */ $status = $stub->describe()->info->status;