Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara mengendalikan penjadualan dan pemprosesan tugas teragih dalam pembangunan PHP

Cara mengendalikan penjadualan dan pemprosesan tugas teragih dalam pembangunan PHP

王林
王林asal
2023-10-10 12:02:01762semak imbas

Cara mengendalikan penjadualan dan pemprosesan tugas teragih dalam pembangunan PHP

Cara menangani penjadualan dan pemprosesan tugas teragih dalam pembangunan PHP

Dengan pembangunan berterusan dan pertumbuhan aplikasi Internet, penjadualan tugas dan pemprosesan telah menjadi semakin penting dalam pembangunan berskala besar Sistem teragih menjadi semakin kompleks pada skala. Untuk mengendalikan tugas yang diagihkan dengan cekap dan boleh dipercayai, pembangun perlu mereka bentuk dan melaksanakan penyelesaian dengan teliti. Artikel ini akan memperkenalkan cara menggunakan PHP untuk mengendalikan penjadualan dan pemprosesan tugas yang diedarkan, sambil menyediakan beberapa contoh kod khusus.

  1. Menggunakan baris gilir mesej

Baris gilir mesej ialah penyelesaian biasa untuk penjadualan dan pemprosesan tugas yang diedarkan. Dalam pembangunan PHP, anda boleh menggunakan perisian tengah baris gilir mesej seperti RabbitMQ, ActiveMQ atau Kafka.

Pertama, pasang perisian tengah baris gilir mesej yang sepadan. Mengambil RabbitMQ sebagai contoh, anda boleh memasang pakej pergantungan PHP yang berkaitan melalui Komposer:

composer require php-amqplib/php-amqplib

Kemudian, buat contoh kod untuk pengeluar menghantar tugasan:

<?php
require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);

$message = new AMQPMessage('任务', ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($message, '', 'task_queue');

echo "任务已发送
";

$channel->close();
$connection->close();
?>

Kemudian, cipta contoh Kod pengguna untuk pemproses untuk memproses tugas:

<?php
require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);

echo "等待任务...
";

$callback = function ($message) {
  echo "接收到任务: " . $message->body . "
";
  // 处理任务的代码逻辑
  sleep(5); // 模拟任务处理时间
  echo "任务完成
";
  $message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);
};

$channel->basic_qos(null, 1, null);
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);

while ($channel->is_consuming()) {
  $channel->wait();
}

$channel->close();
$connection->close();
?>
  1. Menggunakan rangka kerja penjadualan tugas yang diedarkan

Selain menggunakan baris gilir mesej, anda juga boleh menggunakan beberapa rangka kerja penjadualan tugas teragih sumber terbuka untuk memudahkan pembangunan. Dalam pembangunan PHP, anda boleh menggunakan Penjadualan Tugas Laravel (penjadualan tugas) dan Horizon (pemprosesan tugas) untuk mencapai ini.

Pertama, pasang rangka kerja Laravel dan pakej sambungan Horizon. Mengambil Komposer sebagai contoh, laksanakan arahan berikut:

composer require laravel/framework
composer require laravel/horizon

Kemudian, konfigurasikan penjadualan tugas dan Horizon. Dalam fail app/Console/Kernel.php Laravel, anda boleh menentukan peraturan penjadualan tugas dan logik pemprosesan. Contohnya adalah seperti berikut: app/Console/Kernel.php文件中,可以定义任务的调度规则和处理逻辑。示例如下:

<?php

namespace AppConsole;

use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        //
    ];

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('email:send')->daily();
    }

    protected function commands()
    {
        $this->load(__DIR__.'/Commands');
        require base_path('routes/console.php');
    }
}

接着,运行Horizon的进程来处理任务。执行以下命令:

php artisan horizon

以上代码示例中,每天会调度执行email:send

<?php

$hadoop = new Hadoop();
$hadoop->putFile('/path/to/input/file', '/input/file.txt');
$hadoop->submitJob('/path/to/hadoop/job', '/input/file.txt', '/output/file.txt');
$jobId = $hadoop->getJobId();

echo "任务已提交,Job ID: " . $jobId . "
";

$result = $hadoop->getResult('/output/file.txt');

echo "任务结果: " . $result . "
";
?>

Seterusnya, jalankan proses Horizon untuk mengendalikan tugas. Jalankan arahan berikut:
    rrreee
  1. Dalam contoh kod di atas, perintah email:send dijadualkan untuk dilaksanakan setiap hari. Horizon memantau dan mengendalikan tugas secara automatik.

Gunakan rangka kerja pengkomputeran teragih

Selain itu, beberapa rangka kerja pengkomputeran teragih juga boleh digunakan untuk mengendalikan tugas yang diedarkan. Contohnya, gunakan Apache Hadoop untuk melaksanakan penjadualan dan pemprosesan tugas teragih.

Pertama, pasang dan konfigurasikan kelompok Hadoop. Terdapat banyak persediaan dan keluk pembelajaran yang terlibat di sini, dan langkah pemasangan dan konfigurasi khusus belum disediakan lagi.

Kemudian, tulis kod PHP untuk menyerahkan tugas kepada kelompok Hadoop. Kod sampel adalah seperti berikut: #🎜🎜#rrreee#🎜🎜#Di atas adalah beberapa contoh pengendalian penjadualan dan pemprosesan tugas teragih Kaedah pelaksanaan tertentu mungkin berbeza mengikut keperluan sebenar dan kerumitan seni bina sistem. Sama ada anda menggunakan baris gilir mesej, rangka kerja penjadualan tugas teragih atau rangka kerja pengkomputeran teragih, anda harus memilih penyelesaian yang paling sesuai berdasarkan keperluan dan skala projek, dan melakukan pengoptimuman prestasi dan penyahpepijatan yang sesuai. #🎜🎜#

Atas ialah kandungan terperinci Cara mengendalikan penjadualan dan pemprosesan tugas teragih dalam pembangunan PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn