[Xunsearch PHP-SDK](http://www.xunsearch.com) v1.4.8 API 参考文档
# XSServer
[All Packages](#)| [属性](#)| [方法(函数)](#)
| 包 | [XS](#) |
|-----|-----|
| 继承关系 | class XSServer »[XSComponent](#) |
| 子类 | [XSIndex](#), [XSSearch](#) |
| 版本 | 1.0.0 |
| 源代码 | [sdk/php/lib/XSServer.class.php](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php) |
XSServer 服务器操作对象同时兼容于 indexd, searchd, 所有交互均采用 [XSCommand](#) 对象
### Public 属性
[隐去继承来的属性](#)
| 名称 | 类型 | 描述 | 定义于 |
|-----|-----|-----|-----|
| [connString](#) | string | 连接字符串 | XSServer |
| [project](#) | string | 获取当前项目名称 | XSServer |
| [respond](#) | [XSCommand](#) | 从服务器读取响应指令 | XSServer |
| [socket](#) | mixed | 获取连接资源描述符 | XSServer |
| [xs](#) | [XS](#) | 服务端关联的 XS 对象 | XSServer |
### Protected 属性
[隐去继承来的属性](#)
| 名称 | 类型 | 描述 | 定义于 |
|-----|-----|-----|-----|
| [_conn](#) | | | XSServer |
| [_flag](#) | | | XSServer |
| [_project](#) | | | XSServer |
| [_sendBuffer](#) | | | XSServer |
| [_sock](#) | | | XSServer |
### Public 方法
[隐去继承来的方法](#)
| 名称 | 描述 | 定义于 |
|-----|-----|-----|
| [__construct()](#) | 构造函数, 打开连接 | XSServer |
| [__destruct()](#) | 析构函数, 关闭连接 | XSServer |
| [__get()](#) | 魔术方法 __get | [XSComponent](#) |
| [__isset()](#) | 魔术方法 __isset | [XSComponent](#) |
| [__set()](#) | 魔术方法 __set | [XSComponent](#) |
| [__unset()](#) | 魔术方法 __unset | [XSComponent](#) |
| [close()](#) | 关闭连接 | XSServer |
| [execCommand()](#) | 执行服务端指令并获取返回值 | XSServer |
| [getConnString()](#) | Returns 连接字符串 | XSServer |
| [getProject()](#) | 获取当前项目名称 | XSServer |
| [getRespond()](#) | 从服务器读取响应指令 | XSServer |
| [getSocket()](#) | 获取连接资源描述符 | XSServer |
| [hasRespond()](#) | 判断服务端是否有可读数据 | XSServer |
| [open()](#) | 打开服务端连接 | XSServer |
| [reopen()](#) | 重新打开连接 | XSServer |
| [sendCommand()](#) | 往服务器直接发送指令 (无缓存) | XSServer |
| [setProject()](#) | 设置当前项目 | XSServer |
| [setTimeout()](#) | 设置服务端超时秒数 | XSServer |
### Protected 方法
[隐去继承来的方法](#)
| 名称 | 描述 | 定义于 |
|-----|-----|-----|
| [check()](#) | 检测服务端的连接情况 | XSServer |
| [connect()](#) | 连接服务端 | XSServer |
| [read()](#) | 读取数据 | XSServer |
| [write()](#) | 写入数据 | XSServer |
### 属性明细
_conn属性
protected **$_conn**;
_flag属性
protected **$_flag**;
_project属性
protected **$_project**;
_sendBuffer属性
protected **$_sendBuffer**;
_sock属性
protected **$_sock**;
connString属性 *只读*
public string [**getConnString**](#)()
连接字符串
project属性
public string [**getProject**](#)()
public void [**setProject**](#)(string $name, string $home='')
获取当前项目名称
respond属性 *只读*
public [XSCommand](#)[**getRespond**](#)()
从服务器读取响应指令
socket属性 *只读*
public mixed [**getSocket**](#)()
获取连接资源描述符
xs属性
public [XS](#)**$xs**;
服务端关联的 XS 对象
### 方法明细
__construct()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public void <b>__construct</b>(string $conn=NULL, <a href="XS.html">XS</a> $xs=NULL)</div></td></tr><tr><td class="paramNameCol">$conn</td> <td class="paramTypeCol">string</td> <td class="paramDescCol">服务端连接参数</td></tr><tr><td class="paramNameCol">$xs</td> <td class="paramTypeCol"><a href="XS.html">XS</a></td> <td class="paramDescCol">需要捆绑的 xs 对象</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L143](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L143) (**[显示](#)**)
`public function __construct($conn = null, $xs = null)
{
$this->xs = $xs;
if ($conn !== null) {
$this->open($conn);
}
}`
构造函数, 打开连接
__destruct()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public void <b>__destruct</b>()</div></td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L154](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L154) (**[显示](#)**)
`public function __destruct()
{
$this->xs = null;
$this->close();
}`
析构函数, 关闭连接
check()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">protected void <b>check</b>()</div></td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L438](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L438) (**[显示](#)**)
`protected function check()
{
if ($this->_sock === null) {
throw new XSException('No server connection');
}
if ($this->_flag & self::BROKEN) {
throw new XSException('Broken server connection');
}
}`
检测服务端的连接情况
close()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public void <b>close</b>(bool $ioerr=false)</div></td></tr><tr><td class="paramNameCol">$ioerr</td> <td class="paramTypeCol">bool</td> <td class="paramDescCol">关闭调用是否由于 IO 错误引起的, 以免发送 quit 指令</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L198](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L198) (**[显示](#)**)
`public function close($ioerr = false)
{
if ($this->_sock && !($this->_flag & self::BROKEN)) {
if (!$ioerr && $this->_sendBuffer !== '') {
$this->write($this->_sendBuffer);
$this->_sendBuffer = '';
}
if (!$ioerr && !($this->_flag & self::FILE)) {
$cmd = new XSCommand(CMD_QUIT);
fwrite($this->_sock, $cmd);
}
fclose($this->_sock);
$this->_flag |= self::BROKEN;
}
}`
关闭连接附带发送发送 quit 命令
connect()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">protected void <b>connect</b>()</div></td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L452](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L452) (**[显示](#)**)
`protected function connect()
{
// connect to server
$conn = $this->_conn;
if (is_int($conn) || is_numeric($conn)) {
$host = 'localhost';
$port = intval($conn);
} elseif (!strncmp($conn, 'file://', 7)) {
// write-only for saving index exchangable data to file
// NOTE: this will cause file content be turncated
$conn = substr($conn, 7);
if (($sock = @fopen($conn, 'wb')) === false) {
throw new XSException('Failed to open local file for writing: `' . $conn . '\'');
}
$this->_flag |= self::FILE;
$this->_sock = $sock;
return;
} elseif (($pos = strpos($conn, ':')) !== false) {
$host = substr($conn, 0, $pos);
$port = intval(substr($conn, $pos + 1));
} else {
$host = 'unix://' . $conn;
$port = -1;
}
if (($sock = @fsockopen($host, $port, $errno, $error, 5)) === false) {
throw new XSException($error . '(C#' . $errno . ', ' . $host . ':' . $port . ')');
}
// set socket options
$timeout = ini_get('max_execution_time');
$timeout = $timeout > 0 ? ($timeout - 1) : 30;
stream_set_blocking($sock, true);
stream_set_timeout($sock, $timeout);
$this->_sock = $sock;
}`
连接服务端
execCommand()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public mixed <b>execCommand</b>(mixed $cmd, int $res_arg=0, int $res_cmd=128)</div></td></tr><tr><td class="paramNameCol">$cmd</td> <td class="paramTypeCol">mixed</td> <td class="paramDescCol">要提交的指令, 若不是 XSCommand 实例则作为构造函数的第一参数创建对象</td></tr><tr><td class="paramNameCol">$res_arg</td> <td class="paramTypeCol">int</td> <td class="paramDescCol">要求的响应参数, 默认为 CMD_NONE 即不检测, 若检测结果不符 则认为命令调用失败, 会返回 false 并设置相应的出错信息</td></tr><tr><td class="paramNameCol">$res_cmd</td> <td class="paramTypeCol">int</td> <td class="paramDescCol">要求的响应指令, 默认为 CMD_OK 即要求结果必须正确.</td></tr><tr><td class="paramNameCol">{return}</td> <td class="paramTypeCol">mixed</td> <td class="paramDescCol">若无需要检测结果则返回 true, 其它返回响应的 XSCommand 对象</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L279](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L279) (**[显示](#)**)
`public function execCommand($cmd, $res_arg = CMD_NONE, $res_cmd = CMD_OK)
{
// create command object
if (!$cmd instanceof XSCommand) {
$cmd = new XSCommand($cmd);
}
// just cache the cmd for those need not answer
if ($cmd->cmd & 0x80) {
$this->_sendBuffer .= $cmd;
return true;
}
// send cmd to server
$buf = $this->_sendBuffer . $cmd;
$this->_sendBuffer = '';
$this->write($buf);
// return true directly for local file
if ($this->_flag & self::FILE) {
return true;
}
// got the respond
$res = $this->getRespond();
// check respond
if ($res->cmd === CMD_ERR && $res_cmd != CMD_ERR) {
throw new XSException($res->buf, $res->arg);
}
// got unexpected respond command
if ($res->cmd != $res_cmd || ($res_arg != CMD_NONE && $res->arg != $res_arg)) {
throw new XSException('Unexpected respond {CMD:' . $res->cmd . ', ARG:' . $res->arg . '}');
}
return $res;
}`
执行服务端指令并获取返回值
getConnString()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public string <b>getConnString</b>()</div></td></tr><tr><td class="paramNameCol">{return}</td> <td class="paramTypeCol">string</td> <td class="paramDescCol">连接字符串</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L217](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L217) (**[显示](#)**)
`public function getConnString()
{
$str = $this->_conn;
if (is_int($str) || is_numeric($str)) {
$str = 'localhost:' . $str;
} elseif (strpos($str, ':') === false) {
$str = 'unix://' . $str;
}
return $str;
}`
getProject()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public string <b>getProject</b>()</div></td></tr><tr><td class="paramNameCol">{return}</td> <td class="paramTypeCol">string</td> <td class="paramDescCol">项目名称</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L241](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L241) (**[显示](#)**)
`public function getProject()
{
return $this->_project;
}`
获取当前项目名称
getRespond()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public <a href="XSCommand.html">XSCommand</a> <b>getRespond</b>()</div></td></tr><tr><td class="paramNameCol">{return}</td> <td class="paramTypeCol"><a href="XSCommand.html">XSCommand</a></td> <td class="paramDescCol">成功返回响应指令</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L334](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L334) (**[显示](#)**)
`public function getRespond()
{
// read data from server
$buf = $this->read(8);
$hdr = unpack('Ccmd/Carg1/Carg2/Cblen1/Iblen', $buf);
$res = new XSCommand($hdr);
$res->buf = $this->read($hdr['blen']);
$res->buf1 = $this->read($hdr['blen1']);
return $res;
}`
从服务器读取响应指令
getSocket()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public mixed <b>getSocket</b>()</div></td></tr><tr><td class="paramNameCol">{return}</td> <td class="paramTypeCol">mixed</td> <td class="paramDescCol">连接标识, 仅用于内部测试等目的</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L232](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L232) (**[显示](#)**)
`public function getSocket()
{
return $this->_sock;
}`
获取连接资源描述符
hasRespond()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public bool <b>hasRespond</b>()</div></td></tr><tr><td class="paramNameCol">{return}</td> <td class="paramTypeCol">bool</td> <td class="paramDescCol">如果有返回 true, 否则返回 false</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L350](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L350) (**[显示](#)**)
`public function hasRespond()
{
// check socket
if ($this->_sock === null || $this->_flag & (self::BROKEN | self::FILE)) {
return false;
}
$wfds = $xfds = array();
$rfds = array($this->_sock);
$res = stream_select($rfds, $wfds, $xfds, 0, 0);
return $res > 0;
}`
判断服务端是否有可读数据用于某些特别情况在 [getRespond](#) 前先调用和判断, 以免阻塞
open()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public void <b>open</b>(mixed $conn)</div></td></tr><tr><td class="paramNameCol">$conn</td> <td class="paramTypeCol">mixed</td> <td class="paramDescCol">服务端连接参数, 支持: <端口号|host:port|本地套接字路径></td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L165](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L165) (**[显示](#)**)
`public function open($conn)
{
$this->close();
$this->_conn = $conn;
$this->_flag = self::BROKEN;
$this->_sendBuffer = '';
$this->_project = null;
$this->connect();
$this->_flag ^= self::BROKEN;
if ($this->xs instanceof XS) {
$this->setProject($this->xs->getName());
}
}`
打开服务端连接如果已关联 XS 对象, 则会同时切换至相应的项目名称
read()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">protected string <b>read</b>(int $len)</div></td></tr><tr><td class="paramNameCol">$len</td> <td class="paramTypeCol">int</td> <td class="paramDescCol">要读入的长度</td></tr><tr><td class="paramNameCol">{return}</td> <td class="paramTypeCol">string</td> <td class="paramDescCol">成功时返回读到的字符串</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L404](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L404) (**[显示](#)**)
`protected function read($len)
{
// quick return for zero size
if ($len == 0) {
return '';
}
// loop to send data
$this->check();
for ($buf = '', $size = $len;;) {
$bytes = fread($this->_sock, $len);
if ($bytes === false || strlen($bytes) == 0) {
break;
}
$len -= strlen($bytes);
$buf .= $bytes;
if ($len === 0) {
return $buf;
}
}
// error occured
$meta = stream_get_meta_data($this->_sock);
$this->close(true);
$reason = $meta['timed_out'] ? 'timeout' : ($meta['eof'] ? 'closed' : 'unknown');
$msg = 'Failed to recv the data from server completely ';
$msg .= '(SIZE:' . ($size - $len) . '/' . $size . ', REASON:' . $reason . ')';
throw new XSException($msg);
}`
读取数据
reopen()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public XSServer <b>reopen</b>(bool $force=false)</div></td></tr><tr><td class="paramNameCol">$force</td> <td class="paramTypeCol">bool</td> <td class="paramDescCol">是否强制重新连接, 默认为否</td></tr><tr><td class="paramNameCol">{return}</td> <td class="paramTypeCol">XSServer</td> <td class="paramDescCol">返回自己, 以便串接操作</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L185](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L185) (**[显示](#)**)
`public function reopen($force = false)
{
if ($this->_flag & self::BROKEN || $force === true) {
$this->open($this->_conn);
}
return $this;
}`
重新打开连接仅应用于曾经成功打开的连并且异常关闭了
sendCommand()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public void <b>sendCommand</b>(mixed $cmd)</div></td></tr><tr><td class="paramNameCol">$cmd</td> <td class="paramTypeCol">mixed</td> <td class="paramDescCol">要提交的指令, 支持 XSCommand 实例或 cmd 构造函数的第一参数</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L321](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L321) (**[显示](#)**)
`public function sendCommand($cmd)
{
if (!$cmd instanceof XSCommand) {
$cmd = new XSCommand($cmd);
}
$this->write(strval($cmd));
}`
往服务器直接发送指令 (无缓存)
setProject()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public void <b>setProject</b>(string $name, string $home='')</div></td></tr><tr><td class="paramNameCol">$name</td> <td class="paramTypeCol">string</td> <td class="paramDescCol">项目名称</td></tr><tr><td class="paramNameCol">$home</td> <td class="paramTypeCol">string</td> <td class="paramDescCol">项目在服务器上的目录路径, 可选参数(不得超过255字节).</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L251](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L251) (**[显示](#)**)
`public function setProject($name, $home = '')
{
if ($name !== $this->_project) {
$cmd = array('cmd' => CMD_USE, 'buf' => $name, 'buf1' => $home);
$this->execCommand($cmd, CMD_OK_PROJECT);
$this->_project = $name;
}
}`
设置当前项目
setTimeout()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">public void <b>setTimeout</b>(int $sec)</div></td></tr><tr><td class="paramNameCol">$sec</td> <td class="paramTypeCol">int</td> <td class="paramDescCol">秒数, 设为 0则永不超时直到客户端主动关闭</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L264](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L264) (**[显示](#)**)
`public function setTimeout($sec)
{
$cmd = array('cmd' => CMD_TIMEOUT, 'arg' => $sec);
$this->execCommand($cmd, CMD_OK_TIMEOUT_SET);
}`
设置服务端超时秒数
write()方法
<table class="summaryTable"><tr><td colspan="3"><div class="signature2">protected void <b>write</b>(string $buf, string $len=0)</div></td></tr><tr><td class="paramNameCol">$buf</td> <td class="paramTypeCol">string</td> <td class="paramDescCol">要写入的字符串</td></tr><tr><td class="paramNameCol">$len</td> <td class="paramTypeCol">string</td> <td class="paramDescCol">要写入的长度, 默认为字符串长度</td></tr></table>
**源码:**[sdk/php/lib/XSServer.class.php#L368](https://github.com/hightman/xunsearch/blob/master/sdk/php/lib/XSServer.class.php#L368) (**[显示](#)**)
`protected function write($buf, $len = 0)
{
// quick return for empty buf
$buf = strval($buf);
if ($len == 0 && ($len = $size = strlen($buf)) == 0) {
return true;
}
// loop to send data
$this->check();
while (true) {
$bytes = fwrite($this->_sock, $buf, $len);
if ($bytes === false || $bytes === 0 || $bytes === $len) {
break;
}
$len -= $bytes;
$buf = substr($buf, $bytes);
}
// error occured
if ($bytes === false || $bytes === 0) {
$meta = stream_get_meta_data($this->_sock);
$this->close(true);
$reason = $meta['timed_out'] ? 'timeout' : ($meta['eof'] ? 'closed' : 'unknown');
$msg = 'Failed to send the data to server completely ';
$msg .= '(SIZE:' . ($size - $len) . '/' . $size . ', REASON:' . $reason . ')';
throw new XSException($msg);
}
}`
写入数据
Copyright © 2008-2011 by [杭州云圣网络科技有限公司](http://www.xunsearch.com)
All Rights Reserved.
- 权威指南
- 新手上路
- 最新主要变动
- 概述
- 关于 Xunsearch PHP-SDK
- 安装、升级
- 体验 demo 项目
- 开发规范
- 开发流程
- 了解基础对象
- 基础对象概述
- XS 项目
- XSException 异常
- XSDocument 文档
- XSIndex 索引管理
- XSSearch 搜索
- XSTokenizer 分词接口
- 编写项目配置文件
- 项目配置详解
- 自定义分词器
- 编写第一个配置文件
- 管理索引
- 索引概述
- 添加文档
- 更新、修改文档
- 删除文档
- 清空索引
- 平滑重建索引
- 使用索引缓冲区
- 自定义SCWS词库
- 使用搜索
- 搜索概述
- 构建搜索语句
- 获取搜索匹配结果
- 获取搜索匹配数量
- 获取热门搜索词
- 获取相关搜索词
- 搜索建议和纠错
- 按字段值分面搜索
- 使用辅助工具
- RequiredCheck 运行检测
- Indexer 索引管理器
- Quest 搜索测试工具
- SearchSkel 生成搜索代码
- IniWizzard 配置文件向导
- Logger 搜索日志管理
- 专题
- 同义词搜索功能
- 在SDK中使用SCWS分词
- API 指南
- XS
- XS
- XSCommand
- XSComponent
- XSDocument
- XSErrorException
- XSException
- XSFieldMeta
- XSFieldScheme
- XSIndex
- XSSearch
- XSServer
- XS.tokenizer
- XSTokenizer
- XSTokenizerFull
- XSTokenizerNone
- XSTokenizerScws
- XSTokenizerSplit
- XSTokenizerXlen
- XSTokenizerXstep
- XS.util
- XSCsvDataSource
- XSDataFilter
- XSDatabaseDataSource
- XSDebugFilter
- XSJsonDataSource
- XSUtil
- XS.util.db
- XSDatabase
- XSDatabaseMySQL
- XSDatabaseMySQLI
- XSDatabasePDO
- XSDatabasePDO_MySQL
- XSDatabasePDO_PgSQL
- XSDatabasePDO_SQLite
- XSDatabasePgSQL
- XSDatabaseSQLite
- XSDatabaseSQLite3
- XS.utilf
- XSDataSource
- 其它文档
- 关于 xunsearch
- 特色和优势
- Xunsearch 架构简图
- 下载 Xunsearch
- 商业服务与支持
- XunSearch 授权许可证