有个很奇怪的问,使用TCP Connection,在连接到来、收到消息的处理程序中,使用preg_match会导致子进程终止?

gutianlong
/**
 * 当客户端与Workerman建立连接时(TCP三次握手完成后)触发的回调函数。
 * 每个连接只会触发一次onConnect回调。
 *
 * @param \Workerman\Connection\TcpConnection $connection
 */
public function onClientConnected($connection)
{
    $v = '99901807';
    try
    {
        $a = preg_match('/^login:(\w{3,20})/i', $v);
        var_dump($a);
    }
    catch (Throwable $e)
    {
        print_r($e);
    }

}

PS:在不启动workerman的时候,上面跟 preg_match 有关的代码是没有报任何问题的。

下面是运行时输出信息截图:

workerman的日志:
2019-12-20 10:39:38 pid:5515 Workerman[server.php] restart
2019-12-20 10:39:38 pid:5515 Workerman[server.php] is stopping ...
2019-12-20 10:39:38 pid:5515 Workerman[server.php] stop success
2019-12-20 10:39:44 pid:5515 Workerman[server.php] stopping ...
2019-12-20 10:39:46 pid:5515 worker[TCP Server:5517] exit with status 9
2019-12-20 10:39:46 pid:5515 worker[ChannelServer:5516] exit with status 9
2019-12-20 10:39:46 pid:5515 Workerman[server.php] has been stopped
2019-12-20 10:39:50 pid:5520 Workerman[server.php] start in DEBUG mode
2019-12-20 10:40:03 pid:5520 worker[TCP Server:5522] exit with status 11

没有任何错误信息,正因为如此,才感觉莫名其妙

PS: 刚刚测试,在Linux服务器上运行没有问题,但以上问题是在Mac Book Pro的终端里运行的,基于Mac OS 10.14.6

Mac OS 的PHP版本:
PHP 7.3.4 (cli) (built: Apr 19 2019 00:20:56) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.4, Copyright (c) 1998-2018 Zend Technologies
with Xdebug v2.7.0, Copyright (c) 2002-2019, by Derick Rethans
with Zend OPcache v7.3.4, Copyright (c) 1999-2018, by Zend Technologies

Linux 的 PHP 版本:
PHP 7.2.6 (cli) (built: Mar 12 2019 19:08:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

1665 2 0
2个回答

blogdaren

1、具体报错信息是什么?你是依据什么判定preg_match导致进程终止的? 最好把这些信息都贴出来。
2、不管怎么样,导致进程终止有个普遍的原因就是: 程序抛出了尚未捕获的异常。

  • 暂无评论
walkor

php 7.3的bug导致的。目前看php7.3 的jit功能还不稳定。
像这样把jit关闭就好了。

ini_set('pcre.jit', 0);
  • 暂无评论
年代过于久远,无法发表回答
🔝