phpbar.de logo

Mailinglisten-Archive

[php] wie: wddx_serialize_vars("this->data") ?

[php] wie: wddx_serialize_vars("this->data") ?

Ulf Wendel ulf_(at)_redsys.de
Thu, 08 Jun 2000 01:36:06 +0200


Tobias Ratschiller wrote:
> 
> > Danke! Ich darf noch ergänzen: das Ding ist schneckenlangsam, wenn
> > größere Datenmengen vorliegen :-(. Reiz mich fast es mal mit einer PHP
> > Implementation zu vergleichen...
> 
> Das erstaunt mich ein bißchen, zumal man in PHP 4.0 bei den
> Session-Management-Funktionen zwischen dem PHP-Serializer und WDDX wählen
> kann. Eine schlechte Performance wäre dabei nicht so gut.

Hallo Tobias, 

jetzt brauche ich noch mal Nachhilfe. Die wddx Funktionen scheinen mir
denkbar ungeeignet für die Session-Management. Einzelne assoziative
Arrays, die ich mit wddx_serialize_vars() serialize und gleich wieder
mit wddx_deserialize() herstelle, verändern ihre Struktur. 

<pre>
<?php
$data = array ( 0 => true, "stringindex" => "stringvalue" );
$wddx = wddx_serialize_vars("data");

print var_dump(array ("data" => $data))."\n";
print var_dump(wddx_deserialize($wddx))."\n";

printf("XML: <code>%s</code>", htmlspecialchars(  $wddx)); 
?> 
</pre>

Ohne jetzt die Specs gelesen zu haben, nur mit etwas try-and-error und
einem kurzen Blick auf die DTD würde ich folgenden Output für dieses
assoziative Array erwarten:

<wddxPacket version='1.0'>
  <header/>
  <struct>
    <var name='data'>
      <array length='2'>
        <boolean value='false'/>
        <var name='stringindex'>
          <string>stringvalue</string>
        </var>
      </array>
    </var>
   </struct>
</wddxPacket>

Ich erhalte jedoch folgende:

<wddxPacket version='1.0'>
  <header/>
  <data>
    <struct>
      <var name='data'>
        <array length='2'>
          <boolean value='false'/>
          <string>stringvalue</string>
        </array>
      </var>
    </struct>
  </data>
</wddxPacket>

Wenn ich diesen XML Code mit wddx_deserialize() wieder in ein Array
wandle, so erhalte ich ein "echtes" Array. Es hat folgende, veränderte
Form:
$data = array ( 0 => true, 1 => "stringvalue" );

Benutzt man das von mir vorgeschlagene XML mit wddx_deserialize() hat
alles seine gewohnte Ordnung:
$data = array ( 0 => boolean, "stringindex" => "stringvalue" );
 
> Mach doch mal einen Vergleich mit nativem PHP und zeig das Resultat Andrei.

Meine Behauptung, daß die wddx() Funktionen langsam seien rührte aus der
Beobachtung eines Scripts welches versucht ein mehrdimensionales (7
Ebenen), assoziatives Array mit rund 5200 Elementen zu serializen.
Benötigt werden auf meiner langsamen Kiste 303 Sekunden zur Erzeugung
von 330kb XML Code. Bei etwa 1200 Elementen (7 Ebenen) sind es 20
Sekunden für 82kb XML Code. 

Ich gebe ja zu, daß dies große Datenmengen sind und ich die Win32
Distribution quäle, aber die Werte sind enttäuschend. 

Ich lese mal die Specs und den PHP Source und versuche mal einen
Benchmark mit PHP Code in den nächsten Tagen. 

Ulf


php::bar PHP Wiki   -   Listenarchive