2

Flash+AMFPHPは素晴らしい組み合わせです。ただし、さまざまな理由により、NetConnectionを使用したFlashRemotingが適切なツールではない場合があります。ロブはこれについて少し前に素晴らしい投稿をしました:http ://www.roboncode.com/articles/144

彼はまた、Zend_AMFを使用してNetConnectionが送信する関数を呼び出すPOSTおよびAMF-requestパッケージを使用せずに、AMFをhttp要求に配信する方法についての良い例を持っています。

// Include the Zend Loader
include_once 'Zend/Loader.php';
// Tell the Zend Loader to autoload any classes we need
// from the Zend Framework AMF package
Zend_Loader::registerAutoload();

// Create a simple data structure
$data = array('message' => 'Hello, world!');
// Create an instance of an AMF Output Stream
$out = new Zend_Amf_Parse_OutputStream();
// We will serialize our content into AMF3 for this example
// You could alternatively serialize it as AMF0 for legacy
// Flash applications.
$s = new Zend_Amf_Parse_Amf3_Serializer($out);
$s->writeObject($data);

// Return the content (we have found the newline is needed
// in order to process the data correctly on the client side)
echo "\n" . $out->getStream();

私はこのアプローチが本当に好きで、AMFPHPでそれを複製するのはとてもうれしいでしょう。なぜAMFPHP、あなたは尋ねますか?「最新」バージョンは、C PHP拡張機能であるamf-extを使用して、データをシリアル化および逆シリアル化します。ZendAMFがまだ使用しているphpの方法よりもはるかに高速です。

もちろん、私はすでにAMFPHPをいじって、必要なオブジェクトを作成し、Serializerクラスを使用しようとしました。有効なAMF文字列も取得しましたが、実際のデータは常に「メソッドパッケージ」によってラップされ、これが「Service.method」呼び出しに対する応答であることを受信者に通知していました。

では、AMFPHPで、ゲートウェイとメソッドラッパーを使用せずに、Flashオブジェクトを直接シリアル化する方法はありますか?

ありがとう。

4

2 に答える 2

4

さて、それは今それが機能するようになりました。

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がインストールされている場合にのみ機能しますが、phpenocdingプロセスを使用するように簡単に変更できます。大幅に変更されたバージョンのAMFPHPでこれを構築したため、実装しませんでした。

コードのすべてのクラスを実際のAMFPHPの対応するクラスに置き換えたことを願っています。明日これをテストし、必要に応じてこの回答を更新しようと思います。

終了した後、AMFPHPからのほとんど何もクラスに残っていないことに気付きました。これは、amf_encodeの呼び出しと、クライアントが取得したものを理解できるようにするための最初のバイトの削除にすぎません。

簡単、シンプル、高速。

于 2010-01-19T20:55:54.483 に答える
1

これは、amfextを必要としない簡略化されたバージョンです。

require_once( 'amfphp/core/amf/app/Gateway.php');
require_once( AMFPHP_BASE . 'amf/io/AMFSerializer.php');

$data = array('message' => 'Hello, world!')

$serializer = new AMFSerializer();
$serializer->writeAmf3Data( $data );

print $serializer->outBuffer;

改行と部分文字列は必要ありません。AMFPHP 1.9、Flex3.4。

于 2011-08-13T11:17:15.803 に答える