Хорошо, теперь все заработало.
Это немного сложнее, чем решение Zend_AMF, но гораздо быстрее. Вот мой код:
$data = array('message' => 'Hello, world!');
// Create the gateway and configure it
$amf = new Gateway();
Amf_Server::$encoding = 'amf3';
Amf_Server::$disableDebug = true;
// Construct a body
$body = new MessageBody("...", "/1", array());
$body->setResults($data);
$body->responseURI = $body->responseIndex . "...";
// Create the object and add the body
$out = new AMFObject();
$out->addBody($body);
// Get a serializer and use it
$serializer = new AMFSimpleSerializer();
$result = $serializer->serialize($out);
Как видите, есть новый класс AMFSimpleSerializer
, который я построил:
class AMFSimpleSerializer extends AMFSerializer
{
function serialize(&$amfout)
{
$encodeCallback = array(&$this,"encodeCallback");
$body = &$amfout->getBodyAt(0);
$this->outBuffer = "";
$this->outBuffer .= amf_encode($body->getResults(), $this->encodeFlags, $encodeCallback);
$this->outBuffer = substr($this->outBuffer, 1);
return $this->outBuffer;
}
}
Этот класс работает, только если установлен amfext, но его можно легко модифицировать для использования процесса php enocding. Я не реализовал это, потому что я построил это на сильно модифицированной версии AMFPHP.
Надеюсь, я заменил все классы из моего кода на настоящие аналоги AMFPHP. Я постараюсь проверить это завтра и при необходимости обновить этот ответ.
После того, как я закончил, я понял, что теперь почти ничего от AMFPHP фактически не осталось в классе, это просто вызов amf_encode и удаление первого байта, чтобы клиент мог понять, что он получает.
Легко, просто, быстро.