webman框架下,在new Crontab的回调函数里能发送成功数据,但fread接收不到结果。

WatcherLuo

代码如下:
new Crontab('1 *', function(){
// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);
});

通过日志分析调用fwrite能成功发送数据,在127.0.0.1服务端onMessage回调里也能正常接收到数据,调用$connection->send("hello\n");的返回值为true,那表示数据已经成功写入到该连接的操作系统层的socket发送缓冲区,但fread接收不到结果。在控制器里调用fwrite后fread是能正常接收到结果。不知道什么原因,求解。

834 2 0
2个回答

phpcreeper

直观上看参数 1 * 格式应该是错误的,所以示例的定时器理论上说压根儿应该就没有启动或者说会被拦截抛异常什么的,但是标题中却描述 new Crontab的回调函数里能发送成功数据,先不说回调函数本身的逻辑吧,这个你确定回调函数已经成功被触发执行了?

  • WatcherLuo 2022-08-10

    这算是一份伪代码,删除了一些读取数据库的逻辑,定时规则是读数据库配置的。可以把1 替换成/5 *,定时器是执行了的,已经有打印出日志。

  • WatcherLuo 2022-08-10

    评论文本框发不了,会替换掉,定时规则是没问题,定时器有执行

  • phpcreeper 2022-08-10

    关于你所描述的格式我这里均不支持,不清楚是不是Crontab库版本的原因,依据手册格式好解决,那就进一步看:示例中的回调代码逻辑看上去也没有什么大问题,粗暴自测也未见异常,不过仍有几处地方需要注意,调整下试试看吧:
    1、stream_socket_client的第4个参数看你设定的连接超时是1秒,这个感觉太小了,可以调整为5秒试试看;
    2、stream_set_blocking($client, 1);
    3、记得末尾调用fclose($client);

ichynul

好像是文件操作有缓存

  • 暂无评论
年代过于久远,无法发表回答
×
🔝