Home >Backend Development >PHP Tutorial >Asynchronous tasks and scheduling using PHP and Google Cloud Tasks
Whether it is an online application or an offline processing task, asynchronous task processing and scheduling are very important for web applications that handle various tasks. In order to better manage tasks, keep web applications scalable, and improve application performance, we must rely on asynchronous task processing and scheduling.
Google Cloud Tasks is a fully managed service that makes it easy to perform periodic and asynchronous tasks through API calls. This article will show you how to implement asynchronous tasks and scheduling using PHP and Google Cloud Tasks. We'll learn how to set up Google Cloud Tasks and how to use task queues.
Before we begin, we need to install the Google Cloud SDK, set up Google Cloud Tasks, and create a Google Cloud Project to use the service.
Install Google Cloud SDK
Google Cloud SDK is a command line tool commonly used to manage and run cloud resources. You can use the following command to install the Google Cloud SDK:
curl https://sdk.cloud.google.com | bash
During the installation process, you need to follow the on-screen prompts and enter your Google account information.
Set up Google Cloud Tasks
Next, we need to set up Google Cloud Tasks. In Cloud Tasks, a task consists of three key elements: task queue, task, and executor.
A task queue is a resource with a specific name that allows you to place new tasks. Task queue names are globally unique.
A task is a descriptive object that you create and add to the task queue.
The executor is the actual code called when the task runs, usually located in your web application.
In this tutorial we will use the following values:
Now, let’s quickly set up Cloud Tasks.
gcloud tasks queues create my-queue
This command will create a task queue named my-queue. If you use other services, such as App Engine or Cloud Functions, you can bind them to this queue to facilitate processing of tasks.
In the Cloud Console, select the project from which you want to configure Cloud Functions and go to Cloud Functions. Click Create Function and enter the name "processTask" for the new function.
We will use the following Cloud function code:
<?php use GoogleCloudStorageStorageClient; use GoogleCloudLoggingLoggingClient; function processTask($data, $context) { $bucket = 'my-bucket'; $logging = new LoggingClient(['projectId' => 'my-project-id']); $logger = $logging->psrLogger('my-logger'); $logger->info('Starting task', ['data' => $data]); $storage = new StorageClient(['projectId' => 'my-project-id']); $bucket = $storage->bucket('my-bucket'); // TODO: Process the task $logger->info('Task completed successfully.'); }
This function requires access to Google Cloud Storage, therefore, we also need to grant it access. In the Cloud Console, go to Storage > Browse. Next, click Create Bucket, select standard storage for the new bucket and type the name "my-bucket".
In the bucket tab, click "Permissions". Select "Add Entity" to add the program "cloud-tasks@cloudtasks.googleapis.com" permission to the service. Under Select a role, in the Role drop-down list, select Cloud Tasks Task Performer.
Now the Cloud Function is ready to use task sharing code.
gcloud tasks create-http-task --queue=my-queue --url=https://us-central1-my-project-id.cloudfunctions.net/processTask --http-method=POST --body='{"message":"hello world"}'
Using the above gcloud command, we will create a POST request in JSON format with the "message" attribute set to "hello world". This task will be added to the my-queue queue.
This is the complete setup for getting Cloud Tasks.
Loading Cloud Tasks using PHP
Now that we have the settings for Cloud Tasks, let’s load Cloud Tasks using PHP. Google provides an official PHP package called google/cloud-tasks. You can install it using Composer:
composer require google/cloud-tasks
Now we can write the PHP code to create the task and add it to the task queue. Let's look at the following example:
<?php require_once __DIR__ . '/vendor/autoload.php'; use GoogleCloudTasksV2CloudTasksClient; use GoogleCloudTasksV2HttpMethod; use GoogleCloudTasksV2Queue; use GoogleCloudTasksV2Task; use GoogleProtobufDuration; $projectId = 'my-project-id'; $location = 'us-central1'; $queueId = 'my-queue'; $cloudTasksClient = new CloudTasksClient(); $queueName = $cloudTasksClient->queueName($projectId, $location, $queueId); $queue = new Queue(); $queue->setName($queueName); $taskName = $cloudTasksClient->taskName($projectId, $location, $queueId, uniqid()); $task = new Task(); $task->setName($taskName); $taskHttpReq = new GoogleCloudTasksV2HttpRequest(); $taskHttpReq->setUrl('https://us-central1-my-project-id.cloudfunctions.net/processTask'); $taskHttpReq->setHttpMethod(HttpMethod::POST); $taskHttpReq->setBody(json_encode(['message' => 'hello world'])); $task->setHttpRequest($taskHttpReq); $delay = new Duration(); $delay->setSeconds(10); $task->setScheduleTime($delay); $cloudTasksClient->createTask($queue, $task); $cloudTasksClient->close();
This code will create a task queue named "my-queue". Next, it creates a task and adds it to the queue. The task contains the URL, HTTP method and data body of the POST request.
The task also contains a scheduled time so that the task will be executed after 10 seconds.
Finally, we use the "createTask" method to add the task to the queue.
Summary
This article shows you how to implement task scheduling and asynchronous task processing using PHP and Google Cloud Tasks. Cloud Tasks is a fully managed service that makes it easy to call APIs that perform periodic and asynchronous tasks. We set up a Cloud function, created a task queue, and added tasks to the queue using PHP.
In actual applications, more complex functions and services may be added, and more queues and tasks can be added as needed. However, this should give you a good starting point for integrating Google Cloud Tasks into your web application.
The above is the detailed content of Asynchronous tasks and scheduling using PHP and Google Cloud Tasks. For more information, please follow other related articles on the PHP Chinese website!