账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    公众号有几十万粉丝,如何在对接的时候快速同步到本地数据库进行运营
    27
    0

    我使用EasyWechat尝试开发了一个第三方平台,然后会帮助本地商户或公众号运营一些活动,如何在公众号授权对接后快速的将公众号粉丝数据同步到本地数据库方便运营?我先前的想法是用户有交互的时候再触发同步,目前是使用的手动方式和命令行方式,手动方式如下:

    /**
         * 同步
         */
        public function sync()
        {
            $account = $this->request->param('account', 0, 'intval');
            $account = AccountService::getDataById($account);
            if (empty($account)) {
                $this->error('参数错误');
            }
            //页码
            $page = $this->request->param('page', 0, 'intval');
            $page_size = 50;
            //微信实例
            $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);
                    }
                }
                //设置缓存
                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.'出错<br/>';
                    continue;
                }
            }
            //删除缓存
            cache('wechat_fans_'.$account->id, null);
            return $this->success('同步完成', url($this->request->controller().'/index', ['account' => $account->id]));
        }

    这种使用分页同步在浏览器执行的方式速度非常慢,大约几万粉丝都要跑很久,然后跟这个类似的我写了一个命令行方式,执行也很慢。

    <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()
        {
            //设置命令名称及描述
            $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("参数错误");
                exit;
            }
            //微信实例
            $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);
                    }
                }
                //设置缓存
                cache('wechat_fans_'.$account->id, $fans);
            }
            foreach ($fans as $k => $v) {
                try {
                    UserService::syncDataByServer($account, $v);
                } catch (\Exception $e) {
                    $output->writeln("同步{$k}出错");
                    continue;
                }
            }
            //删除缓存
            cache('wechat_fans_'.$account->id, null);
            $output->writeln("同步完成");
        }
    }

    求教各位大神有没有比较好的方案。麻烦详细些,本人不是专业的程序员,太简略了看不懂。谢谢!

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 俄爱你ㄟ 普通会员 1楼

      在对接公众号时,需要确保数据的同步性,可以使用关系型数据库,如MySQL、Oracle等。以下是一些基本步骤:

      1. 数据库迁移:首先,你需要将公众号的数据迁移到数据库中。这通常涉及到创建数据库表,然后将公众号的相关信息(如文章、图片、用户等)写入到相应的表中。

      2. 数据类型转换:在将数据迁移到数据库之前,需要将公众号的相关数据类型转换为数据库支持的数据类型。这可能涉及到对公众号文章、图片、用户等字段的类型进行转换。

      3. 数据验证:在将数据迁移到数据库之前,需要进行数据验证,确保数据的完整性、一致性、准确性和一致性。这可以通过设置SQL查询条件、编写数据验证脚本来实现。

      4. 数据同步:在将数据迁移到数据库之后,可以使用SQL语句进行数据同步。这通常涉及到创建一个触发器,当公众号的数据发生变化时,触发器会自动将数据同步到本地数据库中。

      5. 数据更新:在数据同步完成之后,可以使用SQL语句对本地数据库中的数据进行更新,以确保数据的实时性和准确性。

      以上是一些基本的步骤,具体的实现方式可能需要根据你的数据库系统和公众号的具体情况进行调整。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部