У меня большой двумерный массив, который я сериализовал для сохранения в файле.Размер сериализованного файла составляет около 9,5 МБ, а чтение с диска занимает около 0,05 секунды.Для доступа к массиву процесс десериализации занимает около 1,3 секунд, что слишком долго.
Что я хочу сделать, это сначала десериализовать массив, а затем сохранить этот массив как переменную кэша APC.Я сталкиваюсь с проблемой наличия ошибки тайм-аута сервера / не найден, когда я использую apc_store
или apc_add
.Если я закомментирую код apc_store, то все будет хорошо, но тогда массив не будет кэширован.У меня нет проблем с кэшированием меньших тестовых файлов / массивов размером около 1 МБ.Из приведенного ниже php-кода я обнаружил, что объем памяти рассматриваемого массива составляет около 22 МБ.
Это мои настройки apc в php.ini
apc.shm_segments = 1
apc.shm_size = 512M
apc.ttl = 7200
apc.user_ttl = 7200
apc.num_files_hint = 1024
apc.enable_cli = 1
apc.max_file_size = 512M
apc.stat=1
Я тестирую свой код на локальной машине с помощью xampp.Может кто-нибудь предложить, как я могу исправить / обойти эту проблему с тайм-аутом сервера?
Вот только моя процедура тестирования кеша:
$startunser = microtime(true);
if ($quote = apc_fetch('serialfile')) {
echo "<br> serfile [cached] ";
}
else {
$start_memory = memory_get_usage();
$sF = "seri.txt";
$sxx = file_get_contents($sF);
$pro = unserialize($sxx);
apc_store('serfile', $pro, 10);
echo "<br>serfile is NOT cached ";
echo memory_get_usage() - $start_memory;
}
$elapsedunser = microtime(true) - $startunser;
echo "<p>The unserialize process took $elapsedunser seconds";
return;
Также в качестве интересного примечания для любопытства любого человека,когда я вспоминаю (используя apc_fetch) массив из APC, который не был сериализован из сериализованного файла размером приблизительно 1 МБ, процесс выборки фактически был дольше, чем просто чтение файла с диска и десериализация файла (.5 против .4 секунды).Сначала я тоже не поверил.
TIA