【发布时间】:2018-04-30 20:14:57
【问题描述】:
我需要包含 php 脚本的 docker 容器在死前通过 Web 套接字发送消息,但该过程永远不会停止(即使在 exit、die 或 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"]
如何防止阻塞或如何从脚本中杀死进程? (我试过 exec( 'kill 1' ) 没有成功)
【问题讨论】: