复制输出而不输出缓冲

时间:2015-05-07 10:06:00

标签: php console

我有一个PHP脚本写入consol一些日志,错误等。

我想将所有这些信息保存到变量中,以便在执行结束时发送电子邮件。

我知道我可以使用obstart和co来做到这一点但我也希望在执行过程中日志以实时显示。所以我不认为输出缓冲是我的问题的解决方案,但我没有看到另一种解决方案。

有没有办法做到这一点?

先谢谢

1 个答案:

答案 0 :(得分: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));
    }
}

用法示例假设您还创建了一些实现MailerInterface的Mailer类:

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

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