1. Go to this page and download the library: Download highcore/temporal-bundle library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
/**
* This file is part of Temporal package.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Temporal\Samples\FileProcessing;
use Temporal\Activity\ActivityInterface;
#[ActivityInterface(prefix:"FileProcessing.")]
interface StoreActivitiesInterface
{
/**
* Upload file to remote location.
*
* @param string $localFileName file to upload
* @param string $url remote location
*/
public function upload(string $localFileName, string $url): void;
/**
* Process file.
*
* @param string $inputFileName source file name @@return processed file name
* @return string
*/
public function process(string $inputFileName): string;
/**
* Downloads file to local disk.
*
* @param string $url remote file location
* @return TaskQueueFilenamePair local task queue and downloaded file name
*/
public function download(string $url): TaskQueueFilenamePair;
}
# https://github.com/temporalio/samples-php/blob/master/app/src/FileProcessing/StoreActivity.php
/**
* This file is part of Temporal package.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Temporal\Samples\FileProcessing;
use Psr\Log\LoggerInterface;
use Temporal\SampleUtils\Logger;
class StoreActivity implements StoreActivitiesInterface
{
private static string $taskQueue;
private LoggerInterface $logger;
public function __construct(string $taskQueue = FileProcessingWorkflow::DEFAULT_TASK_QUEUE)
{
self::$taskQueue = $taskQueue;
$this->logger = new Logger();
}
public function upload(string $localFileName, string $url): void
{
if (!is_file($localFileName)) {
throw new \InvalidArgumentException("Invalid file type: " . $localFileName);
}
// Faking upload to simplify sample implementation.
$this->log('upload activity: uploaded from %s to %s', $localFileName, $url);
}
public function process(string $inputFileName): string
{
try {
$this->log('process activity: sourceFile=%s', $inputFileName);
$processedFile = $this->processFile($inputFileName);
$this->log('process activity: processed file=%s', $processedFile);
return $processedFile;
} catch (\Throwable $e) {
throw $e;
}
}
public function download(string $url): TaskQueueFilenamePair
{
try {
$this->log('download activity: downloading %s', $url);
$data = file_get_contents($url);
$file = tempnam(sys_get_temp_dir(), 'demo');
file_put_contents($file, $data);
$this->log('download activity: downloaded from %s to %s', $url, realpath($file));
return new TaskQueueFilenamePair(self::$taskQueue, $file);
} catch (\Throwable $e) {
throw $e;
}
}
private function processFile(string $filename): string
{
// faking processing for simplicity
return $filename;
}
/**
* @param string $message
* @param mixed ...$arg
*/
private function log(string $message, ...$arg)
{
// by default all error logs are forwarded to the application server log and docker log
$this->logger->debug(sprintf($message, ...$arg));
}
}
/**
* This file is part of Temporal package.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Temporal\Samples\FileProcessing;
use Temporal\Workflow\WorkflowInterface;
use Temporal\Workflow\WorkflowMethod;
#[WorkflowInterface]
interface FileProcessingWorkflowInterface
{
#[WorkflowMethod("FileProcessing")]
public function processFile(
string $sourceURL,
string $destinationURL
);
}
# https://github.com/temporalio/samples-php/blob/master/app/src/FileProcessing/FileProcessingWorkflow.php
/**
* This file is part of Temporal package.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Temporal\Samples\FileProcessing;
use Carbon\CarbonInterval;
use Temporal\Activity\ActivityOptions;
use Temporal\Common\RetryOptions;
use Temporal\Internal\Workflow\ActivityProxy;
use Temporal\Workflow;
class FileProcessingWorkflow implements FileProcessingWorkflowInterface
{
public const DEFAULT_TASK_QUEUE = 'default';
/** @var ActivityProxy|StoreActivitiesInterface */
private $defaultStoreActivities;
public function __construct()
{
$this->defaultStoreActivities = Workflow::newActivityStub(
StoreActivitiesInterface::class,
ActivityOptions::new()
->withScheduleToCloseTimeout(CarbonInterval::minute(5))
->withTaskQueue(self::DEFAULT_TASK_QUEUE)
);
}
public function processFile(string $sourceURL, string $destinationURL)
{
/** @var TaskQueueFilenamePair $downloaded */
$downloaded = yield $this->defaultStoreActivities->download($sourceURL);
$hostSpecificStore = Workflow::newActivityStub(
StoreActivitiesInterface::class,
ActivityOptions::new()
->withScheduleToCloseTimeout(CarbonInterval::minute(5))
->withTaskQueue($downloaded->hostTaskQueue)
);
// Call processFile activity to zip the file.
// Call the activity to process the file using worker-specific task queue.
$processed = yield $hostSpecificStore->process($downloaded->filename);
// Call upload activity to upload the zipped file.
yield $hostSpecificStore->upload($processed, $destinationURL);
return 'OK';
}
}
return static function (ContainerConfigurator $configurator): void {
$services = $configurator->services();
$services->defaults()
->public()
->autowire(true)
->autoconfigure(true);
$services->set(Temporal\Samples\FileProcessing\StoreActivity::class)
// Setting a "label to your activity" will add the activity to the ActivityRegistry,
// allowing your employee to use this activity in your Workflow
->tag('temporal.activity.registry');
declare(strict_types=1);
namespace Highcore\TemporalBundle\Example;
use Temporal\Client\WorkflowClientInterface;
use Temporal\Workflow\WorkflowRunInterface;
use Temporal\Client\WorkflowOptions;
use Temporal\Common\RetryOptions;
final class ExampleWorkflowRunner {
public function __construct(private readonly WorkflowClientInterface $workflowClient)
{
}
public function run(): void
{
/** @var \Temporal\Samples\FileProcessing\FileProcessingWorkflowInterface $workflow */
$workflow = $this->workflowClient->newWorkflowStub(
\Temporal\Samples\FileProcessing\FileProcessingWorkflowInterface::class,
WorkflowOptions::new()
->withRetryOptions(
RetryOptions::new()
->withMaximumAttempts(3)
->withNonRetryableExceptions(\LogicException::class)
)
);
// Start Workflow async, with no-wait result
/** @var WorkflowRunInterface $result */
$result = $this->workflowClient->start($workflow, 'https://example.com/example_file', 's3://s3.example.com');
echo 'Run ID: ' . $result->getExecution()->getRunID();
// Or you can call workflow sync with wait result
$result = $workflow->processingFile('https://example.com/example_file', 's3://s3.example.com');
echo $result; // OK
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.