При этом данные об ошибке + Stack trace должны отправляться как сообщения, а содержимое массивов GET, POST, FILES и т.д. - в файле.
В целом я всё реализовал, причём файл даже в виде архива.
Я исхожу из того, что первое сообщение в массиве сообщений цели $Target->messages[0][0] - это именно тот текст, который мне нужен в качестве текста, а все остальные ->messages[1..N][0] - содержат массивы GET, POST etc.
(Это работает, но правильно ли я интерпретировал?)
Поэтому в Target->export() я делаю:
Код: Выделить всё
$main_message = array_shift($this->messages);
$full_text = $this->formatMessage($main_message);
Потом я собираю текст для файла из остальных сообщений:
Код: Выделить всё
foreach ($this->messages as $msg){
list($text, $level, $category, $timestamp) = $msg;
$file_text .= $text." ";
}
Это работает всегда почти - есть место в консольном скрипте, где часто отправка файла не работает.
Причём основное сообщение отослано в одно время ( метка 1521243993.3368), а следом за ним идёт второе сообщение вместо ожидаемого файла его текст (GET,POST) и с другой меткой (1521243902.1243). При этом level = LEVEL_INFO.
В самих скриптах - Target и скрипте, который непосредственно шлёт - я навесил try-catch с ручным логом (т.е. пишу ручной нефреймворковский лог в файл на случай, если проблема именно в обработке Таргета). Но проблемы никакой именно в них нет.
Переформулирую еще раз на всякий случай и уточню:
В определенных обстоятельствах консольный скрипт, работающий со сторонним API, возвращает пустую переменную, а я объявляю throw Exception.
Именно в этом случае имею ситуацию, что $this->messages в Таргете не состоит из текста ошибки + стек вызовов в нулевом элементе, а остальное в следующих $this->messages. Вместо этого Таргет как бы вызывается дважды, оба раза $this->messages состоит только из одного сообщения: текст+стек в первом вызове и глобальные переменные во втором вызове.
Я искусственно могу создать ситуацию и вместо API отдать null, но в таком случае всё работает как обычно - то есть получается текст + файл. То есть повторить искусственно ошибку не получается.
У меня есть предположение , что это как-то связано с тратой памяти (наверняка логирование освобождает память, если потрачено и так много - допустим, превышен какой-то лимит).
Но выяснить как это работает не очень получается(. В Таргет есть collect, который вызывается через Dispatcher->dispatch($messages, $final).
Как живёт этот диспетчер и откуда он берет messages для меня пока загадка.
Может быть кто-то умный подскажет как это всё устроено и в чём может быть загвоздка?
Может есть варианты правильнее как можно реализовать текст+файл и чтобы это было 100%?
Файлы делаю неспроста архивами - они у меня запароленные, считаю это важной частью защиты, ведь глобальные переменные - очень легкий путь к переменным окружения, где могут быть и пароли, и соль и т.п.