Rumah  >  Soal Jawab  >  teks badan

Sistem pemprosesan baris gilir serentak berdasarkan Swoole dan Redis

Memandangkan PHP tidak menyokong multi-threading, sebagai sistem yang lengkap, terdapat banyak operasi yang perlu diselesaikan secara tidak segerak. Untuk melengkapkan operasi tak segerak ini, kami membina sistem tugas baris gilir Redis.

Seperti yang kita sedia maklum, sistem pemprosesan baris gilir mesej terbahagi kepada dua bahagian: pengguna dan pengeluar.

Dalam sistem kami, sistem utama bertindak sebagai pengeluar dan sistem tugas bertindak sebagai pengguna.

Aliran kerja khusus adalah seperti berikut: 1. Sistem utama menolak nama tugas + parameter tugas yang perlu diproses ke dalam baris gilir. 2. Sistem tugasan memunculkan baris gilir tugasan dalam masa nyata Apabila tugasan muncul, ia menghentikan sub-proses dan sub-proses melengkapkan logik tugasan tertentu.

/**
 * 启动守护进程
 */
public function runAction() {
    Tools::log_message('ERROR', 'daemon/run' . ' | action: restart', 'daemon-');
    while (true) {
        $this->fork_process();
    }
    exit;
}
 
/**
 * 创建子进程
 */
private function fork_process() {
    $ppid = getmypid();
    $pid = pcntl_fork();
    if ($pid == 0) {//子进程
        $pid = posix_getpid();
        //echo "* Process {$pid} was created \n\n";
        $this->mq_process();
        exit;
    } else {//主进程
        $pid = pcntl_wait($status, WUNTRACED); //取得子进程结束状态
        if (pcntl_wifexited($status)) {
            //echo "\n\n* Sub process: {$pid} exited with {$status}";
            //Tools::log_message('INFO', 'daemon/run succ' . '|status:' . $status . '|pid:' . $ppid . '|childpid:' . $pid );
        } else {
            Tools::log_message('ERROR', 'daemon/run fail' . '|status:' . $status . '|pid:' . $ppid . '|childpid:' . $pid, 'daemon-');
        }
    }
}
 
/**
 * 业务任务队列处理
 */
private function mq_process() {
    $data_pop = $this->masterRedis->rPop($this->redis_list_key);
    $data = json_decode($data_pop, 1);
    if (!$data) {
        return FALSE;
    }
    $worker = '_task_' . $data['worker'];
    $class_name = isset($data['class']) ? $data['class'] : 'TaskproModel';
    $params = $data['params'];
    $class = new $class_name();
    $class->$worker($params);
    return TRUE;
}


PHP中高级教程分享PHP中高级教程分享2136 hari yang lalu1437

membalas semua(2)saya akan balas

Tiada jawapan
  • Batalbalas