首先是一个工具类SphinxXMLFeed用于将数据写入xml:
此处是采用了hash 算法将数据写入10个xml,你可以根据自己需求改动,如果数据量不大只写入一个也行,只需写死文件名。
class SphinxXMLFeed extends XMLWriter
{
private $fields = array();
private $attributes = array();
public static $dir = “/var/log/”;
public function __construct($options = array())
{
$defaults = array(
‘indent’ => false,
);
$options = array_merge($defaults, $options);
// Store the xml tree in memory
$this->openMemory();
if($options[‘indent’]) {
$this->setIndent(true);
}
}
public function setFields($fields) {
$this->fields = $fields;
}
public function setAttributes($attributes) {
$this->attributes = $attributes;
}
public function addDocument($doc,$uid) {
$this->startElement(‘sphinx:document’);
$this->writeAttribute(‘id’, $doc[‘id’]);
foreach($doc as $key => $value) {
// Skip the id key since that is an element attribute
if($key == ‘id’) continue;
$this->startElement($key);
$this->text($value);
$this->endElement();
}
$this->endElement();
$this->save($this->outputMemory(),$uid);
}
public function beginOutput($uid) {
$this->startDocument(‘1.0′, ‘UTF-8′);
$this->startElement(‘sphinx:docset’);
$this->startElement(‘sphinx:schema’);
// add fields to the schema
foreach($this->fields as $field) {
$this->startElement(‘sphinx:field’);
$this->writeAttribute(‘name’, $field);
$this->endElement();
}
// add attributes to the schema
foreach($this->attributes as $attributes) {
$this->startElement(‘sphinx:attr’);
foreach($attributes as $key => $value) {
$this->writeAttribute($key, $value);
}
$this->endElement();
}
// end sphinx:schema
$this->endElement();
$this->save_first($this->outputMemory(),$uid);
}
public function endOutput($uid)
{
// end sphinx:docset
$this->endElement();
$this->save($this->outputMemory(),$uid);
}
public function save($data,$uid){
chmod(dirname(__FILE__), 0777); // 以最高操作权限操作当前目录
// 打开b.php文件,这里采用的是a+,也可以用a,a+为可读可写,a为只写,如果b.php不能存在则会创建它
$file = fopen(self::$dir.self::gethash($uid).”xml”, ‘a+’); //a模式就是一种追加模式,如果是w模式则会删除之前的内容再添加
// 获取需要写入的内容
// 写入追加的内容
fwrite($file, $data);
// 关闭b.php文件
fclose($file);
// 销毁文件资源句柄变量
unset($file);
}
public function save_first($data,$uid){
chmod(dirname(__FILE__), 0777); // 以最高操作权限操作当前目录
// 打开b.php文件,这里采用的是a+,也可以用a,a+为可读可写,a为只写,如果b.php不能存在则会创建它
$file = fopen(self::$dir.self::gethash($uid).”xml”, ‘w+’); //a模式就是一种追加模式,如果是w模式则会删除之前的内容再添加
// 获取需要写入的内容
// 写入追加的内容
fwrite($file, $data);
// 关闭b.php文件
fclose($file);
// 销毁文件资源句柄变量
unset($file);
}
public static function gethash($uid){
$count = 10;
$d =intval(base_convert(substr(md5($uid), 0, 5),16, 10)) %$count;
return “t_user”.’_’.$d;
}
然后是工具类的调用
//最后是如何在sphinx里调用该 xml文件,
//大家上面看我保存的路径是/var/log/…(我这是Linux系统)