phpbar.de logo

Mailinglisten-Archive

[php] Extending PHP, Zend API

[php] Extending PHP, Zend API

Ulf Wendel UW_(at)_NetUSE.DE
Thu, 09 Mar 2000 14:03:28 +0100


Till Gerken wrote:
> Genau das war meine Frage. :) Die Funktionen ohne _ex basteln bei mit
> Referenzen übergebenen Parametern rum, indem sie die übergebenen Werte
> zuerst auf neue Speicherbereiche kopieren. Johann-Peter Hartmann vermutete,
> daß dies evtl. deswegen passiert, um die Variablen gegen versehentliche
> Änderungen zu schützen... ich habe das noch nicht überprüft, hört sich aber
> durchaus schlüssig an, da die neu erstellten Kopien der Variablen nichts
> mehr mit dem Original zu tun haben. Bleibt die Frage, ob bei einem
> Funktionsaufruf alle Variablen, die _nicht_ via Referenzen übergeben werden,
> automatisch auf temporäre Kopien gelagert werden.

Hallo Till, 
hallo Johann-Peter,

ich kann nachvollziehen, daß getParameters() zur Sicherheit
Kopien erstellt. Die Funktionalität hat getParametersEx() nicht.
In der neuen API übernimmt convert_to_[long|...]_ex diese
Aufgabe. 

Es bleibt die Frage, wie mit Variablen umgegangen wird, die nicht
via Referenz übergeben werden. Wenn Du getParameters() benutzt
wird kopiert, bei getParametersEx() nicht. 

Ich habe mir mal eine neue auf Zend optimierte Funktion
geschnappt, wie array_merge aus standard/array.c . Hier wird
getParametersEx aber keine convert_to_[long|...]_ex benutzt. In
dieser PHP Funktion wird nur die Zend API aufgerufen. Die
Funktion wird nicht durch das resourcenaufwendige, zwangsweise
Kopieren von Argumenten durch getParameters() aufgehalten.
 
PHP Funktionen, die selbst mit den Argumenten arbeiten wollen,
müssen (sollten...) eine der convert_to_[long|...]_ex Funktionen
benutzen, um aus dem struct die Daten in der gewünschten Form zu
isolieren. Wohl aus Sicherheitsgründen werden die Daten vorher
kopiert, aber nur dann, wenn unbedingt notwendig. Wann genau wird
kopiert? Ich spiel mal Parser bei convert_to_long_ex:

if ((*ppzv)->type!=IS_LONG) {        
  if (!(*ppzv)->is_ref) {            
    zval *orig_ptr  = *(ppzv);
    if (orig_ptr->refcount>1) {
       [...KOPIEREN...]
    }
  }                                  

Es wird kopiert, wenn der Typ nicht stimmt und es keine Referenz
(Sicherheitskopie) ist, richtig? Für mich sieht es so aus, als
habe man eine resourcenfressende Aufgabe sinnvoll verlagert und
zögert die Kopie so weit wie möglich raus.

Ulf

-- 
Ulf Wendel
NetUSE Kommunikationstechnologie GmbH
Siemenswall, D-24107 Kiel, Germany
Fon: +49 431 386435 00  --  Fax: +49 431 386435 99


php::bar PHP Wiki   -   Listenarchive