国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

報(bào)告bug:php8中workerman遇到異常會(huì)卡死不能重新fork一個(gè)子進(jìn)程

dignfei

代碼:

global $worker;
$worker = new Worker();
Worker::$pidFile = '/dev/shm/jmworker.pid';
$worker->onWorkerStart = function(){
    global $worker,$sec;
    $sec = 0.5;
    \Workerman\Lib\Timer::add($sec, function (){
        echo '333333333333333';
        //exit();
        1/0;
    },true);
};
// 運(yùn)行worker
Worker::runAll();

遇到異常就會(huì)卡死不會(huì)退出進(jìn)程,也不會(huì)重新fork一個(gè)子進(jìn)程。執(zhí)行exit()也不會(huì)、
比如數(shù)據(jù)庫(kù)暫時(shí)無(wú)法連接,出現(xiàn)異常,就會(huì)導(dǎo)致子進(jìn)程卡死不會(huì)退出,也不會(huì)重新fork一個(gè)子進(jìn)程。

-------------------------------------- WORKERMAN --------------------------------------
Workerman version:4.0.19          PHP version:8.0.8
--------------------------------------- WORKERS ---------------------------------------
proto   user            worker           listen          processes    status
tcp     root            jmworker_main    none            1             [OK]
---------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
333333333333333DivisionByZeroError: Division by zero in /var/www/html/public/1.php:28
Stack trace:
#0 /var/www/html/vendor/workerman/workerman/Events/Event.php(167): {closure}(true)
#1 [internal function]: Workerman\Events\Event->timerCallback(-1, 1, Array)
#2 /var/www/html/vendor/workerman/workerman/Events/Event.php(195): EventBase->loop()
#3 /var/www/html/vendor/workerman/workerman/Worker.php(2430): Workerman\Events\Event->loop()
#4 /var/www/html/vendor/workerman/workerman/Worker.php(1554): Workerman\Worker->run()
#5 /var/www/html/vendor/workerman/workerman/Worker.php(1384): Workerman\Worker::forkOneWorkerForLinux(Object(Workerman\Worker))
#6 /var/www/html/vendor/workerman/workerman/Worker.php(1358): Workerman\Worker::forkWorkersForLinux()
#7 /var/www/html/vendor/workerman/workerman/Worker.php(542): Workerman\Worker::forkWorkers()
#8 /var/www/html/public/1.php(33): Workerman\Worker::runAll()
#9 {main}

Warning: EventBase::loop(): Failed to invoke event callback in /var/www/html/vendor/workerman/workerman/Events/Event.php on line 195

Warning: EventBase::loop(): Failed to invoke event callback in /var/www/html/vendor/workerman/workerman/Events/Event.php on line 195

Warning: EventBase::loop(): Failed to invoke event callback in /var/www/html/vendor/workerman/workerman/Events/Event.php on line 195
4574 4 0
4個(gè)回答

six

event擴(kuò)展不是穩(wěn)定版本?

  • dignfei 2021-08-29

    3.0.5穩(wěn)定版
    root@33e87e5e5ce1:/var/www/html# php --ri event

    event

    Event support => enabled
    Sockets support => disabled
    Debug support => disabled
    Extra functionality support including HTTP, DNS, and RPC => enabled
    OpenSSL support => disabled
    Thread safety support => disabled
    Extension version => 3.0.5
    libevent2 headers version => 2.1.11-stable
    root@33e87e5e5ce1:/var/www/html#

  • dignfei 2021-08-29

    你試了嗎,運(yùn)行一下那段代碼,會(huì)不會(huì)卡死無(wú)法自動(dòng)重啟子進(jìn)程?

dignfei

有沒有大佬解答一下

  • MarkGo 2021-09-03

    看看php編譯參數(shù)是不是有sigchild

  • dignfei 2021-09-05

    @2024: 使用的docker官方php鏡像: docker pull php:8.0.10-fpm ,怎么看編譯參數(shù)是不是有sigchild?

  • dignfei 2021-09-05

    @2024:你運(yùn)行上面這段代碼會(huì)不會(huì)報(bào)錯(cuò)?

  • MarkGo 2021-09-07

    @6279:我沒使用workman,我是用webman,php8/php7 只要編譯參數(shù)里包含了sigchild的話就會(huì)出現(xiàn)異常,php官方有人提bug了,你可以看看php -i|grep configure

  • dignfei 2021-09-08

    root@33e87e5e5ce1:/var/www/html# php -i|grep configure
    Configure Command => './configure' '--build=x86_64-linux-gnu' '--with-config-file-path=/usr/local/etc/php' '--with-config-file-scan-dir=/usr/local/etc/php/conf.d' '--enable-option-checking=fatal' '--with-mhash' '--with-pic' '--enable-ftp' '--enable-mbstring' '--enable-mysqlnd' '--with-password-argon2' '--with-sodium=shared' '--with-pdo-sqlite=/usr' '--with-sqlite3=/usr' '--with-curl' '--with-openssl' '--with-readline' '--with-zlib' '--with-pear' '--with-libdir=lib/x86_64-linux-gnu' '--enable-fpm' '--with-fpm-user=www-data' '--with-fpm-group=www-data' '--disable-cgi' 'build_alias=x86_64-linux-gnu'
    大佬,麻煩看一下包含了sigchild嗎

JustForFun

你代碼有致命錯(cuò)誤,退出才是正常行為。workerman 在你進(jìn)程出現(xiàn)致命錯(cuò)誤之后就會(huì)重新 fork 一個(gè)進(jìn)程的,但是你的致命錯(cuò)誤又沒有合理地處理,就會(huì)重復(fù)以上步驟。

  • dignfei 2021-09-08

    對(duì)啊,遇到錯(cuò)誤之后應(yīng)該重新fork一個(gè)進(jìn)程,但是我貼出來的代碼不會(huì)重新fork一個(gè)進(jìn)程。你測(cè)試了代碼嗎

  • JustForFun 2021-09-08

    @6279:當(dāng)然試過。每次 ps 查到的子進(jìn)程id都不一樣了

  • JustForFun 2021-09-08

    @6279:補(bǔ)充一下。我用的是 React EventLoop,你可能用的是 event。剛剛對(duì)比了一下,react 的 eventloop 的 add 方法,臨時(shí)想到了兩個(gè)解決方法。
    一、修改 Events/EventInterface.php 中的 add 方法修改為 public function add($fd, $flag, $func, array $args = []); 再將 Events/Event.php 中的 add 方法簽名修改為 public function add($fd, $flag, $func, array $args = []);
    二、自己在你的定時(shí)器中加上 try {} catch (Throwable $e) { echo $e->getMessage(), "\n"; },注意php7之后才可以 catch 錯(cuò)誤,跟異常不一樣的;

  • JustForFun 2021-09-08

    @6279:還是用 try catch 吧,另外一個(gè)不行

  • 法師 2021-09-10

    看起來是event擴(kuò)展的bug,估計(jì)event擴(kuò)展在php8下還沒完善

  • dignfei 2021-09-13

    @7304: 牛逼,你是修改了workerman的源代碼替換成React EventLoop嗎?

MarkGo

我剛測(cè)試了,
同樣配置下,
php7 + event + libevent2 表現(xiàn)正常。
php8 + event + libevent2 表現(xiàn)異常。
其中event和libevent2 是 相同版本的。
而且問題只有在Timer裡才會(huì)發(fā)生,
我是在FileMonitor裡,
實(shí)例化時(shí)添加1/0;
這時(shí)候php7/8 都會(huì)自動(dòng)重啟。
如果在實(shí)例化添加Timer::add.....,
php7 會(huì)重啟,
php8 會(huì)一直報(bào)錯(cuò)Failed to invoke event callback。

補(bǔ)充下:
opcache開啟關(guān)閉都試過,結(jié)果一樣。
event

Event support => enabled
Sockets support => enabled
Debug support => disabled
Extra functionality support including HTTP, DNS, and RPC => enabled
OpenSSL support => disabled
Thread safety support => disabled
Extension version => 3.0.5
libevent2 headers version => 2.1.8-stable

如果使用select模型不會(huì)出錯(cuò),只有event的timer才會(huì)異常,
感覺是event的問題。

還是使用php7.4,有高版本要求的就把event轉(zhuǎn)為select模型吧。

  • 法師 2021-09-10

    看起來是event擴(kuò)展的bug,估計(jì)event擴(kuò)展在php8下還沒完善

  • dignfei 2021-09-13

    大佬牛逼,swoole不用event擴(kuò)展也會(huì)這樣,不知道是不是php8的bug

年代過于久遠(yuǎn),無(wú)法發(fā)表回答
??