<?


class Win_cache {
	public $path_to_folder = 'cache_prob';

	// загружает пробник, проверяет md5 и возвращает его скорость
	private function _get_prob($fname, $prob_md5) {
		$fname =  $this->path_to_folder . '/' . $fname;

		if(!file_exists($fname))
			throw new Error_def("Файл $fname отсутствует");

		$timeIn = microtime(true);
		$fdata = file_get_contents($fname);
		$time = microtime(true) - $timeIn;
		if(!$time)
			$time = 0.0000001;

		$speed_mb = 1 / $time;

		if($prob_md5 != md5($fdata))
			throw new Error_def("Файл $fname поврежден");

		return $speed_mb;
	}

	// cache_speed_mb - минимальная скорость которая считается скорость чтения кеша
	function clear_file_cache() {
		GLOBAL $log;

		$log->line('Очистка файлового кеша');

		$prob_num = 200;

		$Gen_str = new Gen_str();
		$mb1 = $Gen_str->simple(1024*1024);
		$prob_md5 = md5($mb1);

		$mb100 = '';
		for($i=1; $i<=100; $i++) 
			$mb100 .= $mb1;

		// создаем пробники. Каждый раз заново надо.
		for($i=1; $i<=$prob_num; $i++) {
			$prob_fname = $this->path_to_folder . '/' . $i;
			file_put_contents($prob_fname, $mb1);
		}

		// высчитываем скорость чтения из кеша
		sleep(1);
		$sum_speed = 0;
		for($i=1; $i<=5; $i++) {
			$prob_fname = $i;
			$sum_speed += $this->_get_prob($prob_fname, $prob_md5);
		}

		// средняя скорость кеша
		$cache_speed = $sum_speed / 5;
		$log->line('скорость кеша:' . $cache_speed);
		$cache_speed *= 0.5; // порог кеша
		$log->line('скорость порога:' . $cache_speed);

		// запускаем тест
		$Big_mas = array();
		$read_no_cache = 0;

		for($i=1; $i<=$prob_num; $i++) {
    			// проверяем скорость пробника
			$prob_fname = $i;
			$speed_mb = $this->_get_prob($prob_fname, $prob_md5);
			$log->line('скорость пробника:' . $speed_mb);

			// если прочитался из кеша
			if($speed_mb >= $cache_speed  AND $read_no_cache < 5) {
				// жрем память
				$log->line('жрем память');
				//for($k=1; $k<=1; $k++) {
	    				$Big_mas[] = '1' . $mb100;
	    			//}
	    			usleep(2*1000*1000);
	    			//$read_no_cache = 0; // обнуляем потому что файл прочитался не из кеша
			}
			// прочитался с диска
			else $read_no_cache ++;
			
		}

		// чтобы убедиться что это не единичный файл прочитан с диска а потом читается из кеша.
		if($read_no_cache)
			return true;
		else
			return false;
	}

}


?>