Laravel 命令行工具之多線程同步大批量數據 DB鏈接混亂 解決方案

記一次大批量數據的多進程同步

背景:由於公司的用戶標識不完整,因此須要從集團同步一次用戶標記數據,用戶數據來源是微信,數量級爲一百五十萬,集團用戶數量級爲六百萬php

方案肯定下來是集團開了一個查詢接口,訪問沒有頻率併發限制,數量級在那呢,咱們遍歷公司的用戶,去查詢這些用戶的標識來更新mysql

項目使用了laravel,就寫了一個命令行腳本,開15個進程去跑laravel

 

因爲時間關係使用了PHP的pcntl_fork實現多進程redis

核心代碼以下:sql

主要流程是:微信

首先主進程分配userid給各個子進程,這裏使用了redis隊列來存儲,而後fork子進程,在子進程中pop隊列獲取分配到的userid範圍,再查庫組裝信息請求集團API,根據返回值標示用戶。多線程

由於Laravel封裝的redis和DB使用了單例,全部多個進程多錢redis和DB時均有報錯:併發

redis:Error while reading line from the server命令行

mysql:Packets out of order. Expected 1 received 19線程

嗯,都是多進程讀取單例的同一個鏈接致使的,解決方案:

redis:使用原生PHP的redis鏈接:

$redis = new \Redis();
        $re1 = $redis->connect(env('REDIS_HOST'),env('REDIS_PORT'));
        $re2 = $redis->auth(env('REDIS_PASSWORD'));

  

mysql:使用laravel的purge 和reconnetc從新鏈接

DB::purge('mysql');
            DB::reconnect('mysql');

  

 

多線程大批量數據問題解決^_^

相關文章
相關標籤/搜索