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

2019-04-23 12:52:16 +08:00
 AZZERO

昨天我提了一个问题:

我现在想实现一个功能,功能是这样的:

用户在关注微信服务号 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 产生了如下代码

2068 次点击
所在节点    问与答
20 条回复
AZZERO
2019-04-23 13:14:24 +08:00
自己顶一下,愿意付费解答也可以,焦头烂额啊..
AZZERO
2019-04-23 13:24:39 +08:00
求个愿意付费解答的大佬
alex321
2019-04-23 13:31:34 +08:00
另外写一个方法,查询 5 分钟前 6 分钟内关注的粉丝,发送你要推送的消息,通过计划任务使用 cli 每分钟调用一次。
zhuzhibin
2019-04-23 13:48:33 +08:00
楼上的办法 每分钟执行一次 可能会重复推送
zyy314680012
2019-04-23 13:49:24 +08:00
队列
zhuzhibin
2019-04-23 13:53:04 +08:00
丢 延时任务入队列即可 定义 delay 延迟多久 需要执行什么 传什么参
AZZERO
2019-04-23 13:54:23 +08:00
@alex321 大佬能远程控制把我弄下么,目前就实现了自动回复 Text 的逻辑,现在想回复完,5min 后再次回复一句 Text,不知道传哪个参啊
AZZERO
2019-04-23 14:03:48 +08:00
@zhuzhibin 我 @错了,上一楼应该 @你的
zhuzhibin
2019-04-23 14:08:03 +08:00
@AZZERO 你要学会 先尝试自己解决问题的... 谷歌一下 https://blog.csdn.net/qq_17403553/article/details/81535780
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
2019-04-23 14:26:45 +08:00
培训出来的这么缺乏动手能力?
AZZERO
2019-04-23 14:36:14 +08:00
@masker 这个...我学审计的 , 没学过开发。。倒是想报个培训班
AZZERO
2019-04-23 14:36:39 +08:00
@wlkq 感谢大佬,我有现成服务号,待我试一下
echoZero
2019-04-23 15:47:23 +08:00
哈哈 昨天留的这句话 延迟队列吧 beanstalk 延迟 5 分钟然后处理 可以不用存储到数据库 没想到被你采用了, 但是可惜的我没有用过 laravel,只是有点了解。
agdhole
2019-04-23 16:12:52 +08:00
写了 job 之后要把 job 发给队列,首先要用 artisan 命令启动队列,然后再触发 job
AZZERO
2019-04-23 16:42:53 +08:00
![]( )
![]( )
@wlkq
@agdhole
@echoZero
我按照 @wlkq 的代码写了,队列可以加入 beanstalk,但是 执行 php artisan queue:work 卡主了。。。
AZZERO
2019-04-24 08:59:56 +08:00
@wlkq
@agdhole
@echoZero
已经搞定 是 beanstalkd 和这个版本的 laravel 不兼容,换 sql 搞定了
wlkq
2019-04-24 09:05:53 +08:00
@AZZERO #16 这是正常状态,说明队列正在运行,走下代码触发一下 job,看看通不通
这是文档: https://learnku.com/docs/laravel/5.8/queues/3923。 可以自己找对应的 laravel 版本
AZZERO
2019-04-24 11:24:11 +08:00
@wlkq 大佬 你上面 10 楼的代码我已经跑通了
不过我又来恬不知耻的问你了...
就是实现:用户在关注微信服务号 5 分钟后 ,发送一条客服消息,(<--用你 10 楼的代码完美跑通了),然后再过 5 分钟,再发送一条,

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

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

那十楼的代码能如何修改一下么...App\Jobs\SendSecondMessage
我再新建一个 App\Jobs\SendSecondMessage2 ?
wlkq
2019-04-24 14:58:35 +08:00
@AZZERO 调用的时候:
$this->dispatch($job->onQueue('队列名字')->delay(Carbon::now()->addMinutes(5)));
$this->dispatch($job->onQueue('队列名字')->delay(Carbon::now()->addMinutes(10)));
这条写两次就行了,参数改一下,任务链我没用过,无法建议

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/557861

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX