Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengoptimumkan penjadualan dan pemprosesan tugas tak segerak dalam pembangunan PHP

Bagaimana untuk mengoptimumkan penjadualan dan pemprosesan tugas tak segerak dalam pembangunan PHP

WBOY
WBOYasal
2023-10-10 19:01:151352semak imbas

Bagaimana untuk mengoptimumkan penjadualan dan pemprosesan tugas tak segerak dalam pembangunan PHP

PHP ialah bahasa pengaturcaraan yang digunakan secara meluas dalam pembangunan web Ia fleksibel, mudah dipelajari dan digunakan. Dalam pembangunan sebenar, kita sering menghadapi situasi di mana kita perlu memproses sejumlah besar tugas tak segerak, seperti baris gilir mesej, tugas berjadual, dsb. Artikel ini akan memperkenalkan cara untuk meningkatkan kecekapan pembangunan PHP dengan mengoptimumkan penjadualan dan pemprosesan tugas tak segerak serta menyediakan contoh kod khusus.

1. Pengoptimuman penjadualan tugas tak segerak
Dalam pembangunan PHP, pengoptimuman penjadualan tugas asynchronous terutamanya merangkumi aspek berikut:

  1. Gunakan baris gilir mesej: Baris gilir mesej ialah cara untuk menghantar mesej secara tak segerak ke perisian tengah dan tugasan. Perisian tengah baris gilir mesej biasa termasuk RabbitMQ, Kafka, dsb. Berikut ialah kod sampel yang menggunakan RabbitMQ sebagai baris gilir mesej:
<?php
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('task_queue', false, true, false, false);

$callback = function($msg) {
  echo 'Received: ', $msg->body, "
";
};

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

while(count($channel->callbacks)) {
    $channel->wait();
}

$channel->close();
$connection->close();
?>
  1. Gunakan berbilang proses atau berbilang benang: Dengan menggunakan berbilang proses atau berbilang benang, anda boleh mengendalikan berbilang tugas pada masa yang sama dan meningkatkan kecekapan sistem. Berikut ialah contoh kod untuk menggunakan tugas pemprosesan berbilang proses:
<?php
$jobs = array(/* 多个任务 */);
$workers = array(); // 进程数组

foreach ($jobs as $job) {
    $pid = pcntl_fork(); // 创建子进程
    if ($pid == -1) {
        // 创建失败
        die('Could not fork');
    } else if ($pid) {
        // 父进程
        $workers[] = $pid;
    } else {
        // 子进程
        // 处理任务
        exit();
    }
}

// 等待所有子进程结束
foreach ($workers as $pid) {
    pcntl_waitpid($pid, $status);
}

?>
  1. Menggunakan tugas berjadual: Tugas berjadual boleh melaksanakan tugas pada masa yang ditentukan Alat tugas berjadual biasa termasuk Crontab, Penyelia, dsb. Berikut ialah contoh kod untuk menggunakan Crontab untuk melaksanakan tugas dengan kerap:
<?php
$jobs = array(/* 多个定时任务 */);

foreach ($jobs as $job) {
    exec("crontab -l | { cat; echo "{$job}"; } | crontab -"); // 添加定时任务
    // exec("crontab -l | grep -v "{$job}" | crontab -"); // 删除定时任务
}
?>

2. Pengoptimuman pemprosesan tugas asynchronous
Dalam pembangunan PHP, pengoptimuman pemprosesan tugas asynchronous terutamanya merangkumi aspek berikut:

  1. Guna asynchronous atau bukan segerak -blocking IO : Dengan menggunakan IO asynchronous atau non-blocking IO, pelaksanaan tugas lain tidak boleh disekat semasa pelaksanaan tugas. Berikut ialah kod sampel untuk operasi IO tak segerak menggunakan sambungan Swoole:
<?php
$server = new SwooleHttpServer("127.0.0.1", 9501);

$server->on('Request', function($request, $response) {
    $response->header("Content-Type", "text/html; charset=utf-8");
    $response->end("Hello World
");
});

$server->start();
?>
  1. Menggunakan coroutine: Coroutine ialah utas ringan yang boleh menukar konteks semasa pelaksanaan tugas untuk meningkatkan keselarasan tugas. Berikut ialah kod sampel menggunakan sambungan Swoole untuk operasi coroutine:
<?php
Coun(function() {
    $cli = new SwooleCoroutineHttpClient('www.baidu.com', 80);
    $cli->set(['timeout' => 1]);
    $cli->setDefer();
    
    $cli->execute('/index');
    
    $content = $cli->body;
    $cli->close();
    
    echo $content;
});
?>
  1. Penggunaan cache yang betul: Dengan menyimpan beberapa keputusan pengiraan dan data lain, masa pelaksanaan tugas dapat dikurangkan. Alat caching biasa termasuk Redis, Memcached, dll. Berikut ialah contoh kod untuk menggunakan Redis untuk caching data:
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$key = 'cache_key';
if (!$redis->exists($key)) {
    // 缓存不存在,从数据库中获取数据
    $data = // 从数据库中获取数据
    
    // 将数据存入缓存
    $redis->set($key, $data);
    $redis->expire($key, 3600); // 设置过期时间
} else {
    // 从缓存中获取数据
    $data = $redis->get($key);
}

?>

Dengan mengoptimumkan penjadualan dan pemprosesan tugas tak segerak, kami boleh meningkatkan kecekapan pembangunan PHP dan meningkatkan prestasi dan kestabilan sistem. Di atas hanyalah beberapa contoh mudah, dan penggunaan sebenar perlu diselaraskan dan dioptimumkan mengikut keadaan tertentu. Saya harap artikel ini akan membantu dalam mengoptimumkan pemprosesan tugas tak segerak PHP.

Atas ialah kandungan terperinci Bagaimana untuk mengoptimumkan penjadualan dan pemprosesan tugas tak segerak 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