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 ローカル メモリ アドレスに格納されていますか? $_SESSION 変数を使用するときに Apche が検出できるメモリ アドレスに格納する必要があると考えました。

4

1 に答える 1

0

connect() の前に SockOpt() を設定する必要がありますが、セグメンテーション違反がこれに関連しているかどうかはわかりません。

注意: ZMQ_SUBSCRIBE、ZMQ_UNSUBSCRIBE、および ZMQ_LINGER を除くすべてのオプションは、後続のソケットのバインド/接続に対してのみ有効です。

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

于 2014-01-11T06:38:04.590 に答える