我使用EasyWechat嘗試開發(fā)了一個(gè)第三方平臺,然后會幫助本地商戶或公眾號運(yùn)營一些活動(dòng),如何在公眾號授權(quán)對接后快速的將公眾號粉絲數(shù)據(jù)同步到本地?cái)?shù)據(jù)庫方便運(yùn)營?我先前的想法是用戶有交互的時(shí)候再觸發(fā)同步,目前是使用的手動(dòng)方式和命令行方式,手動(dòng)方式如下:
/**
* 同步
*/
public function sync()
{
$account = $this->request->param('account', 0, 'intval');
$account = AccountService::getDataById($account);
if (empty($account)) {
$this->error('參數(shù)錯(cuò)誤');
}
//頁碼
$page = $this->request->param('page', 0, 'intval');
$page_size = 50;
//微信實(shí)例
$wechat = WechatService::applicationInit($account);
//先從緩存中讀取
$fans = cache('wechat_fans_'.$account->id);
if (!$fans) {
echo '從騰訊拉取';
//從騰訊拉取第一頁
$datas = $wechat->user->lists();
$total = ceil($datas['total'] / $datas['count']);
$fans = $datas['data']['openid'];
for ($i = 1; $i < $total; $i++) {
$datas = $wechat->user->lists($datas['next_openid']);
$lists = $datas['data']['openid'];
foreach ($lists as $k => $v) {
array_push($fans, $v);
}
}
//設(shè)置緩存
cache('wechat_fans_'.$account->id, $fans);
}
foreach ($fans as $k => $v) {
if ($k <= $page * $page_size) {
continue;
}
if ($k > ($page + 1) * $page_size) {
return $this->success('更新下一頁', url($this->request->controller().'/sync', ['account' => $account->id, 'page' => $page + 1]));
}
echo '同步'.$k.'成功<br/>';
try {
UserService::syncDataByServer($account, $v);
} catch (\Exception $e) {
echo '同步'.$k.'出錯(cuò)<br/>';
continue;
}
}
//刪除緩存
cache('wechat_fans_'.$account->id, null);
return $this->success('同步完成', url($this->request->controller().'/index', ['account' => $account->id]));
}
這種使用分頁同步在瀏覽器執(zhí)行的方式速度非常慢,大約幾萬粉絲都要跑很久,然后跟這個(gè)類似的我寫了一個(gè)命令行方式,執(zhí)行也很慢。
<php
namespace app\wechat\command;
use app\wechat\service\AccountService;
use app\wechat\service\WechatService;
use app\wechat\service\UserService;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\console\input\Option;
/**
* 同步用戶命令
* Class SyncUser
* @package app\wechat\command
*/
class SyncUser extends Command
{
/**
* 命令行配置
*/
protected function configure()
{
//設(shè)置命令名稱及描述
$this->setName('Wechat:SyncUser')
->addOption('account', 0, Option::VALUE_REQUIRED, '賬號ID.')
->setDescription('同步公眾號用戶');
}
/**
* 命令
* @return int|null|void
*/
protected function execute(Input $input, Output $output)
{
ini_set('memory_limit', '1024M');
if (!$input->hasOption('account')) {
$output->writeln("請輸入賬號");
return null;
}
$account = $input->getOption('account');
$account = AccountService::getDataById($account);
if (!$account) {
$output->writeln("參數(shù)錯(cuò)誤");
exit;
}
//微信實(shí)例
$wechat = WechatService::applicationInit($account);
//先從緩存中讀取
$fans = cache('wechat_fans_'.$account->id);
if (!$fans) {
$output->writeln("從騰訊拉取粉絲");
//從騰訊拉取第一頁
$datas = $wechat->user->lists();
$total = ceil($datas['total'] / $datas['count']);
$fans = $datas['data']['openid'];
for ($i = 1; $i < $total; $i++) {
$datas = $wechat->user->lists($datas['next_openid']);
$lists = $datas['data']['openid'];
foreach ($lists as $k => $v) {
array_push($fans, $v);
}
}
//設(shè)置緩存
cache('wechat_fans_'.$account->id, $fans);
}
foreach ($fans as $k => $v) {
try {
UserService::syncDataByServer($account, $v);
} catch (\Exception $e) {
$output->writeln("同步{$k}出錯(cuò)");
continue;
}
}
//刪除緩存
cache('wechat_fans_'.$account->id, null);
$output->writeln("同步完成");
}
}
求教各位大神有沒有比較好的方案。麻煩詳細(xì)些,本人不是專業(yè)的程序員,太簡略了看不懂。謝謝!
在用戶進(jìn)行授權(quán)接入后,進(jìn)行粉絲數(shù)據(jù)同步主要有兩個(gè)部分,一個(gè)歷史粉絲數(shù)據(jù)同步,這個(gè)利用后臺程序在公眾號授權(quán)后就可以開始同步了,獲取用戶列表接口一次也只能獲取一萬個(gè)openid,一個(gè)公眾號一個(gè)線程也就夠了, 沒有必要立即跑完,本身微信公眾號接口就有頻率限制,如果你覺得速度實(shí)在是慢,也可以開幾個(gè)進(jìn)程來處理。 幾萬個(gè)粉絲的公眾號其實(shí)很快就能跑完了,放在后臺任務(wù)執(zhí)行也不用人工執(zhí)行。
二是新的粉絲數(shù)據(jù),在關(guān)注和取消關(guān)注事件里面,你可以在事件回調(diào)中處理粉絲數(shù)據(jù),這樣就不用重新拉取所有的粉絲數(shù)據(jù)了。
其實(shí)幾萬個(gè)粉絲數(shù)據(jù)很快就處理完了, 我跑過兩千多萬粉絲的數(shù)據(jù),也就幾天,而且接口調(diào)用頻率放的很慢了。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。