d4f
Kaffee? Wo?
Ich brauchte heute eine php-benutzbare RCP-Loesung
(Remote Procedure Call, also das Benutzen von Funktionen oder Klassen auf einem entfernten Server als ob sie lokal vorliegen wuerden)
Voraussetzungen
Naja ganz habe ich meine Voraussetzungen nicht erfuellen koennen, ich musste JSON-RPC ergaenzen um es "stateful" zu kriegen.
Durch Zeitdruck und Muedigkeit bedingt ist es hack'n code geraten, aber ich bin fuer Feedback und Kritik immer offen =)
Sofern aber ein Client nicht die notwendige Protokollergaenzung mitliefert um sich als stateful-kompatibel auszugeben faellt die Serverseite auf den Standard zurueck.
Benutzung:
Ich gehe von einer Klasse auf Serverseite aus. Funktionen ohne Klasse sind _nicht_ implementiert.
Serverseite:
Clientseite:
Ein paar Details zur Implementierung:
Basiert auf Ideen dieser Implementierung: http://jsonrpcphp.org/
Protokoll-Ergaenzung
-> Request:
Sicherheit
nur Funktionen die mit 'public' markiert sind koennen aufgerufen werden. Variablen, sowie protected- und private-Funktionen hingegen nicht.
Jeder Client kann anfragen stellen. Die Authentifizierung -sofern gewuenscht- muss durch die Klasse selbst erfolgen.
Eine Session bedarf zum Resume der Session-ID, dem Session-Key sowie der gleichen IP als die erste Anfrage.
Eine Session ist nur fuer ein paar Sekunden gueltig.
Eine Session ist [aktuell] nur waehrend der Skriptlaufzeit des Clients gueltig
Speicherung
Die serverseitige Klasse wird nach _jedem_ Aufruf mit serialize() in einen String verwandelt und in einer sqlite-Datenbank gespeichert was der Leistung abtraeglich ist. Der Einsatz von Alternativen wie memcachedb waere zumindest teilweise optimaler aber nicht allround-tauglich.
Lizenz
Ich bitte um Feedback, Anregungen und Kritik
(Remote Procedure Call, also das Benutzen von Funktionen oder Klassen auf einem entfernten Server als ob sie lokal vorliegen wuerden)
Voraussetzungen
- Muss ein Standard sein (ich habe JSON RPC gewaehlt)
- muss stateful sein (gespeicherte Variablen der Klasse muessen bei dem naechsten Funktionsaufruf noch vorhanden sein)
- Muss ueber HTTP mit einem normalen Webserver und PHP funktion
- Darf nicht vom Client modifizierbar sein (was das Zwischenspeichern auf Clientseite ausschliesst)
Naja ganz habe ich meine Voraussetzungen nicht erfuellen koennen, ich musste JSON-RPC ergaenzen um es "stateful" zu kriegen.
Durch Zeitdruck und Muedigkeit bedingt ist es hack'n code geraten, aber ich bin fuer Feedback und Kritik immer offen =)
Sofern aber ein Client nicht die notwendige Protokollergaenzung mitliefert um sich als stateful-kompatibel auszugeben faellt die Serverseite auf den Standard zurueck.
Benutzung:
Ich gehe von einer Klasse auf Serverseite aus. Funktionen ohne Klasse sind _nicht_ implementiert.
Serverseite:
PHP:
class meineklasse {
private $MeinName = 'undefiniert';
public function SpeicherName($name) {
$this->MeinName = $name;
return true;
}
public function SagHallo() {
return "hallo ".$this->MeinName;
}
}
include 'jsonRPCServer.php';
$json = new jsonRPCServer;
$json->handle('meineklasse') OR die("Not a JSON-RPC request!");
Clientseite:
PHP:
include 'jsonRPCClient.php';
$meineklasse = new jsonRPCClient('http://api.beispiel.tld/server.php',true); //true triggert stateful
echo "<br>".$meineklasse->SagHallo();
$meineklasse->SpeicherName('Max Mustermann');
echo "<br>".$meineklasse->SagHallo();
Ein paar Details zur Implementierung:
Basiert auf Ideen dieser Implementierung: http://jsonrpcphp.org/
Protokoll-Ergaenzung
-> Request:
- <session> [bool] If defined and true, use stateful support
- <sid> [int] If defined resume an existing session
- <skey> [var] Security-Key corresponding to the session-id
Sicherheit
nur Funktionen die mit 'public' markiert sind koennen aufgerufen werden. Variablen, sowie protected- und private-Funktionen hingegen nicht.
Jeder Client kann anfragen stellen. Die Authentifizierung -sofern gewuenscht- muss durch die Klasse selbst erfolgen.
Eine Session bedarf zum Resume der Session-ID, dem Session-Key sowie der gleichen IP als die erste Anfrage.
Eine Session ist nur fuer ein paar Sekunden gueltig.
Eine Session ist [aktuell] nur waehrend der Skriptlaufzeit des Clients gueltig
Speicherung
Die serverseitige Klasse wird nach _jedem_ Aufruf mit serialize() in einen String verwandelt und in einer sqlite-Datenbank gespeichert was der Leistung abtraeglich ist. Der Einsatz von Alternativen wie memcachedb waere zumindest teilweise optimaler aber nicht allround-tauglich.
Lizenz
Code:
Copyright 2010 by Daniel Ruppert < daniel@kaffi.lu >
License: http://creativecommons.org/licenses/by-sa/3.0/
[License addition]
You are required to submit any extensions or modifications to the class to the original author's email address. (diff-patch'es preferred)
within 30 days of modification. Failure to do so revokes you the license for lifetime. I made it available, it's only fair you make it available too
Ich bitte um Feedback, Anregungen und Kritik
Attachments
Last edited by a moderator: