2012-04-03 11 views
1

Ein ZVAL wird normalerweise mit emalloc erstellt, sodass es am Ende einer Seitenanforderung zerstört wird. Gibt es eine Möglichkeit, ein bestehendes ZVAL zu nehmen und im SAPI (äquivalent zu pemalloc) bestehen zu lassen? Was ist mit dem Erstellen eines ZVAL mit Pemalloc?ZVAL persistent über das SAPI machen?

Im Idealfall, was ich würde (in PHP-Code) zu tun, ist wie folgt:

class Object 
{ 
    public $foo; 
} 

if(!($object = persist("object"))) 
{ 
    $object = persist("object", new Object()); 
} 

$object->foo[] = "bar"; 

print count($object->foo); 

Auf jeder Anfrage count +1 zurückkehren würde (die gleiche PHP "Arbeiter" wird jedes Mal verwendet, vorausgesetzt, - I m mit PHP-FPM).

+0

Schöne Frage. +1 – Flavius

+1

Als eine interessante Anmerkung: Wir haben beschlossen, Plattformen zu wechseln. Wir werden jetzt Go verwenden. – Luke

+0

Kühl. Können Sie die Gründe erläutern? Ich schaue mich selbst an, es wäre schön, die Motivation anderer zu kennen. – Flavius

Antwort

1

Sie im Grunde http://lxr.php.net/opengrok/xref/PHP_5_3/ext/sysvshm/sysvshm.c#242 beschreiben sind

Die nächstgelegene Sie ohne Duplizierung Funktionalität erhalten können, die bereits in shm ist https://github.com/flavius/php-persist. Der Catch: in einem Prefork/Multiprocess SAPI (wie Apache), verschiedene Anfragen von demselben Client können in verschiedenen Prozessen enden, und als solche werden Sie verschiedene Daten sehen (versuchen Sie es unter Linux + Firefox mit einer harten Aktualisierung jedes Mal im Browser).

Hinweis: Es ist ein Work-in-Progress, derzeit besteht es nur eine ganze Zahl. Das Hinzufügen eines Arrays sollte trivial sein. Patches willkommen. Es benötigt weiterhin den Deserialisierungsteil und verwendet den ersten Parameter persist().

+0

Das ist eigentlich in Ordnung. Es muss nicht über verschiedene Prozesse/Threads hinweg bestehen bleiben. Das Ziel besteht darin, bestimmte Objekte vorab zu laden, so dass sie nicht jedes Mal neu initialisiert werden müssen. – Luke

+0

Was wäre, wenn ich einen Verweis auf das Eltern-Zval behalten und es als permanent kennzeichnen oder es vor dem Anforderungs-Shutdown kopieren würde. Das sollte funktionieren, ich bin mir einfach nicht sicher, wie ich ein bestehendes zval dauerhaft machen kann. Ich weiß, dass ich ein neues permanentes zval mit dem Makro ALLOC_PERMANENT_ZVAL erstellen kann. – Luke

+0

Was ist "die Eltern zval"? Jedenfalls würde es nicht funktionieren, weil das Zval in der Zwischenzeit verschwunden sein könnte, oder noch schlimmer: es könnte durch ein anderes Zval ersetzt worden sein (damit du mit einem anderen Wert in deinem Zval enden kannst, wenn du Glück hast, wenn nicht lch bekomme einen segfault). – Flavius

0

zend_object kann nicht persisent sein, daher können Sie dies nicht tun. Erweiterungen wie APC serialisieren das Objekt in den Speicher.