обработка ошибок file_get_contents (out of memory)
Есть скрипт, который качает файлы по ссылкам из excel файла.
try {
$file = file_get_contents(trim($link));
}
catch (Exception $e) {
debug("{$filepath}/{$info['filename']}}"."\n");
echo("{$filepath}/{$info['filename']}}"."\n");
$file = fopen("{$filepath}/{$info['filename']}}".".txt", "w");
$direct_link = trim($link);
fwrite($file, $direct_link);
fclose($file);
continue;
}
file_put_contents("{$filepath}/{$info['filename']}.{$info['extension']}", $file ?: 'Ошибка');
Все работает отлично, но в какой то момент попадаются тяжелые для php файлы и ему не хватает памяти.
Fatal error: Out of memory (allocated 322961408) (tried to allocate 213909528 bytes) in C:\Users\user\IdeaProjects\getfiles\getFiles.php on line 63
ini_set("memory_limit", "1000M") выставил память, тоже не помогает.
Почитал в интернете и понял, что эта функция не предназначена для больших файлов.
Хочу обработать эту ошибку, если лезет такая ошибка, то качать файл не надо, а надо всего лишь создать текстовый документ и записать ссылку на этот файл в него и идти дальше. Но что-то не выходит, try catch не отрабатывает. Хотя есть подозрение, что я очень плохо разбираюсь в теме и fatal error не отлавливаются и ничего не поделать.
Все делаю локально, без серверов, и решил бы сервер проблему? Файлы не гигабайтные, около 150-200 метров.
Ответы (2 шт):
Продолжить работу после Out of memory нельзя. Fatal error - это ошибка настолько фатальная, что после неё можно сделать очень немного. Разве что в файл записать. Но и то - для каких-то осмысленных действий надо сначала освободить занятую память, а это значит что перед началом работы скрипта надо сначала эту память занять. В общем, морока ещё та.
Другое дело что проблема обычно решается по-другому.
- Во-первых, совершением осмысленных действий. Если качаемый файл действительно имеет размер не больше 200 метров, то и объем памяти, которую займет скрипт, будет не больше 200 метров. А - Арифметика. То есть если у тебя памяти расходуется больше, это значит что ты ее чем-то забил. Вот и надо освободить. Например чтение ссылок из экселя это примерно как экскаватором насыпать сахар в чай. Возьми начала выгрузи все ссылки в текстовый файлик. А потом уже читай из него.
- Во-вторых, надо следить за памятью, возможно она тупо где-то течет - ты занимаешь память под какую-то переменную, но не освобождаешь её и переменные копятся, занимая память. Это вроде не твой случай, но всегда надо иметь в виду.
- Ну и в-последних, если больше ничего не помогает, надо убедиться, что увеличение memory_limit действительно сработало. В данном случае у тебя какие-то совсем бессвязные цифры - уже занято 300М, пытаешься добавить 200М, а лимит по пхпинфо - 2000М. Что-то где-то не так.
copy(trim($link), "{$filepath}/{$info['filename']}.{$info['extension']}");
Как узнал , get_file_contents очень памятно-затратная вещь и лучше использовать copy(). Мне помогло