drupal-civicrm/sites/all/modules/civicrm/CRM/Utils/ConsoleTee.php
2018-01-14 13:10:16 +00:00

119 lines
3.4 KiB
PHP

<?php
/*
+--------------------------------------------------------------------+
| CiviCRM version 4.7 |
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC (c) 2004-2017 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
| CiviCRM is free software; you can copy, modify, and distribute it |
| under the terms of the GNU Affero General Public License |
| Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
| |
| CiviCRM is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| See the GNU Affero General Public License for more details. |
| |
| You should have received a copy of the GNU Affero General Public |
| License and the CiviCRM Licensing Exception along |
| with this program; if not, contact CiviCRM LLC |
| at info[AT]civicrm[DOT]org. If you have questions about the |
| GNU Affero General Public License or the licensing of CiviCRM, |
| see the CiviCRM license FAQ at http://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
/**
* Capture the output from the console, copy it to a file, and pass it on.
*
* @code
* $tee = CRM_Utils_ConsoleTee::create()->start();
* echo "hello world";
* $tee->stop();
* assertEquals("hello world", file_get_contents($tee->getFileName()));
* @endCode
*
* Loosely speaking, it serves a similar purpose to Unix `tee`.
*
* @link https://en.wikipedia.org/wiki/Tee_(command)
*/
class CRM_Utils_ConsoleTee {
/**
* Capture console output and copy to a temp file.
*
* @param string $prefix
* @return CRM_Utils_ConsoleTee
*/
public static function create($prefix = 'ConsoleTee-') {
return new static(tempnam(sys_get_temp_dir(), $prefix));
}
/**
* @var string
*/
protected $fileName;
/**
* @var resource
*/
protected $fh;
/**
* CRM_Utils_ConsoleTee constructor.
*
* @param string $fileName
* The full path of the file to write to.
*/
public function __construct($fileName) {
$this->fileName = $fileName;
}
/**
* Start capturing console output and copying it to a file.
*
* @param string $mode
* The file output mode, e.g. `w` or `w+`.
* @return CRM_Utils_ConsoleTee
* @see fopen
*/
public function start($mode = 'w') {
$this->fh = fopen($this->fileName, $mode);
ob_start(array($this, 'onOutput'));
return $this;
}
/**
* Process a snippet of data from the output buffer.
*
* @param string $buf
* @return bool
* @see ob_start
*/
public function onOutput($buf) {
fwrite($this->fh, $buf);
return FALSE;
}
/**
* Stop capturing console output.
*
* @return CRM_Utils_ConsoleTee
*/
public function stop() {
ob_end_flush();
fclose($this->fh);
return $this;
}
/**
* @return string
*/
public function getFileName() {
return $this->fileName;
}
}