<?php
if(!class_exists('Memcached')){
        die('class Memcached not found.');
}

$memcached_host = '127.0.0.1';
$memcached_port = '11211';
$memcached_socket = "";

for ($i=1; !empty($argv[$i]); $i++)
{
	if ($argv[$i] == "-h")
	{
			$i++;
			$memcached_host = $argv[$i];
	}

	if ($argv[$i] == "-p")
	{
			$i++;
			$memcached_port = $argv[$i];
	}
	
	if ($argv[$i] == "-s")
	{
			$i++;
			$memcached_socket = $argv[$i];
	}
}

$mc  = new Memcached();

// Adding options
$mc->setOption(Memcached::OPT_BINARY_PROTOCOL, FALSE);
$mc->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY);
$mc->setOption(Memcached::OPT_TCP_NODELAY, TRUE);
$mc->setOption(Memcached::OPT_NO_BLOCK, TRUE);
$mc->setOption(Memcached::OPT_BUFFER_WRITES, FALSE);
$mc->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);

if (!empty($memcached_socket))
{
	$mc->addServer($memcached_socket, 0);
	$memcached_server = $memcached_socket;
}
else
{
	$mc->addServer($memcached_host, $memcached_port);
	$memcached_server = $memcached_host . ":" . $memcached_port;
}

if(!$mc){
        die('Memcached connection error.');
}

echo "\n--Memcached server '" . $memcached_server . "' will be used\n\n";

$data = str_pad('', 1024, '0');
$msetData = [];
for ($i=0; $i < 10000; $i++) {
        $msetData[$i%10]['bench_'.$i] = $data;
}

$start = microtime(1);
$time = [];

echo "Start testing.\r\n";

$mc->touch('bench_test', 1);

recordTime('touch');

echo "1KB data set, 10000 times, starting...          ";
for ($i=0 ; $i< 10000 ; $i++) {
        $mc->set('bench_'.$i, $data);
        if($i % 100 != 0) continue;

    echo "\033[5D";
    echo str_pad($i/100+1, 3, ' ', STR_PAD_LEFT) . " %";
}
echo "\r\n";

recordTime('set');


echo "1KB data get, 10000 times, starting...          ";
for ($i=0 ; $i< 10000 ; $i++) {
        $mc->get('bench_'.$i);
        if($i % 100 != 0) continue;

    echo "\033[5D";
    echo str_pad($i/100+1, 3, ' ', STR_PAD_LEFT) . " %";
}
echo "\r\n";

recordTime('get');


echo "1KB data delete, 10000 times, starting...       ";
for ($i=0 ; $i< 10000 ; $i++) {
        $mc->delete('bench_'.$i);
        if($i % 100 != 0) continue;

    echo "\033[5D";
    echo str_pad($i/100+1, 3, ' ', STR_PAD_LEFT) . " %";
}
echo "\r\n";

recordTime('delete');


echo "1KB data, 1000 row setMulti, 10 times, starting...        ";
for ($i=0 ; $i< 10 ; $i++) {
        $mc->setMulti($msetData[$i]);

    echo "\033[5D";
    echo str_pad($i*10+10, 3, ' ', STR_PAD_LEFT) . " %";
}
echo "\r\n";

recordTime('setMulti');

echo "1KB data, 1000 row getMulti, 10 times, starting...        ";
for ($i=0 ; $i< 10 ; $i++) {
        $s = $mc->getMulti(array_keys($msetData[$i]));

    echo "\033[5D";
    echo str_pad($i*10+10, 3, ' ', STR_PAD_LEFT) . " %";
}
echo "\r\n";

recordTime('getMulti');


echo "1KB data, 1000 row deleteMulti, 10 times, starting...     ";
for ($i=0 ; $i< 10 ; $i++) {
        $s = $mc->deleteMulti(array_keys($msetData[$i]));

    echo "\033[5D";
    echo str_pad($i*10+10, 3, ' ', STR_PAD_LEFT) . " %";
}
echo "\r\n";

recordTime('deleteMulti');

print_r($time);

function recordTime($action){
        global $start;
        global $time;
        static $last;
        if(!$last) $last = $start;

        $time[$action] = number_format((microtime(1) - $last)*1000, 2);
        $last = microtime(1);
}
