22
0
Fork 0
wiki/HowtoShareDance.md

214 lines
5.4 KiB
Markdown
Raw Permalink Normal View History

2016-12-29 11:25:39 +01:00
**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.**
# Howto Sharedance
Sharedance est un logiciel très simple conçu pour stocker des sessions en mémoire.
Il est notamment utilisé sur les [Skyblogs](http://www.skyrock.com/blog/)
Il n'est plus maintenu depuis 2006 mais vu sa simplicité, son utilisation peut encore être envisagée.
<http://www.pureftpd.org/project/sharedance>
## Installation
~~~
$ wget <http://download.pureftpd.org/pub/sharedance/sharedance-0.6.tar.gz>
2017-01-03 11:20:35 +01:00
$ tar xvf sharedance-0.6.tar.gz
2016-12-29 11:25:39 +01:00
$ cd sharedance-0.6
2017-01-03 11:20:35 +01:00
$ ./configure
2016-12-29 11:25:39 +01:00
$ make
# make install
~~~
Il peut être lancé ainsi :
~~~
# /usr/sbin/sharedanced --uid=65534 --gid=65534 --directory=/var/tmp --daemonize --expiration=10800
~~~
Son utilisation avec PHP se fait ainsi dans le fichier _php.ini_ :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
auto_prepend_file = /usr/local/etc/sharedance.php
;session.save_handler = user
;session.save_handler = files
~~~
avec un fichier _sharedance.php_ du type :
2017-01-03 11:20:35 +01:00
~~~{.php}
2016-12-29 11:25:39 +01:00
<?php
define('SESSION_HANDLER_HOST', '127.0.0.1');
define('SHAREDANCE_DEFAULT_PORT', 1042);
define('SHAREDANCE_DEFAULT_TIMEOUT', 10);
function sharedance_open($host, $port = SHAREDANCE_DEFAULT_PORT,
$timeout = SHAREDANCE_DEFAULT_TIMEOUT) {
global $GLOBAL_SHAREDANCE_FP;
global $GLOBAL_SHAREDANCE_SETTING_HOST;
global $GLOBAL_SHAREDANCE_SETTING_PORT;
global $GLOBAL_SHAREDANCE_SETTING_TIMEOUT;
if (!empty($GLOBAL_SHAREDANCE_FP)) {
return 0;
}
if (empty($host)) {
return -1;
}
$GLOBAL_SHAREDANCE_FP = @fsockopen($host, $port, $errno,
$errstr, $timeout);
if (!$GLOBAL_SHAREDANCE_FP) {
return -1;
}
$GLOBAL_SHAREDANCE_SETTING_HOST = $host;
$GLOBAL_SHAREDANCE_SETTING_PORT = $port;
$GLOBAL_SHAREDANCE_SETTING_TIMEOUT = $timeout;
return 0;
}
function sharedance_reopen() {
global $GLOBAL_SHAREDANCE_FP;
global $GLOBAL_SHAREDANCE_SETTING_HOST;
global $GLOBAL_SHAREDANCE_SETTING_PORT;
global $GLOBAL_SHAREDANCE_SETTING_TIMEOUT;
if (!empty($GLOBAL_SHAREDANCE_FP)) {
return 0;
}
if (sharedance_open($GLOBAL_SHAREDANCE_SETTING_HOST,
$GLOBAL_SHAREDANCE_SETTING_PORT,
$GLOBAL_SHAREDANCE_SETTING_TIMEOUT) !== 0) {
return -1;
}
return 0;
}
function sharedance_close() {
global $GLOBAL_SHAREDANCE_FP;
if (empty($GLOBAL_SHAREDANCE_FP)) {
return;
}
@fclose($GLOBAL_SHAREDANCE_FP);
$GLOBAL_SHAREDANCE_FP = FALSE;
}
function sharedance_store($key, $data)
{
global $GLOBAL_SHAREDANCE_FP;
if (sharedance_reopen() !== 0) {
return -1;
}
$key_len = strlen($key);
$data_len = strlen($data);
$s = sprintf('S%c%c%c%c%c%c%c%c',
($key_len >> 24) & 0xff, ($key_len >> 16) & 0xff,
($key_len >> 8) & 0xff, $key_len & 0xff,
($data_len >> 24) & 0xff, ($data_len >> 16) & 0xff,
($data_len >> 8) & 0xff, $data_len & 0xff);
$s .= $key;
$s .= $data;
fwrite($GLOBAL_SHAREDANCE_FP, $s);
if (@fgets($GLOBAL_SHAREDANCE_FP) !== "OK\n") {
sharedance_close();
return -1;
}
sharedance_close();
return 0;
function sharedance_fetch($key)
{
global $GLOBAL_SHAREDANCE_FP;
if (sharedance_reopen() !== 0) {
return -1;
}
$key_len = strlen($key);
$s = sprintf('F%c%c%c%c',
($key_len >> 24) & 0xff, ($key_len >> 16) & 0xff,
($key_len >> 8) & 0xff, $key_len & 0xff);
$s .= $key;
stream_set_blocking($GLOBAL_SHAREDANCE_FP, 0);
fwrite($GLOBAL_SHAREDANCE_FP, $s);
stream_set_blocking($GLOBAL_SHAREDANCE_FP, 1);
$data = '';
while (($tmp = @fread($GLOBAL_SHAREDANCE_FP, 4096)) != FALSE) {
$data .= $tmp;
}
sharedance_close();
if ($data === '') {
return FALSE;
}
return $data;
}
function sharedance_delete($key)
{
global $GLOBAL_SHAREDANCE_FP;
if (sharedance_reopen() !== 0) {
return -1;
}
$key_len = strlen($key);
$s = sprintf('D%c%c%c%c',
($key_len >> 24) & 0xff, ($key_len >> 16) & 0xff,
($key_len >> 8) & 0xff, $key_len & 0xff);
$s .= $key;
stream_set_blocking($GLOBAL_SHAREDANCE_FP, 0);
fwrite($GLOBAL_SHAREDANCE_FP, $s);
stream_set_blocking($GLOBAL_SHAREDANCE_FP, 1);
if (@fgets($GLOBAL_SHAREDANCE_FP) !== "OK\n") {
sharedance_close();
return -1;
}
sharedance_close();
return 0;
}
function session_handler_open($save_path, $session_name)
{
if (sharedance_open(SESSION_HANDLER_HOST) !== 0) {
return FALSE;
}
return TRUE;
}
function session_handler_close() {
sharedance_close();
return TRUE;
}
function session_handler_store($key, $data) {
if (sharedance_store($key, $data) !== 0) {
return FALSE;
}
return TRUE;
}
function session_handler_fetch($key) {
return sharedance_fetch($key);
}
function session_handler_delete($key) {
if (sharedance_delete($key) !== 0) {
return FALSE;
}
return TRUE;
}
function session_handler_gc($timeout) {
return TRUE;
}
session_set_save_handler('session_handler_open', 'session_handler_close',
'session_handler_fetch', 'session_handler_store',
'session_handler_delete', 'session_handler_gc');
?>
2017-01-03 11:20:35 +01:00
~~~