大家好,希望大家能帮我分析一下。workerman如何依次间隔10秒把指令发给客户端,指令是变量包括起始指令与结束指令,我如何在timer定时器中灵活运用变量。举例说明,我这有5个指令, 分别是 0001,0002,0003,0004,0005我打算把这五个指令依次间隔10秒发给客户端,我把定时器写for循环里面,所有指令会同一时间发给客户端,会造成丢数据和叠包,这不是我想要的。我用到了sleep,但是这也不是我想要的。我该怎么做比较好呀?或者大家有没有别的好办法呀?
几个定时器就搞定了啊
Timer::add(10, function() use ($connection) { $connection->send('0001'); }, [], false); Timer::add(20, function() use ($connection) { $connection->send('0002'); }, [], false); Timer::add(30, function() use ($connection) { $connection->send('0003'); }, [], false); Timer::add(40, function() use ($connection) { $connection->send('0004'); }, [], false); Timer::add(50, function() use ($connection) { $connection->send('0005'); }, [], false);
大佬,您好,事情是这么回事,但我如何不用for循环,依次找出这几个变量呀?我只知道起始变量0001,结束变量0005,另外三个变量是每次递增1得到的呀。
上面就是没用for循环啊
大佬您好:但是我的指令数是不固定的 ,有可能是5位,有可能7位,有可能是不同的两位数,我不可能每次都写死指令吧。目前有三个变量,就是$length=5,$start=0001,$end=0005,0001到0005依次递增1,直到$end==0005,最后一次发送。
for($i=1;$i<=5;$i++) { Timer::add(10*$i, function() use ($connection, $i) { $connection->send('000' . $i); }, [], false); }
大佬您好,只要用for循环就会同时发给客户端的。我想到了用引用变量的方式,正在尝试, 希望在send函数中能递增1,当等于0005后,停止调用。 不知道大佬在引用变量方便有啥好的建议。【抱拳】
class Mail { // 注意,回调函数属性必须是public public function send($to, $content) { echo "send mail ...\n"; } }
$task = new Worker(); $task->onWorkerStart = function($task) { // 10秒后发送一次邮件 $mail = new Mail(); $to = 'workerman@workerman.net'; $content = 'hello workerman'; Timer::add(10, array($mail, 'send'), array($to, $content), false); }; // 运行worker Worker::runAll();
上面的for循环代码不会同时发送。
大佬您好 您的时间不是同时发送,但是用for的话,会把指令同时输出的呀
我for代码里没有输出,只有发送
哦哦 我试一试 呀 感激大佬【抱拳】
大佬 您的方案 我试过了 可是依然不行呀 我只能发送一个指令给客户端后,收到客户端返回的消息并把客户端返回的消息存入数据库,存入成功后再发下一条指令啦,依次发到0005,然后停止发送。关于我这个新想法,大佬有啥建议吗?
你这逻辑咋又变了,业务逻辑自己想吧,没时间一点一点教你
好的 好的 谢谢大佬
几个定时器就搞定了啊
大佬,您好,事情是这么回事,但我如何不用for循环,依次找出这几个变量呀?我只知道起始变量0001,结束变量0005,另外三个变量是每次递增1得到的呀。
上面就是没用for循环啊
大佬您好:但是我的指令数是不固定的 ,有可能是5位,有可能7位,有可能是不同的两位数,我不可能每次都写死指令吧。目前有三个变量,就是$length=5,$start=0001,$end=0005,0001到0005依次递增1,直到$end==0005,最后一次发送。
for($i=1;$i<=5;$i++) {
Timer::add(10*$i, function() use ($connection, $i) {
$connection->send('000' . $i);
}, [], false);
}
大佬您好,只要用for循环就会同时发给客户端的。我想到了用引用变量的方式,正在尝试, 希望在send函数中能递增1,当等于0005后,停止调用。 不知道大佬在引用变量方便有啥好的建议。【抱拳】
class Mail
{
// 注意,回调函数属性必须是public
public function send($to, $content)
{
echo "send mail ...\n";
}
}
$task = new Worker();
$task->onWorkerStart = function($task)
{
// 10秒后发送一次邮件
$mail = new Mail();
$to = 'workerman@workerman.net';
$content = 'hello workerman';
Timer::add(10, array($mail, 'send'), array($to, $content), false);
};
// 运行worker
Worker::runAll();
上面的for循环代码不会同时发送。
大佬您好 您的时间不是同时发送,但是用for的话,会把指令同时输出的呀
我for代码里没有输出,只有发送
哦哦 我试一试 呀 感激大佬【抱拳】
大佬 您的方案 我试过了 可是依然不行呀 我只能发送一个指令给客户端后,收到客户端返回的消息并把客户端返回的消息存入数据库,存入成功后再发下一条指令啦,依次发到0005,然后停止发送。关于我这个新想法,大佬有啥建议吗?
你这逻辑咋又变了,业务逻辑自己想吧,没时间一点一点教你
好的 好的 谢谢大佬