Sistem pemprosesan baris gilir serentak berdasarkan Swoole dan Redis
PHP中高级教程分享
PHP中高级教程分享 2018-11-14 11:18:20
0
2
1525

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中高级教程分享

+VX:PHPopen888PHP中高级教程分享,专注laravel,swoole,tp,分布式高并发处理教程分享

membalas semua(0)
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan