Я записываю уникальные просмотры страниц с использованием memcached и сохраняю их в дБ с интервалом 15 минут. Всякий раз, когда число пользователей увеличивается, memcached выдает мне следующую ошибку:
Memcache::get(): Server localhost (tcp 10106) failed with: Failed reading line from stream (0)
Я использую следующий код для вставки / обновления просмотров страниц в memcached
if($memcached->is_valid_cache("visiors")) {
$log_views = $memcached->get_cache("visiors");
if(!is_array($log_views)) $log_views = array();
}
else {
$log_views = array();
}
$log_views[] = array($page_id, $time, $other_Stuff);
$memcached->set_cache("visiors", $log_views, $cache_expire_time);
Следующий код извлекает массив из memcached, обновляет число X просмотров страниц в db и устанавливает остальные просмотры страниц в memcached
if($memcached->is_valid_cache("visiors")) {
$log_views = $memcached->get_cache("visiors");
if(is_array($log_views) && count($log_views) > 0) {
$logs = array_slice($log_views, 0, $insert_limit);
$insert_array = array();
foreach($logs as $log) {
$insert_array[] = '('. $log[0]. ',' . $log[1] . ', NOW())';
}
$insert_sql = implode(',',$insert_array);
if(mysql_query('INSERT SQL CODE')) {
$memcached->set_cache("visiors", array_slice($log_views, $insert_limit), $cache_expire_time); //store new values
}
}
}
Вставка / обновление вызывают блокировку потока, потому что я вижу много скриптов в ожидании их очереди. Я думаю, что я теряю просмотры страниц в процессе обновления. Любые предложения, как избежать ошибок чтения memcached и сделать этот код идеальным?