0

我正在使用 PHP 和 ZMQ 绑定在 linux 中运行 apache。为每个页面加载运行此代码时,它工作正常:

$_SESSION['ZMQcontext'] = new ZMQContext(1);
$_SESSION['req'] = new ZMQSocket($_SESSION['ZMQcontext'], ZMQ::SOCKET_REQ);
$_SESSION['req']->connect("tcp://localhost:30000");

// Set maximum wait time on receive to 250 milliseconds
$_SESSION['req']->setSockOpt(ZMQ::SOCKOPT_RCVTIMEO, 250);

但后来我认为我不应该创建一个新的 ZMQ 上下文并为每个页面加载连接套接字,所以我这样写:

if(!isset($_SESSION['ZMQcontext'])) {
  $_SESSION['ZMQcontext'] = new ZMQContext(1);
}

if(!isset($_SESSION['req'])) {
  $_SESSION['req'] = new ZMQSocket($_SESSION['ZMQcontext'], ZMQ::SOCKET_REQ);
  $_SESSION['req']->connect("tcp://localhost:30000");

  // Set maximum wait time on receive to 250 milliseconds
  $_SESSION['req']->setSockOpt(ZMQ::SOCKOPT_RCVTIMEO, 250);
}

现在我在 Apache 错误日志中得到了这个:

[notice] child pid 10411 exit signal Segmentation fault (11)

那么有人知道为什么会这样吗?

ZMQ 上下文是否存储在 PHP 本地内存地址中?我认为它应该存储在 Apche 在使用 $_SESSION 变量时应该能够找到的内存地址中。

4

1 回答 1

0

你应该在connect()之前setSockOpt(),但我不知道Segmentation fault是否与此有关。

注意:除 ZMQ_SUBSCRIBE、ZMQ_UNSUBSCRIBE 和 ZMQ_LINGER 之外的所有选项仅对后续的套接字绑定/连接生效。

http://api.zeromq.org/2-2:zmq-setsockopt

于 2014-01-11T06:38:04.590 回答