Server mit memcached, php-memcache und aktiviertem TYPO3 (>4.3.0) Caching Framework

memcached ist perfekt zum cachen eigener Inhalte. Damit der Server damit ausgeruestet ist:

apt-get install memcached

Ist ein Server mit mehr als 2 Kernen ausgestattet, sollte das threaded Paket installiert.

Der memcached sollte den freien RAM vollstaendig ausnutzen (nicht ueberbuchen, damit’s nicht ins SWAP geht).
Die Speichermenge kann in

/etc/memcached.conf

eingestellt werden.

PHP kann eine API anbieten (die Applikationen muessen sich aber schon selbstaendig um die Verwendung und Organisation des Caches kuemmern: z.B. TYPO3 Extensions koennen vom TYPO3 Core Caching Framework via memcache profitieren )

Um die PHP Erweiterung zu installieren:

apt-get install php5-dev
pecl install memcache-3.0.6

Ideale PHP Werte in

/etc/php5/conf.d/memcache.ini

sind

[memcache]
memcache.dbpath="/var/lib/memcache"
memcache.maxreclevel=0
memcache.maxfiles=0
memcache.archivememlim=0
memcache.maxfilesize=0
memcache.maxratio=0
memcache.protocol=ascii

… ergaenzend fuer TYPO3, ausgelagert in

/etc/php5/conf.d/t3memcache.ini

ist folgendes von Vorteil

memcache.allow_failover=1
memcache.chunk_size=32768
memcache.default_port=11211
memcache.hash_function=fnv
memcache.hash_strategy=consistent
memcache.max_failover_attempts=20

Das „binary“ Protokoll wird von PHP nicht vollstaendig unterstuetzt, daher muss „ascii“ als sehr parser-intensives und langsameres Protokoll verwendet werden.

Damit TYPO3 vom memcache profitiert, folgende Einstellungen in der localconf.php vornehmen:

// ----- Caching with MemCache 4.3 only ----
$TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations'] = array (
    'cache_hash' => array(
	'frontend' => 't3lib_cache_frontend_VariableFrontend',
	'backend' => 't3lib_cache_backend_MemcachedBackend',
	'options' => array(
	    'servers' => array('tcp://localhost:11211'),
	)
    ),
    'cache_pages' => array(
	'frontend' => 't3lib_cache_frontend_VariableFrontend',
	'backend' => 't3lib_cache_backend_MemcachedBackend',
	'options' => array(
	    'servers' => array('tcp://localhost:11211'),
	)
    ),
    'cache_pagesection' => array(
	'frontend' => 't3lib_cache_frontend_VariableFrontend',
	'backend' => 't3lib_cache_backend_MemcachedBackend',
	'options' => array(
	    'servers' => array('tcp://localhost:11211'),
	)
    ),
);
$TYPO3_CONF_VARS['SYS']['useCachingFramework'] = '1';
// ----- /Caching with MemCache 4.3 only----

hier eine aktualisierte Version, die nicht das komplette cacheConfigurations Array ueberschreibt (danke fuer den Hinweis, Steffen).

 
// ----- Caching with MemCache - doesn't overwrite cacheConfigurations array completely -----
$TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['cache_hash'] = array(
	'frontend' => 't3lib_cache_frontend_VariableFrontend',
	'backend' => 't3lib_cache_backend_MemcachedBackend',
	'options' => array(
		'servers' => array('tcp://localhost:11211')
	)
);
$TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['cache_pages'] = array(
	'frontend' => 't3lib_cache_frontend_VariableFrontend',
	'backend' => 't3lib_cache_backend_MemcachedBackend',
	'options' => array(
		'servers' => array('tcp://localhost:11211')
	)
);
$TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['cache_pagesection'] = array(
	'frontend' => 't3lib_cache_frontend_VariableFrontend',
	'backend' => 't3lib_cache_backend_MemcachedBackend',
	'options' => array(
		'servers' => array('tcp://localhost:11211')
	)
);
$TYPO3_CONF_VARS['SYS']['useCachingFramework'] = '1';
// ----- /Caching with MemCache - doesn't overwrite cacheConfigurations array completely -----

Steht ein weiterer, dezidierter memcache Server bereit, sollte der in die ’servers‘ Arrays mit aufgenommen werden. Um split-brain in den Caches zu vermeiden und die Last besser zu koordinieren, ist es aber besser fuer jedes Segment einen eigenen, einzelnen Server zu verwenden (wenn man 3 Server uebrig hat…)

eaccelerator best practice

Vernuenftige Einstellungen fuer den eaccelerator in der php.ini

/etc/php5/conf.d/eaccelerator.ini

… sollte enthalten:

zend_extension="/usr/lib/php5/20060613/eaccelerator.so"
eaccelerator.shm_size="64"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="1"
eaccelerator.compress="1"
eaccelerator.compress_level="5"

Wird check_mtime auf 0 gesetzt, beschleunigt der Cache noch deutlich schneller, allerdings finden updates erst mit sehr deutlicher Verzoegerung statt -> nix fuer CMS

eaccelerator update

Wird PHP aktualisiert und ist kein geeignetes re2c (fast nie) verfuegbar, kann in der Regel PHP nicht mehr starten, bzw. verursacht haessliche Fehler.

Abhilfe schafft, den eaccelerator neu zu kompilieren:

/etc/init.d/apache2 stop
kill -9 `pidof php5-cgi`
cd /usr/local/src/eaccelerator-0.9*
make clean
phpize
./configure --enable-eaccelerator --without-eaccelerator-use-inode
make
make install
/etc/init.d/apache2 start