GuzzleHttp отправка JSON файла без предварительного сохранение его
Хочется чтобы обработчик ошибок отправлял мне в Телеграм файл .json с выводом данных объекта Exception.
Чтобы отправить какой-то файл через GuzzleHttp нужно предворительно его создать. Но можно ли обойтись как-то одной функцией которая создавала файл не сохраняя его с расширением .json и определенным контентом? Что-то подобное tmpfile()
Ответы (2 шт):
Совсем необязательно создавать .json-файл, чтобы затем читать его и посылать через GuzzleHttp. Можно сразу прочитать .json-данные в переменную и отослать её содержимое, используя опцию GuzzleHttp\RequestOptions::JSON. Например, вот так:
$response = $client->request('PUT', '/put', ['json' => ['foo' => 'bar']]);
Обратите внимание, что данные отсылаются в виде ассоциированного массива, так что нужно их сначала перекодировать в массив при помощи json_decode($json_data, true).
Если уж нужно соблюсти требования вопроса, то с большой вероятностью задачу решат потоки ввода-вывода, такие как, например, php://memory или php://temp.
php://memory и php://temp являются потоками для чтения/записи и позволяют сохранять временные данные в файлоподобной обертке. Единственная разница между ними заключается в том, что php://memory будет всегда хранить данные в оперативной памяти, тогда как php://temp будет использовать временный файл в том случае, когда объем хранимой информации достигнет заданного лимита (по умолчанию 2 Мб). Расположение этого временного файла определяется аналогично функции sys_get_temp_dir().
Там важно помнить о том, что если стримы закрываются, то их нельзя повторно использовать. А так же после того, как стрим заполнен данными, его необходимо "перемотать" командой rewind() для того, чтобы начать из него читать.
Чтобы поменять имя отправляемого файла достаточно добавить параметр filename, то есть не объязательно нужно сохранять файл с нужным именем.
$client = new Client([
'base_uri' => "https://api.telegram.org/bot" . self::TELEGRAM_TOKEN . "/"
]);
$file = tmpfile();
fwrite($file, json_encode($file_content, JSON_PRETTY_PRINT));
$client->post("sendDocument", [
'multipart' => [
[
'name' => 'chat_id',
'contents' => self::TELEGRAM_CHAT_ID
],
[
'name' => 'document',
'contents' => $file,
'filename' => 'log.json'
]
]
]);