V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
AZZERO
V2EX  ›  问与答

吃完午饭的大佬帮我看一眼,这 5 个 PHP 的空怎么填,感谢

  •  
  •   AZZERO · 2019-04-23 12:52:16 +08:00 · 2039 次点击
    这是一个创建于 1801 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天我提了一个问题:

    我现在想实现一个功能,功能是这样的:
    
    用户在关注微信服务号 5 分钟后 ,在服务号里自动再发送一条客服消息给同一个用户,催促他行动
    
    现在有一个 php 库叫 easywechat,当用户在服务号触发各种行为的时候,很容易去实时自动回复,
    
    但我如果想五分钟后回复,是不是用 php 的 sleep 5min 来暂缓执行发送客服消息的命令吗 但这样如果多个用户同时进来,会不会服务器内存爆掉,
    
    还是说要把用户的 openid 存到数据库里,再做,但是这样太复杂了,作为计算机二级代码水平的我来说,有点困难
    

    我看了大家的留言,无奈计算机二级的我 大部分方案对我来说难度略大, 有一位大佬说:“延迟队列吧 beanstalk 延迟 5 分钟然后处理 可以不用存储到数据库” 我照着实现了,但是依然很多地方不会写(标记为绿色的地方)

    所以求一个略懂 Php 的大佬帮忙,感激感激

    Easywechat 文档 https://www.easywechat.com/docs/4.1/official-account/server

    laravel 队列文档 https://learnku.com/docs/laravel/5.5/queues/1324#2d054a


    我用"php artisan make:job SendSecondMessage"命令 建立了一个队列 job 产生了如下代码

    20 条回复    2019-04-24 14:58:35 +08:00
    AZZERO
        1
    AZZERO  
    OP
       2019-04-23 13:14:24 +08:00
    自己顶一下,愿意付费解答也可以,焦头烂额啊..
    AZZERO
        2
    AZZERO  
    OP
       2019-04-23 13:24:39 +08:00
    求个愿意付费解答的大佬
    alex321
        3
    alex321  
       2019-04-23 13:31:34 +08:00   ❤️ 1
    另外写一个方法,查询 5 分钟前 6 分钟内关注的粉丝,发送你要推送的消息,通过计划任务使用 cli 每分钟调用一次。
    zhuzhibin
        4
    zhuzhibin  
       2019-04-23 13:48:33 +08:00
    楼上的办法 每分钟执行一次 可能会重复推送
    zyy314680012
        5
    zyy314680012  
       2019-04-23 13:49:24 +08:00 via Android
    队列
    zhuzhibin
        6
    zhuzhibin  
       2019-04-23 13:53:04 +08:00
    丢 延时任务入队列即可 定义 delay 延迟多久 需要执行什么 传什么参
    AZZERO
        7
    AZZERO  
    OP
       2019-04-23 13:54:23 +08:00
    @alex321 大佬能远程控制把我弄下么,目前就实现了自动回复 Text 的逻辑,现在想回复完,5min 后再次回复一句 Text,不知道传哪个参啊
    AZZERO
        8
    AZZERO  
    OP
       2019-04-23 14:03:48 +08:00
    @zhuzhibin 我 @错了,上一楼应该 @你的
    zhuzhibin
        9
    zhuzhibin  
       2019-04-23 14:08:03 +08:00
    @AZZERO 你要学会 先尝试自己解决问题的... 谷歌一下 https://blog.csdn.net/qq_17403553/article/details/81535780
    wlkq
        10
    wlkq  
       2019-04-23 14:25:42 +08:00
    按我的理解:

    队列:
    use EasyWeChat\Kernel\Messages\Text

    protected $openid;

    public function __construct($SecondMessage,$openid)
    {
    $this->SecondMessage = $SecondMessage;
    $this->openid = $openid;
    }

    public function handle()
    {
    $message2 = new Text($this->$SecondMessage);
    $app = app('wechat.official_account');
    $app->customer_service->message($message2)->to($this->openid)->send();
    }

    调用:
    use App\Jobs\SendSecondMessage

    $job = new SendSecondMessage('第二条消息','用户的 openid');

    $this->dispatch($job->onQueue('队列名字')->delay(Carbon::now()->addMinutes(10)));
    masker
        11
    masker  
       2019-04-23 14:26:45 +08:00 via Android
    培训出来的这么缺乏动手能力?
    AZZERO
        12
    AZZERO  
    OP
       2019-04-23 14:36:14 +08:00
    @masker 这个...我学审计的 , 没学过开发。。倒是想报个培训班
    AZZERO
        13
    AZZERO  
    OP
       2019-04-23 14:36:39 +08:00
    @wlkq 感谢大佬,我有现成服务号,待我试一下
    echoZero
        14
    echoZero  
       2019-04-23 15:47:23 +08:00
    哈哈 昨天留的这句话 延迟队列吧 beanstalk 延迟 5 分钟然后处理 可以不用存储到数据库 没想到被你采用了, 但是可惜的我没有用过 laravel,只是有点了解。
    agdhole
        15
    agdhole  
       2019-04-23 16:12:52 +08:00 via Android
    写了 job 之后要把 job 发给队列,首先要用 artisan 命令启动队列,然后再触发 job
    AZZERO
        16
    AZZERO  
    OP
       2019-04-23 16:42:53 +08:00
    ![]( )
    ![]( )
    @wlkq
    @agdhole
    @echoZero
    我按照 @wlkq 的代码写了,队列可以加入 beanstalk,但是 执行 php artisan queue:work 卡主了。。。
    AZZERO
        17
    AZZERO  
    OP
       2019-04-24 08:59:56 +08:00
    @wlkq
    @agdhole
    @echoZero
    已经搞定 是 beanstalkd 和这个版本的 laravel 不兼容,换 sql 搞定了
    wlkq
        18
    wlkq  
       2019-04-24 09:05:53 +08:00
    @AZZERO #16 这是正常状态,说明队列正在运行,走下代码触发一下 job,看看通不通
    这是文档: https://learnku.com/docs/laravel/5.8/queues/3923。 可以自己找对应的 laravel 版本
    AZZERO
        19
    AZZERO  
    OP
       2019-04-24 11:24:11 +08:00
    @wlkq 大佬 你上面 10 楼的代码我已经跑通了
    不过我又来恬不知耻的问你了...
    就是实现:用户在关注微信服务号 5 分钟后 ,发送一条客服消息,(<--用你 10 楼的代码完美跑通了),然后再过 5 分钟,再发送一条,

    我现在想 第一个队列完了后,再加入一个队列,或者第一次就加入两个队列( 5min 后 和 10min 后)

    我看文档用到 任务链
    ![]( )

    那十楼的代码能如何修改一下么...App\Jobs\SendSecondMessage
    我再新建一个 App\Jobs\SendSecondMessage2 ?
    wlkq
        20
    wlkq  
       2019-04-24 14:58:35 +08:00   ❤️ 1
    @AZZERO 调用的时候:
    $this->dispatch($job->onQueue('队列名字')->delay(Carbon::now()->addMinutes(5)));
    $this->dispatch($job->onQueue('队列名字')->delay(Carbon::now()->addMinutes(10)));
    这条写两次就行了,参数改一下,任务链我没用过,无法建议
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4031 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:59 · PVG 08:59 · LAX 17:59 · JFK 20:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.