【问题标题】:php process never dies, after ZMQContext-based $socket->send() How to fix it?php 进程永远不会死掉,在基于 ZMQContext 的 $socket->send() 之后如何解决?
【发布时间】:2018-04-30 20:14:57
【问题描述】:

我需要包含 php 脚本的 docker 容器在死前通过 Web 套接字发送消息,但该过程永远不会停止(即使在 exitdiethrow 新异常之后)。

如果进程永远不会停止,那么容器也永远不会停止......

我做了一个例子来说明我的问题:

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' ) 没有成功)

【问题讨论】:

    标签: php docker zeromq


    【解决方案1】:

    好的,我找到了!

    我尝试了一个 setSockOpt() 我在一个例子中看到的,现在这个过程结束了。

    connect()之前添加:

    $socket->setSockOpt(ZMQ::SOCKOPT_LINGER, 30);
    

    http://php.net/manual/en/class.zmq.php#zmq.constants.sockopt-linger

    【讨论】:

      猜你喜欢
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2017-08-15
      • 2021-12-25
      • 2019-11-29
      • 2021-11-04
      • 1970-01-01
      相关资源
      最近更新 更多