سؤال

Flash + AMFPHP هو مزيج رائع. ولكن هناك حالات ، عندما لا يكون الفلاش عن بعد مع NetConnection الأداة الصحيحة ، لأسباب مختلفة. كان لدى روب منشورًا رائعًا على هذا منذ بعض الوقت: http://www.roboncode.com/articles/144

لديه أيضًا مثال رائع على كيفية توصيل AMF إلى طلب HTTP ، دون حزمة POST و AMF-Request للاتصال بالوظيفة التي يرسلها NetConnection ، باستخدام Zend_AMF.

// 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 ، تسأل؟ يستخدم الإصدار "الأحدث" AMF-Ext ، امتداد C PHP ، لتسلسل البيانات وتجاهلها. إنه أسرع بكثير من PHP Way Zendamf لا يزال يستخدم.

بالطبع لقد لعبت بالفعل مع AMFPHP وحاولت إنشاء الكائنات اللازمة واستخدام فئة المسلسل. حتى أنني حصلت على سلسلة AMF صالحة ، لكن البيانات الحقيقية كانت ملفوفة دائمًا بواسطة "حزمة طريقة" أخبرت المتلقي أن هذه الإجابة على "خدمة. method".

فهل هناك طريقة لتسلسل كائنات الفلاش مباشرة ، بدون غلاف البوابة والطريقة ، في AMFPHP؟

شكرًا.

هل كانت مفيدة؟

المحلول

حسنًا ، لقد جعل الأمر يعمل الآن.

إنه أكثر تعقيدًا قليلاً من حل 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 ، ولكن يمكن تعديلها بسهولة لاستخدام عملية Enocding PHP. لم أقم بتطبيقه ، لأنني قمت ببناء هذا على نسخة معدلة بشكل كبير من AMFPHP.

آمل أن أكون قد استبدلت جميع الفصول من الكود الخاص بي مع نظيرات AMFPHP الحقيقية. سأحاول اختبار هذا غدًا وتحديث هذه الإجابة إذا لزم الأمر.

بعد انتهائي ، أدركت أنه الآن لم يترك أي شيء من AMFPHP تقريبًا في الفصل ، إنها مجرد دعوة إلى AMF_ENCODE وحذف البايت الأول حتى يتمكن العميل من فهم ما يحصل عليه.

سهل ، بسيط ، سريع.

نصائح أخرى

هذه نسخة مبسطة لا تحتاج إلى 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 ، Flex 3.4.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top