Linux.memcached: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
(→PHP) |
||
Zeile 72: | Zeile 72: | ||
<code> | <code> | ||
// Stellt sicher, dass entweder | |||
// * die Verbindung zum MemCache besteht | |||
// * c_spc = -1, das bedeutet der Server läuft nicht | |||
function semiEnsureOpen() { | |||
global $m_spc; | |||
global $c_spc; | |||
global $errorlist; | |||
// Init? | |||
if ($m_spc == null) { | |||
$m_spc = new Memcached(TWEBSHOP_ID . SEQUENCE_NAMESPACE); | |||
if ($m_spc->addServer(SEQUENCE_HOST, SEQUENCE_PORT)) { | |||
$m_spc->add(SEQUENCE_NAME . SEQUENCE_NAMESPACE, 0); | |||
} else { | |||
trigger_error("Verbindung zu " . SEQUENCE_HOST . " fehlgeschlagen!", E_USER_ERROR); | |||
$c_spc = -1; | |||
$errorlist->add("memcached: Verbindung zu " . SEQUENCE_HOST . " fehlgeschlagen!"); | |||
} | |||
} | |||
} | |||
// liefert einfach die nächste Nummer eines | |||
// Zählers, der den "semi"-"persistent" ist, | |||
// das heisst er lebt länger als das Skript | |||
// erst durch einen Server-Neustart wird dessen | |||
// Wert auf "0" gesetzt. In einer Multi-User | |||
// Umgebung (wie durch das Internet massiv | |||
// gegeben) kann so ein fairer Zähler implementiert | |||
// werden. | |||
function getSemiPersistentSequence() { | |||
global $m_spc; | |||
global $c_spc; | |||
// Init? | |||
semiEnsureOpen(); | |||
// Increment! | |||
if ($c_spc < 0) | |||
$c_spc += -1; | |||
else | |||
$c_spc = $m_spc->increment(SEQUENCE_NAME . SEQUENCE_NAMESPACE, 1); | |||
// Return | |||
return $c_spc; | |||
} | } | ||
</code> | </code> |
Version vom 14. Juli 2016, 21:22 Uhr
- der Linux Server-Dienst "memcache" bietet eine Semi-Persistente Speicherung von Key+Value Paaren an. Die Daten bleiben erhalten bis der Memcache-Server neu gestartet wird.
- TWebShop konnektiert mit dem PHP-Modul "memcached" auf diesen Server um eine Round-Robin Sequenz zur erhalten. Darüber wählen alle beteiligten laufenden WebShop-Forks einen der laufenden XMLRPC- Dienste aus. Eine faire Lastverteilung wird so erreicht.
XMLSERVER-LaufendeNummer = inc(RoundRobinsequenz) mod XMLSERVER-AnzahlDienste
- Die Funktion XMLRPC.Versandkosten speichert ihr Ergebnis im memcache ab, sobald der Parameter Systemeinstellungen#memcacheHost gesetzt ist.
Installation
Server Dienst
# Vorbereitungen, Memcached, # PHP pecel # zypper install memcached systemctl enable memcached systemctl start memcached
Test
nc localhost 11211 version # # Die Antwort des Servers sollte sein # VERSION 1.4.2
Mehr als nur lokalen Zugriff erlauben
Als default läuft der memcache Server mit einem "-l <IP-Adresse>" Paramter. Zumeist ist eine Beschränkung auf die lokale Maschine gegeben: "-l 127.0.0.1". Um ihn im Netzwerk sichtbar zu machen muss dieser Anteil der Parameter aus dem Programmaufruf entfernt werden.
joe /etc/sysconfig/memcached
# # "" bedeute ALLE Netzwerkinterfaces, Sicherheits-Relevant # MEMCACHED_PARAMS=""
PHP Module
zypper install php5-pear zypper install php5-devel # PHP-Modul Memcache installieren # Es kommt eine Frage, ob memcache so installiert werden soll, # dass Session Variable dort gespeichert werden können, dies # ist für meinen Fall nicht notwendig pecl install memcache # im Verzeichnis /etc/php5/conf.d joe memcache.ini # Datei: /etc/php5/conf.d/memcache.ini # Nur diese Zeile reicht extension=memcache.so # # prüfen + starten rcapache2 restart php --modules
Verwendung
Console
memdump --servers=localhost
Pascal
PHP
// Stellt sicher, dass entweder
// * die Verbindung zum MemCache besteht
// * c_spc = -1, das bedeutet der Server läuft nicht
function semiEnsureOpen() {
global $m_spc;
global $c_spc;
global $errorlist;
// Init?
if ($m_spc == null) {
$m_spc = new Memcached(TWEBSHOP_ID . SEQUENCE_NAMESPACE);
if ($m_spc->addServer(SEQUENCE_HOST, SEQUENCE_PORT)) {
$m_spc->add(SEQUENCE_NAME . SEQUENCE_NAMESPACE, 0);
} else {
trigger_error("Verbindung zu " . SEQUENCE_HOST . " fehlgeschlagen!", E_USER_ERROR);
$c_spc = -1;
$errorlist->add("memcached: Verbindung zu " . SEQUENCE_HOST . " fehlgeschlagen!");
}
}
}
// liefert einfach die nächste Nummer eines
// Zählers, der den "semi"-"persistent" ist,
// das heisst er lebt länger als das Skript
// erst durch einen Server-Neustart wird dessen
// Wert auf "0" gesetzt. In einer Multi-User
// Umgebung (wie durch das Internet massiv
// gegeben) kann so ein fairer Zähler implementiert
// werden.
function getSemiPersistentSequence() {
global $m_spc;
global $c_spc;
// Init?
semiEnsureOpen();
// Increment!
if ($c_spc < 0)
$c_spc += -1;
else
$c_spc = $m_spc->increment(SEQUENCE_NAME . SEQUENCE_NAMESPACE, 1);
// Return
return $c_spc;
}
Putty
Mit Putty im Telnet-Modus auf den Host mit dem Port 11211 konnektieren.
version
eingeben oder
incr sequence.69VVTGKZ1 0
telnet 10.0.0.2 11211
Alle Werte löschen
via telnet
flush_all
via command-line
memcflush --servers=localhost:11211
Werte
sequence.69VVTGKZ1
Die Round-Robin-Sequenz des TWebShop