stream_socket_client创建链接的问题(可能和异步有关)

zhanchen

截图
上面是代码

出现问题的场景是订单支付成功后,微信发送支付成功的异步回调
这时在回调中建立一个套接字来告诉server需要发送数据了

服务开启的状态这个流程没有任何问题了

但是如果把服务关闭,stream_socket_client是会连接失败的
此时的业务逻辑是如果stream_socket_client建立失败需要退款
但是stream_socket_client建立失败时没有再继续执行了(类似阻塞的感觉),不知道是否和stream_socket_client在异步时timeout参数失效导致的.

如果是这样的话那异步的stream_socket_client有什么其他的好办法来实现连接失败的判断

截图

1983 5 0
5个回答

zhanchen

补充一下,stream_socket_client连接失败然后退款的逻辑我在使用postman进行模拟测试时是正常的,可以走通的,就是在微信异步回调中无法执行stream_socket_client失败后的操作

  • 暂无评论
JustForFun

确定两个都能跑到这个函数?记录日志,看看 $client, $errno, $errmsg 的区别。

  • zhanchen 2020-08-28

    日志里面显示都执行了,微信回调的stream_socket_client后一排就没有执行了

  • JustForFun 2020-08-28

    @7234:日志和代码倒是放出来吖。。。就放这点东西怎么解决问题

  • zhanchen 2020-08-28

    @7304:日志截图在下面,stream_socket_client就这一个日志,两种方式都是一样的记录

  • JustForFun 2020-08-28

    @7234:这个日志就是经过格式化的:
    $err = <<<ERR
    [{$errno}]{$errstr}[{$errfile}:$errline]
    ERR;

zhanchen

截图

  • 暂无评论
静默

你代码写的stream_socket_client建立失败就return false了,就不会执行之后的代码了

  • zhanchen 2020-08-28

    现在问题就是微信回调执行的没有执行到return这一行来

  • 静默 2020-08-28

    不可能,除非你实际用的stream_socket_client的参数和你上面问题贴的参数不一样,比如用了STREAM_CLIENT_CONNECT。

  • zhanchen 2020-08-28

    @3236:我下面放了代码,你看下吧

  • zhanchen 2020-08-28

    @3236:并且我问题下面写了补充,postman模拟的就可以执行到return false.微信回调的就不可以执行到return false.问题不在代码上.两种方式执行,一种可以一种不可以,微信回调不可以,postman请求可以

zhanchen

截图

测试18行执行了,21行日志显示执行了,23行没有执行

  • 静默 2020-08-28

    try {
    $client = stream_socket_client(...);
    } catch (\Exception $e) {
    file_put_contents($logname, $e->getMessage(), FILE_APPEND)
    }
    if (!$client) {
    return false;
    }

    可能是你框架设置了发生错误抛异常,你试下捕获异常

  • zhanchen 2020-08-28

    @3236:加了try catch成功了,老哥稳

年代过于久远,无法发表回答
🔝