Источник Sphinx xmlpipe2

Официальная спецификация

Пример Sphinx xmlpipe2:

xmlpipe2.php
<?php
 
class SphinxXml2Pipe {
 
  private $db;
  public function __construct() {
    // получаем объект для работы с БД (вписать свой)
    $this->db = GlobalContainer::GetDB();
    // чтобы не забивать кеш запросов "мусором"
    $this->db->Query("SET SESSION query_cache_type=OFF");
  }
 
  public function run() {
    // ini_set("memory_limit","128M"); // Включить для тестирования в условиях ограниченного объема памяти
    $this->startXml();
    $this->putXmlSchema();
    while($this->getDocs()) {
      foreach($this->documents as $doc) {
        $this->putXmlDoc($doc);
      }
      unset($this->documents); // против утечки памяти если $doc - объект
      fwrite(STDOUT, $this->xml->flush(true)); // против переполнения памяти
    }
    $this->endXml();
    fwrite(STDOUT, $this->xml->flush(true)); // против переполнения памяти
  }
 
  // "порционное" получение результатов с целью экономии памяти
  private $limitPerQuery = 1000, $offsetQuery = 0, $documents;
 
  private function getDocs() {
    // написать собственный запрос
    $query = "SELECT `id`, `some_other_data` FROM `my_table` LIMIT {$this->offsetQuery}, {$this->limitPerQuery}";
    $this->documents = $this->db->SelectSet($query);
    $this->offsetQuery += $this->limitPerQuery;
    return is_array($this->documents) && count($this->documents) > 0;
  }
 
  private $xml;
  private function startXml() {
    $this->xml = new XmlWriter();
 
    $this->xml->openMemory();
    $this->xml->setIndent(true);
    $this->xml->setIndentString('  ');
    $this->xml->startDocument('1.0', 'utf-8');
 
      $this->xml->startElement('sphinx:docset');
 
  }
 
  private function putXmlSchema() {
    $this->xml->startElement('sphinx:schema');
 
      // тип - текст
      $this->xml->startElement('sphinx:field');
      $this->xml->writeAttribute('name', 'text');
      $this->xml->endElement();
 
      // тип - год (int 16 бит)
      $this->xml->startElement('sphinx:attr');
      $this->xml->writeAttribute('name', 'year');
      $this->xml->writeAttribute('type', 'int');
      $this->xml->writeAttribute('bits', 16);
      $this->xml->endElement();
 
      // тип - строка
      $this->xml->startElement('sphinx:attr');
      $this->xml->writeAttribute('name', 'tags');
      $this->xml->writeAttribute('type', 'string');
      $this->xml->endElement();
 
      // тип - булев (да/нет)
      $this->xml->startElement('sphinx:attr');
      $this->xml->writeAttribute('name', 'popular');
      $this->xml->writeAttribute('type', 'bool');
      $this->xml->endElement();
 
    $this->xml->endElement();
  }
 
  private function putXmlDoc(array $doc) {
    $this->xml->startElement('sphinx:document');
    $this->xml->writeAttribute('id', $doc['id']);
 
      $this->xml->startElement('text');
        $this->xml->writeCData($doc['text']);
      $this->xml->endElement();
 
      $this->xml->writeElement('year', $doc['year']);
 
      $this->xml->startElement('tags');
        $this->xml->writeCData($doc['tags']);
      $this->xml->endElement();
 
      $this->xml->writeElement('popular', $doc['is_popular'] == 1);
 
    $this->xml->endElement();
  }
 
  private function endXml() {
    $this->xml->endElement();
  }
 
}
 
 
$pipe = new SphinxXml2Pipe();
$pipe->run();