吃完午饭的大佬帮我看一眼,这 5 个 PHP 的空怎么填,感谢 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AZZERO
V2EX    问与答

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

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

    昨天我提了一个问题:

    我现在想实现一个功能,功能是这样的: 用户在关注微信服务号 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     Solana     1033 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 23:35 PVG 07:35 LAX 15:35 JFK 18:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86