我需要包含php脚本的docker容器,在死亡之前通过Web套接字发送消息,但过程永远不会停止(即使在exit
,die
或{{1之后新的例外)。
如果过程永不停止,容器也永远不会停止......
我做了一个例子来说明我的问题:
throw
test.php :
<?php
echo "begin\n";
$dsn = 'tcp://127.0.0.1:5555';
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_REQ);
$socket->connect($dsn);
$socket->send("test", ZMQ::MODE_DONTWAIT); // this line cause the zombie process
$socket->disconnect($dsn);
echo "end\n";
Dockerfile :
如何防止阻止或如何从脚本中删除进程? (我尝试 FROM php:7.2.4-cli-alpine3.7
# PHPIZE
ENV PHPIZE_DEPS \
autoconf \
cmake \
file \
g++ \
gcc \
libc-dev \
pcre-dev \
make \
git \
pkgconf \
re2c \
zlib-dev \
icu-dev
RUN set -xe \
&& apk add --update icu \
&& apk add --no-cache --virtual .build-deps $PHPIZE_DEPS
# Module ZMQ
RUN apk add --no-cache --virtual .persistent-deps \
libsodium-dev \
zeromq-dev \
zeromq
RUN git clone https://github.com/mkoppanen/php-zmq /tmp/php-zmq \
&& cd /tmp/php-zmq \
&& phpize \
&& ./configure \
&& make \
&& make install \
&& make test \
&& docker-php-ext-enable zmq
# Cleanup
RUN apk del .build-deps \
&& rm -rf /tmp/* /usr/local/lib/php/doc/* /var/cache/apk/*.
COPY test.php /tmp/test.php
CMD ["php", "/tmp/test.php"]
但没有成功)
答案 0 :(得分:2)
我尝试了一个示例中看到的 setSockOpt()
,现在流程结束了。
在connect()
之前添加:
$socket->setSockOpt(ZMQ::SOCKOPT_LINGER, 30);
http://php.net/manual/en/class.zmq.php#zmq.constants.sockopt-linger