В настоящее время я использую следующие два метода в своем классе, чтобы выполнить работу:
function xseek($h,$pos){
rewind($h);
if($pos>0)
fread($h,$pos);
}
function find($str){
return $this->startingindex($this->name,$str);
}
function startingindex($a,$b){
$lim = 1 + filesize($a) - strlen($b)/2;
$h = fopen($a,"rb");
rewind($h);
for($i=0;$i<$lim;$i++){
$this->xseek($h,$i);
if($b==strtoupper(bin2hex(fread($h,strlen($b)/2)))){
fclose($h);
return $i;
}
}
fclose($h);
return -1;
}
Я понимаю, что это довольно неэффективно, особенно для PHP, но мне не разрешают использовать другие языки в моем плане хостинга.
Я выполнил пару тестов, и когда шестнадцатеричная строка находится в начале файла, она запускается быстро и возвращает смещение. Однако, если шестнадцатеричная строка не найдена, страница на некоторое время зависает. Это убивает меня изнутри, потому что в прошлый раз, когда я тестировал PHP и имел зависшие страницы, мой веб-хост закрыл мой сайт на 24 часа из-за слишком большого количества процессорного времени.
Есть ли лучший способ сделать это (найти смещение шестнадцатеричной строки в файле)? Есть ли определенные аспекты, которые можно улучшить, чтобы ускорить выполнение?
Я прочитал бы все содержимое файла в одну шестнадцатеричную строку и использовал бы strrpos, но я получал ошибки о превышении максимального объема памяти. Будет ли это лучшим способом, если я порежу файл и поищу большие куски с помощью strrpos?
редактирование:
Чтобы указать, я имею дело с файлом настроек для игры. Настройки и их значения находятся в блоке, где перед настройкой стоит 32-разрядное целое число, затем значение, 32-разрядное целое число перед значением и затем значение. Оба целых числа представляют длины следующих строк. Например, если значение параметра «test», а значение «0», оно будет выглядеть (в шестнадцатеричном формате): 00000004746573740000000130. Теперь, когда вы упомянули это, это кажется плохим способом. Чтобы вы посоветовали?
изменить 2:
Я попробовал файл, размер которого был ниже максимально допустимого, и попробовал strrpos, но он был намного медленнее, чем тот, который я пробовал.
изменить 3: в ответ Чарльзу:
Что неизвестно, так это длина блока настроек и где он начинается. То, что я действительно знаю, это то, что первые и последние настройки обычно. Я использовал эти методы поиска, чтобы найти местоположение первой и последней настройки и определить длину блока настроек. Я также знаю, где начинается родительский блок. Блок настроек обычно содержит не более 50 байтов в родительском блоке, поэтому я мог бы начать поиск первой настройки и ограничить область поиска. Проблема в том, что мне также нужно найти последние настройки. Длина блока настроек является переменной и может быть любой длины. Я мог прочитать файл так, как я предполагаю, что игра делает, читая размер настройки, читая настройку, читая размер значения, читая значение и т. Д., Пока я не достиг байта со значением -1, или FF в шестнадцатеричном виде Будет ли сочетание ограничения поиска первой настройки и правильного чтения настроек сделать это намного более эффективным?