記一次大批量數據的多進程同步
背景:由於公司的用戶標識不完整,因此須要從集團同步一次用戶標記數據,用戶數據來源是微信,數量級爲一百五十萬,集團用戶數量級爲六百萬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');
多線程大批量數據問題解決^_^