我使用EasyWechat嘗試開(kāi)發(fā)了一個(gè)第三方平臺(tái),然后會(huì)幫助本地商戶或公眾號(hào)運(yùn)營(yíng)一些活動(dòng),如何在公眾號(hào)授權(quán)對(duì)接后快速的將公眾號(hào)粉絲數(shù)據(jù)同步到本地?cái)?shù)據(jù)庫(kù)方便運(yùn)營(yíng)?我先前的想法是用戶有交互的時(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ò)誤');
}
//頁(yè)碼
$page = $this->request->param('page', 0, 'intval');
$page_size = 50;
//微信實(shí)例
$wechat = WechatService::applicationInit($account);
//先從緩存中讀取
$fans = cache('wechat_fans_'.$account->id);
if (!$fans) {
echo '從騰訊拉取';
//從騰訊拉取第一頁(yè)
$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('更新下一頁(yè)', 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]));
}
這種使用分頁(yè)同步在瀏覽器執(zhí)行的方式速度非常慢,大約幾萬(wàn)粉絲都要跑很久,然后跟這個(gè)類(lèi)似的我寫(xiě)了一個(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è)置命令名稱(chēng)及描述
$this->setName('Wechat:SyncUser')
->addOption('account', 0, Option::VALUE_REQUIRED, '賬號(hào)ID.')
->setDescription('同步公眾號(hào)用戶');
}
/**
* 命令
* @return int|null|void
*/
protected function execute(Input $input, Output $output)
{
ini_set('memory_limit', '1024M');
if (!$input->hasOption('account')) {
$output->writeln("請(qǐng)輸入賬號(hào)");
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("從騰訊拉取粉絲");
//從騰訊拉取第一頁(yè)
$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("同步完成");
}
}
求教各位大神有沒(méi)有比較好的方案。麻煩詳細(xì)些,本人不是專(zhuān)業(yè)的程序員,太簡(jiǎn)略了看不懂。謝謝!
在用戶進(jìn)行授權(quán)接入后,進(jìn)行粉絲數(shù)據(jù)同步主要有兩個(gè)部分,一個(gè)歷史粉絲數(shù)據(jù)同步,這個(gè)利用后臺(tái)程序在公眾號(hào)授權(quán)后就可以開(kāi)始同步了,獲取用戶列表接口一次也只能獲取一萬(wàn)個(gè)openid,一個(gè)公眾號(hào)一個(gè)線程也就夠了, 沒(méi)有必要立即跑完,本身微信公眾號(hào)接口就有頻率限制,如果你覺(jué)得速度實(shí)在是慢,也可以開(kāi)幾個(gè)進(jìn)程來(lái)處理。 幾萬(wàn)個(gè)粉絲的公眾號(hào)其實(shí)很快就能跑完了,放在后臺(tái)任務(wù)執(zhí)行也不用人工執(zhí)行。
二是新的粉絲數(shù)據(jù),在關(guān)注和取消關(guān)注事件里面,你可以在事件回調(diào)中處理粉絲數(shù)據(jù),這樣就不用重新拉取所有的粉絲數(shù)據(jù)了。
其實(shí)幾萬(wàn)個(gè)粉絲數(shù)據(jù)很快就處理完了, 我跑過(guò)兩千多萬(wàn)粉絲的數(shù)據(jù),也就幾天,而且接口調(diào)用頻率放的很慢了。
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(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é)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。