我正在使用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变量时找到的内存地址中。
答案 0 :(得分:0)
你应该在connect()之前设置socketOpt(),但我不知道Segmentation故障是否与此相关。
警告:除ZMQ_SUBSCRIBE,ZMQ_UNSUBSCRIBE和ZMQ_LINGER外,所有选项仅对后续套接字绑定/连接生效。