Gå til innhold

Objekter som lever på tvers av sessions?


Anbefalte innlegg

Videoannonse
Annonse

Du leter etter et alternativ til å lagre de i sessions? Istedenfor å lagre selve objektet, kan en kanskje lagre alt det innholder, dersom det lar seg gjøre, i destructern og hente i constructern. Med en veldig generisk kode kan det gjøres like lett som med sessions.

 

PS: Jeg tenker bare litt høyt her, har ikke testet koden på noen måte.

 

<?php

class Foo {

	var $firstProperty = 'testafkijsg';
	var $secondProperty = 'aeredaraergae';
	var $thirdProperty = 'aes<adadad';

	function __construct () {
		$file = unserialize ( file_get_contents ( 'cache.tmp' ) );
		$this -> setData ( $file );
	}

	function __destruct () {
		$file = serialize ( $this -> getData () );
		file_put_contents ( 'cache.tmp', $file );
	}

	public function setData ( $data ) {
		if ( is_array ( $data ) && count ( $data ) ) {
			$valid = get_class_vars ( get_class ( $this ) );
			foreach ( $valid as $var => $val ) {
				if ( isset ( $data[$var] ) ) {
					$this -> $var = $data[$var];
				}
			}
		}
	}

	public function getData () {
		$me = new ReflectionClass ( $this );
		$vars = $me -> getDefaultProperties ();
		foreach ( $vars as $var => $val ) {
			$return[$var] = $this -> $var;
		}
		return $return;
	}

}

?>

Endret av Jonas
Lenke til kommentar

Synes Jonas er inne på noe her, men er det ikke bare å bruke serialize() og unserialize()? Disse funksjonene konverterer et objekt (og alle data som finnes i det) til en tekst-streng (og med unseriaize, tilbake til objektet igjen). Du kan så lagre strengen i en tekstfil/database etter behov, og dermed hente opp objektet igjen.

 

Eksempel:

// Objektet ditt
$yourObject=new objectOfSomeSort();


// Gjøre om til en tekst-streng
$objectAsString=serialize($yourObject);

// 
// Så lagrer du objektet, f.eks. i en fil.
//

// Vekke objektet tilbake til live
$yourObject=unserialize($objectAsString);

Endret av Per Kristian
Lenke til kommentar

Både ja og nei. Forutsatt at du har memcache kjørende på serveren har man memcache for PHP (pecl). Med det kan man lagre unna slike ting. Problemet er at såvidt jeg veit er du ikke garantert at den fortsatt er der neste gang. Dvs. hvis memcache-sesjonen går tom for minne vil den dumpe det som det har gått mest tid siden har vært i bruk. Mao., du får cachet tilkoblingen, men kan risikere at du må koble til på nytt hvis det fortsatt ikke er cachet.

Lenke til kommentar

Men, hvorfor minnet? En enkel løsning ville være å lagre serialized versjon i en fil, så kan alle relevante script unserialize filen og så bruke den. Dermed unngår du problemer med at den forsvinner fra minnet.

 

Men, pass på:

 

1. Åpne filer vil antakeligvis lukkes når et script avsluttes (autmoatisk garbage collecting), dvs. en åpen fil i objektet vil lukkes når scriptet som bruker objektet avslutter.

2. Sockest/database-connections vil lide samme skjebne.

3. Hva skjer dersom flere script leser til objektet samtidig? Du må passe på at kun ett script har skrive-tilgang til objektet.

 

Vil vel igrunn foreslå at du vurderer en annen løsning. Det er ganske mange problemer med denne.

Lenke til kommentar

Ok da får jeg ta en annen tilnærming til problemet. Neste spørsmål blir da: Er det noen enkel metode for interprocess communication i php standardbiblioteket?

 

Gitt at jeg har en bakgrunnsprosess kjørende som gjør en del ting, og en rekke php-scripts som oppdaterer/henter informasjon fra denne prosessen. Er det noen enkelt "php måte" å gjøre det på, eller må jeg da grave meg ned i platformspesifikke teknologier som COM/Unix pipes/dbus ?

Lenke til kommentar

Finnes såvidt jeg veit ikke noe slikt. PHP er såpass bygget opp rundt nettsider og det man trenger til slikt at ting som innebærer prosesser, minne etc. er tilnærmet fraværende. Mulig det finnes en utvidelse som kan være brukbar (sjekk pecl.php.net), men utover det må man ev. lage utvidelsen selv, kommunisere via socket e.l., eller bruke et bedre egnet språk.

Lenke til kommentar

Hoeres ikke helt ut som om PHP er det riktige spraaket for noe saant nei... Perl kan sikkert fikse biffen, men det kan vel kanskje ogsaa Python som er litt enklere i bruk. Begge er rimelig like PHP i syntaks (dog med litt forvirrende unntak her og der)

Lenke til kommentar
Gitt at jeg har en bakgrunnsprosess kjørende som gjør en del ting, og en rekke php-scripts som oppdaterer/henter informasjon fra denne prosessen. Er det noen enkelt "php måte" å gjøre det på, eller må jeg da grave meg ned i platformspesifikke teknologier som COM/Unix pipes/dbus ?

 

Ja, gitt at du har en bakgrunnsprosess noe som du kan kommunisere med over socket, så burde vel det være lett? http://docs.php.net/manual-lookup.php?patt...ket&lang=en

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...