AMFPHP: Dizgeleştirme Flaş geçidi olmadan HTTP üzerinden Nesneler

2 Cevap php

Flash + AMFPHP harika bir kombinasyon. NetConnection Flash Remoting çeşitli nedenlerle için doğru aracı değil, Ama ne zaman durumlar vardır. Rob bir süre önce bu büyük bir yazı vardı: http://www.roboncode.com/articles/144

O da NetConnection Zend_AMF kullanarak gönderir işlevini çağırmak için POST ve AMF-istek paketi olmadan, bir http isteği AMF sunmak için nasıl güzel bir örnek vardır.

// 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();

Ben gerçekten bu yaklaşım gibi ve AMFPHP ile çoğaltmak için yardımlarınızı bekliyorum. Neden AMFPHP, sorabilir miyim? 'Yeni' versiyonu verileri seri ve seriyi kaldırmak için, AMF-ext, bir C PHP uzantısı kullanır. Bu ZendAMF hala kullanıyor php yol daha hızlıdır.

Tabii ki ben zaten AMFPHP etrafında oynanan ve gerekli nesneler oluşturmak ve seri hale sınıfını kullanmaya çalıştı. Ben bile geçerli bir AMF dize var, ama gerçek verileri her zaman bu 'Service.method' çağrısına bir cevap oldu alıcısını söyledim 'yöntemi paketi' tarafından sarıldı.

Yani AMFPHP yılında, ağ geçidi ve yöntem sargı olmadan, doğrudan Flash Nesneleri seri hale getirmek için bir yol var?

Teşekkürler.

2 Cevap

Tamam, o artık çalışmak lazım.

Bu biraz Zend_AMF çözüm daha karmaşık, ama daha hızlı. İşte benim kod:

$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);

Eğer yeni bir sınıf var gördüğünüz gibi AMFSimpleSerializer ben yili:

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;
    }
}

Bu sınıf yalnızca amfext yüklüyse çalışır, ancak kolayca php enocding süreci kullanmak modded olabilir. Ben AMFPHP yoğun değiştirilmiş bir sürümü bu inşa çünkü, bunu uygulamak vermedi.

Ben orada gerçek AMFPHP meslektaşları ile benim kodundan tüm sınıfları yerini umuyoruz. Yarın bu testi deneyin ve gerekirse bu cevabı güncelleme olacak.

Ben bitirdikten sonra şimdi AMFPHP neredeyse hiçbir şey aslında sınıfta kaldı kabul müvekkilinin alır anlamak böylece, bu ilk bayt sadece amf_encode için bir çağrı ve silme bulunuyor.

Kolay, basit, hızlı.

Bu amfext gerekmez basitleştirilmiş bir versiyonu:

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;

Satır ve gerekli alt dize yok. AMFPHP 1.9, Flex 3.4.