代碼:
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
event擴(kuò)展不是穩(wěn)定版本?
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#
有沒有大佬解答一下
@6279:我沒使用workman,我是用webman,php8/php7 只要編譯參數(shù)里包含了sigchild的話就會(huì)出現(xiàn)異常,php官方有人提bug了,你可以看看php -i|grep configure
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嗎
你代碼有致命錯(cuò)誤,退出才是正常行為。workerman 在你進(jìn)程出現(xiàn)致命錯(cuò)誤之后就會(huì)重新 fork 一個(gè)進(jìn)程的,但是你的致命錯(cuò)誤又沒有合理地處理,就會(huì)重復(fù)以上步驟。
對(duì)啊,遇到錯(cuò)誤之后應(yīng)該重新fork一個(gè)進(jìn)程,但是我貼出來的代碼不會(huì)重新fork一個(gè)進(jìn)程。你測(cè)試了代碼嗎
@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ò)誤,跟異常不一樣的;
我剛測(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模型吧。