walkor / GatewayWorker

Distributed realtime messaging framework based on workerman.
MIT License
1.01k stars 292 forks source link

能否添加对docker的支持 #72

Closed dmanbu closed 3 years ago

dmanbu commented 3 years ago

我在虚拟机环境下,启动gatewayworker的demo,没问题 但在docker下,启动 start_businessworker.php 时,却会报错,docker和虚拟机环境安装的依赖是一模一样的,错误如下:

Workerman[start_businessworker.php] start in DEBUG mode
-------------------------------------- WORKERMAN ---------------------------------------
Workerman version:4.0.7          PHP version:7.2.33
--------------------------------------- WORKERS ----------------------------------------
proto   user            worker            listen          processes    status           
tcp     root            businessWorker    none            10            [OK]            
----------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
Error: Call to a member function add() on integer in /opt/imserver/vendor/workerman/workerman/Timer.php:117
Stack trace:
#0 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(229): Workerman\Timer::add(1, Array, Array, false)
#1 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(309): Workerman\Connection\AsyncTcpConnection->reconnect(1)
#2 /opt/imserver/vendor/workerman/workerman/Connection/TcpConnection.php(954): GatewayWorker\BusinessWorker->GatewayWorker\{closure}(Object(Workerman\Connection\AsyncTcpConnection))
#3 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(370): Workerman\Connection\TcpConnection->destroy()
#4 [internal function]: Workerman\Connection\AsyncTcpConnection->checkConnection(Resource id #33, 4, NULL)
#5 /opt/imserver/vendor/workerman/workerman/Events/Libevent.php(202): event_base_loop(Resource id #21)
#6 /opt/imserver/vendor/workerman/workerman/Worker.php(2416): Workerman\Events\Libevent->loop()
#7 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(197): Workerman\Worker->run()
#8 /opt/imserver/vendor/workerman/workerman/Worker.php(1541): GatewayWorker\BusinessWorker->run()
#9 /opt/imserver/vendor/workerman/workerman/Worker.php(1371): Workerman\Worker::forkOneWorkerForLinux(Object(GatewayWorker\BusinessWorker))
#10 /opt/imserver/vendor/workerman/workerman/Worker.php(1345): Workerman\Worker::forkWorkersForLinux()
#11 /opt/imserver/vendor/workerman/workerman/Worker.php(546): Workerman\Worker::forkWorkers()
#12 /opt/imserver/Applications/IM/start_businessworker.php(35): Workerman\Worker::runAll()
#13 {main}
Worker[51] process terminated
Error: Call to a member function add() on integer in /opt/imserver/vendor/workerman/workerman/Timer.php:117
Stack trace:
#0 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(229): Workerman\Timer::add(1, Array, Array, false)
#1 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(309): Workerman\Connection\AsyncTcpConnection->reconnect(1)
#2 /opt/imserver/vendor/workerman/workerman/Connection/TcpConnection.php(954): GatewayWorker\BusinessWorker->GatewayWorker\{closure}(Object(Workerman\Connection\AsyncTcpConnection))
#3 /opt/imserver/vendor/workerman/workerman/Connection/TcpConnection.php(602): Workerman\Connection\TcpConnection->destroy()
#4 [internal function]: Workerman\Connection\TcpConnection->baseRead(Resource id #33, 2, NULL)
#5 /opt/imserver/vendor/workerman/workerman/Events/Libevent.php(202): event_base_loop(Resource id #21)
#6 /opt/imserver/vendor/workerman/workerman/Worker.php(2416): Workerman\Events\Libevent->loop()
#7 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(197): Workerman\Worker->run()
#8 /opt/imserver/vendor/workerman/workerman/Worker.php(1541): GatewayWorker\BusinessWorker->run()
#9 /opt/imserver/vendor/workerman/workerman/Worker.php(1371): Workerman\Worker::forkOneWorkerForLinux(Object(GatewayWorker\BusinessWorker))
#10 /opt/imserver/vendor/workerman/workerman/Worker.php(1345): Workerman\Worker::forkWorkersForLinux()
#11 /opt/imserver/vendor/workerman/workerman/Worker.php(546): Workerman\Worker::forkWorkers()
#12 /opt/imserver/Applications/IM/start_businessworker.php(35): Workerman\Worker::runAll()
#13 {main}
Worker[44] process terminated
Error: Call to a member function add() on integer in /opt/imserver/vendor/workerman/workerman/Timer.php:117
Stack trace:
#0 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(229): Workerman\Timer::add(1, Array, Array, false)
#1 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(309): Workerman\Connection\AsyncTcpConnection->reconnect(1)
#2 /opt/imserver/vendor/workerman/workerman/Connection/TcpConnection.php(954): GatewayWorker\BusinessWorker->GatewayWorker\{closure}(Object(Workerman\Connection\AsyncTcpConnection))
#3 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(370): Workerman\Connection\TcpConnection->destroy()
#4 [internal function]: Workerman\Connection\AsyncTcpConnection->checkConnection(Resource id #33, 4, NULL)
#5 /opt/imserver/vendor/workerman/workerman/Events/Libevent.php(202): event_base_loop(Resource id #21)
#6 /opt/imserver/vendor/workerman/workerman/Worker.php(2416): Workerman\Events\Libevent->loop()
#7 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(197): Workerman\Worker->run()
#8 /opt/imserver/vendor/workerman/workerman/Worker.php(1541): GatewayWorker\BusinessWorker->run()
#9 /opt/imserver/vendor/workerman/workerman/Worker.php(1371): Workerman\Worker::forkOneWorkerForLinux(Object(GatewayWorker\BusinessWorker))
#10 /opt/imserver/vendor/workerman/workerman/Worker.php(1345): Workerman\Worker::forkWorkersForLinux()
#11 /opt/imserver/vendor/workerman/workerman/Worker.php(546): Workerman\Worker::forkWorkers()
#12 /opt/imserver/Applications/IM/start_businessworker.php(35): Workerman\Worker::runAll()
#13 {main}
Error: Call to a member function add() on integer in /opt/imserver/vendor/workerman/workerman/Timer.php:117
Stack trace:
#0 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(229): Workerman\Timer::add(1, Array, Array, false)
#1 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(309): Workerman\Connection\AsyncTcpConnection->reconnect(1)
#2 /opt/imserver/vendor/workerman/workerman/Connection/TcpConnection.php(954): GatewayWorker\BusinessWorker->GatewayWorker\{closure}(Object(Workerman\Connection\AsyncTcpConnection))
#3 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(370): Workerman\Connection\TcpConnection->destroy()
#4 [internal function]: Workerman\Connection\AsyncTcpConnection->checkConnection(Resource id #33, 4, NULL)
#5 /opt/imserver/vendor/workerman/workerman/Events/Libevent.php(202): event_base_loop(Resource id #21)
#6 /opt/imserver/vendor/workerman/workerman/Worker.php(2416): Workerman\Events\Libevent->loop()
#7 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(197): Workerman\Worker->run()
#8 /opt/imserver/vendor/workerman/workerman/Worker.php(1541): GatewayWorker\BusinessWorker->run()
#9 /opt/imserver/vendor/workerman/workerman/Worker.php(1371): Workerman\Worker::forkOneWorkerForLinux(Object(GatewayWorker\BusinessWorker))
#10 /opt/imserver/vendor/workerman/workerman/Worker.php(1345): Workerman\Worker::forkWorkersForLinux()
#11 /opt/imserver/vendor/workerman/workerman/Worker.php(546): Workerman\Worker::forkWorkers()
#12 /opt/imserver/Applications/IM/start_businessworker.php(35): Workerman\Worker::runAll()
#13 {main}
Worker[50] process terminated
worker[businessWorker:51] exit with status 64000
Error: Call to a member function add() on integer in /opt/imserver/vendor/workerman/workerman/Timer.php:117
Stack trace:
#0 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(229): Workerman\Timer::add(1, Array, Array, false)
#1 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(309): Workerman\Connection\AsyncTcpConnection->reconnect(1)
#2 /opt/imserver/vendor/workerman/workerman/Connection/TcpConnection.php(954): GatewayWorker\BusinessWorker->GatewayWorker\{closure}(Object(Workerman\Connection\AsyncTcpConnection))
#3 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(370): Workerman\Connection\TcpConnection->destroy()
#4 [internal function]: Workerman\Connection\AsyncTcpConnection->checkConnection(Resource id #33, 4, NULL)
#5 /opt/imserver/vendor/workerman/workerman/Events/Libevent.php(202): event_base_loop(Resource id #21)
#6 /opt/imserver/vendor/workerman/workerman/Worker.php(2416): Workerman\Events\Libevent->loop()
#7 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(197): Workerman\Worker->run()
#8 /opt/imserver/vendor/workerman/workerman/Worker.php(1541): GatewayWorker\BusinessWorker->run()
#9 /opt/imserver/vendor/workerman/workerman/Worker.php(1371): Workerman\Worker::forkOneWorkerForLinux(Object(GatewayWorker\BusinessWorker))
#10 /opt/imserver/vendor/workerman/workerman/Worker.php(1345): Workerman\Worker::forkWorkersForLinux()
#11 /opt/imserver/vendor/workerman/workerman/Worker.php(546): Workerman\Worker::forkWorkers()
#12 /opt/imserver/Applications/IM/start_businessworker.php(35): Workerman\Worker::runAll()
#13 {main}
Worker[49] process terminated
worker[businessWorker:44] exit with status 64000
Error: Call to a member function add() on integer in /opt/imserver/vendor/workerman/workerman/Timer.php:117
Stack trace:
#0 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(229): Workerman\Timer::add(1, Array, Array, false)
#1 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(309): Workerman\Connection\AsyncTcpConnection->reconnect(1)
#2 /opt/imserver/vendor/workerman/workerman/Connection/TcpConnection.php(954): GatewayWorker\BusinessWorker->GatewayWorker\{closure}(Object(Workerman\Connection\AsyncTcpConnection))
#3 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(370): Workerman\Connection\TcpConnection->destroy()
#4 [internal function]: Workerman\Connection\AsyncTcpConnection->checkConnection(Resource id #33, 4, NULL)
#5 /opt/imserver/vendor/workerman/workerman/Events/Libevent.php(202): event_base_loop(Resource id #21)
#6 /opt/imserver/vendor/workerman/workerman/Worker.php(2416): Workerman\Events\Libevent->loop()
#7 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(197): Workerman\Worker->run()
#8 /opt/imserver/vendor/workerman/workerman/Worker.php(1541): GatewayWorker\BusinessWorker->run()
#9 /opt/imserver/vendor/workerman/workerman/Worker.php(1371): Workerman\Worker::forkOneWorkerForLinux(Object(GatewayWorker\BusinessWorker))
#10 /opt/imserver/vendor/workerman/workerman/Worker.php(1345): Workerman\Worker::forkWorkersForLinux()
#11 /opt/imserver/vendor/workerman/workerman/Worker.php(546): Workerman\Worker::forkWorkers()
#12 /opt/imserver/Applications/IM/start_businessworker.php(35): Workerman\Worker::runAll()
#13 {main}
Worker[47] process terminated
Error: Call to a member function add() on integer in /opt/imserver/vendor/workerman/workerman/Timer.php:117
Stack trace:
#0 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(229): Workerman\Timer::add(1, Array, Array, false)
#1 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(309): Workerman\Connection\AsyncTcpConnection->reconnect(1)
#2 /opt/imserver/vendor/workerman/workerman/Connection/TcpConnection.php(954): GatewayWorker\BusinessWorker->GatewayWorker\{closure}(Object(Workerman\Connection\AsyncTcpConnection))
#3 /opt/imserver/vendor/workerman/workerman/Connection/AsyncTcpConnection.php(370): Workerman\Connection\TcpConnection->destroy()
#4 [internal function]: Workerman\Connection\AsyncTcpConnection->checkConnection(Resource id #33, 4, NULL)
#5 /opt/imserver/vendor/workerman/workerman/Events/Libevent.php(202): event_base_loop(Resource id #21)
#6 /opt/imserver/vendor/workerman/workerman/Worker.php(2416): Workerman\Events\Libevent->loop()
#7 /opt/imserver/vendor/workerman/gateway-worker/src/BusinessWorker.php(197): Workerman\Worker->run()
#8 /opt/imserver/vendor/workerman/workerman/Worker.php(1541): GatewayWorker\BusinessWorker->run()
#9 /opt/imserver/vendor/workerman/workerman/Worker.php(1371): Workerman\Worker::forkOneWorkerForLinux(Object(GatewayWorker\BusinessWorker))
#10 /opt/imserver/vendor/workerman/workerman/Worker.php(1345): Workerman\Worker::forkWorkersForLinux()
#11 /opt/imserver/vendor/workerman/workerman/Worker.php(546): Workerman\Worker::forkWorkers()
#12 /opt/imserver/Applications/IM/start_businessworker.php(35): Workerman\Worker::runAll()
#13 {main}
Worker[45] process terminated
worker[businessWorker:47] exit with status 64000
Worker[46] process terminated
worker[businessWorker:45] exit with status 64000
worker[businessWorker:46] exit with status 64000
worker[businessWorker:50] exit with status 64000
worker[businessWorker:49] exit with status 64000
walkor commented 3 years ago

你看下是否改动了workerman的代码,/opt/imserver/vendor/workerman/workerman/Timer.php 117行 self::$_event 不可能是integer。

dmanbu commented 3 years ago

你看下是否改动了workerman的代码,/opt/imserver/vendor/workerman/workerman/Timer.php 117行 self::$_event 不可能是integer。

我并未改动workerman的代码,而是直接使用 http://www.workerman.net/download/GatewayWorker.zip 这个压缩包里面的demo

walkor commented 3 years ago

libevent扩展不支持php7,不要使用libevent扩展,请使用event扩展。

dmanbu commented 3 years ago

libevent扩展不支持php7,不要使用libevent扩展,请使用event扩展。

为什么我在虚拟机下不会报这个错?我虚拟机与容器同样使用的 php7 加 event 扩展,而且版本一致 只有在容器下才会报这个错?

walkor commented 3 years ago

你docker下使用的并不是event扩展,而是libevent扩展。

dmanbu commented 3 years ago

你docker下使用的并不是event扩展,而是libevent扩展。

刚才我描述错了,我虚拟机与容器同样使用的 php7 加 event 扩展和 libevent 扩展

虚拟机安装环境

yum -y install epel-release wget \
    && yum -y install https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm \
    && yum -y install https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm \
    && mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \
    && wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo \
    && sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo \
    && mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup \
    && mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup \
    && wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo \
    && sed -i 's#rpms.remirepo.net#mirrors.aliyun.com/remi#g' /etc/yum.repos.d/remi*.repo \
    && sed -i 's#cdn.remirepo.net#mirrors.aliyun.com/remi#g' /etc/yum.repos.d/remi*.repo \
    && sed -i 's/^mirrorlist/#mirrorlist/g' /etc/yum.repos.d/remi*.repo \
    && sed -i 's/^#baseurl/baseurl/g' /etc/yum.repos.d/remi*.repo \
    && yum clean all \
    && yum makecache \
    && yum -y install gcc gcc-c++ make libevent libevent-devel net-tools iproute php72 php72-php-cli php72-php-fpm php72-php-devel php72-php-pear php72-php-process php72-php-mysqlnd php72-php-bcmath php72-php-pecl-event php72-php-gd php72-php-intl php72-php-mbstring php72-php-pecl-redis4 php72-php-soap php72-php-xmlrpc php72-php-pecl-zip file \
    && source /opt/remi/php72/enable \
    && cd /opt/imserver/pecl-event-libevent-master/ \
    && phpize \
    && ./configure \
    && make \
    && make install \
    && cp 30-libevent.ini /etc/opt/remi/php72/php.d/ \

容器Dockerfile

cat > Dockerfile <<EOF
FROM centos:7.8.2003

RUN yum -y install epel-release wget \
    && yum -y install https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm \
    && yum -y install https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm \
    && mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \
    && wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo \
    && sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo \
    && mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup \
    && mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup \
    && wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo \
    && sed -i 's#rpms.remirepo.net#mirrors.aliyun.com/remi#g' /etc/yum.repos.d/remi*.repo \
    && sed -i 's#cdn.remirepo.net#mirrors.aliyun.com/remi#g' /etc/yum.repos.d/remi*.repo \
    && sed -i 's/^mirrorlist/#mirrorlist/g' /etc/yum.repos.d/remi*.repo \
    && sed -i 's/^#baseurl/baseurl/g' /etc/yum.repos.d/remi*.repo \
    && yum clean all \
    && yum makecache \
    && yum -y install gcc gcc-c++ make libevent libevent-devel net-tools iproute php72 php72-php-cli php72-php-fpm php72-php-devel php72-php-pear php72-php-process php72-php-mysqlnd php72-php-bcmath php72-php-pecl-event php72-php-gd php72-php-intl php72-php-mbstring php72-php-pecl-redis4 php72-php-soap php72-php-xmlrpc php72-php-pecl-zip file \
    && source /opt/remi/php72/enable \
    && cd /opt/imserver/pecl-event-libevent-master/ \
    && phpize \
    && ./configure \
    && make \
    && make install \
    && cp 30-libevent.ini /etc/opt/remi/php72/php.d/ \
    && cd .. \
    && rm -rf pecl-event-libevent-master \
    && yum clean all \
    && rm -rf /var/tmp/yum*

ENV PATH=/opt/remi/php72/root/usr/bin:/opt/remi/php72/root/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV LD_LIBRARY_PATH=/opt/remi/php72/root/usr/lib64
ENV MANPATH=/opt/remi/php72/root/usr/share/man
EOF
walkor commented 3 years ago

用event扩展就行了。它和libevent扩展效果一样。 不要在php7下使用libevnet扩展,libevent扩展作者没有发布过php7版本的扩展。应该是你用了哪个非官方libevent扩展导致的。 具体为什么docker下不能使用,需要你问下这个非官方libevent扩展作者。