Копировать вывод без буферизации вывода

У меня есть сценарий PHP, который записывает в консоль некоторые журналы, ошибки и т. Д.

Я хочу сохранить всю эту информацию в переменную для отправки электронного письма в конце его выполнения.

Я знаю, что могу использовать obstart и co для этого, но я также хочу, чтобы во время его выполнения журналы появлялись в в реальном времени. Поэтому я не думаю, что выходная буферизация — это решение моей проблемы, но я не вижу другого решения.

Есть ли способ сделать это, пожалуйста?

Заранее спасибо

0

Решение

Вам придётся придумать какой-нибудь специальный регистратор, который кроме вывода сообщений на консоль также будет отправлять электронное письмо при завершении работы скрипта. Что-то вроде этого:

interface MailerInterface {
function send($recipient, $title, $body);
}

interface LoggerInterface {
function log($message);
}

class ConsoleLoggerWithMailer implements LoggerInterface {

/**
* @var string[]
*/
private $messages = array();

/**
* @var MailerInterface
*/
private $mailer;

/**
* @var string
*/
private $recipient;

public function __construct() {
register_shutdown_function(array($this, 'sendMessages'));
}

/**
* @param MailerInterface $mailer
* @param string $recipient
*/
public function setMailer(MailerInterface $mailer, $recipient) {
$this->mailer = $mailer;
$this->recipient = $recipient;
}

/**
* @return string[]
*/
public function getMessages() {
return $this->messages;
}

public function log($message) {
$this->messages[] = $message;

printf("%s\n", $message);
}

public function sendMessages() {
if ($this->mailer === null || count($this->messages) === 0)
return;

$this->mailer->send($this->recipient, 'log', implode("\n", $this->messages));
}
}

Пример использования при условии, что вы также создали некоторый класс Mailer, реализующий MailerInterface:

$mailer = new Mailer();
$logger = new ConsoleLoggerWithMailer();
$logger->setMailer($mailer, "webmaster@example.com");

$logger->log("Starting...");
$logger->log("Doing...");
$logger->log("End");
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector