'localhost:/tmp/mysql5.sock',
'database' => 'db530504992',
'username' => 'dbo530504992',
'password' => 'Kh78886Fe45Sd'
);
/**
* Load configuration or exit
*/
if (!isset($_GET['config']) && !isset($_SERVER['argv'][1]))
die('No configuration file specified');
if (isset($_GET['config']))
{
$config = basename($_GET['config']);
} else {
$config = basename($_SERVER['argv'][1]);
}
if (!strlen($config) || !file_exists(dirname(__FILE__).'/conf/'.$config))
die('Configuration file not found');
require_once(dirname(__FILE__).'/conf/'.$config);
if (!isset($CONFIG) || !isset($EXPORT))
die('Missing configuration');
/* CONFIGURATION END */
/* OXID INIT START */
/**
* Returns false.
*
* @return boolean
*/
error_reporting( E_ALL ^ E_NOTICE );
ini_set('display_errors',true);
define('OX_BASE_PATH', dirname(__FILE__) .'/../' );
// custom functions file
require OX_BASE_PATH . 'bootstrap.php';
// error reporting level
error_reporting(E_ALL ^ E_NOTICE);
// Generic utility method file including autoloading definition
require_once OX_BASE_PATH . 'core/oxfunctions.php';
/* OXID INIT END */
/**
* Export Class
*
* @package OXID-Export
* @author Benjamin Roth
*/
class Export extends oxUBase {
protected $_aOrders= array();
protected $_aArticles = array();
protected $_aCategories = array();
protected $db;
protected $oOxidConfig;
protected $currentArticle = array();
protected $arrDefaultSettings = array
(
'field_encloser' => '"',
'field_terminator' => ';',
'escape_char' => '\\',
'filename' => 'esm_export/csv/export.csv',
'encoding' => 'UTF-8',
'stripHTML' => true,
'strictStrip' => true,
'doublets' => true,
'languageid' => 0,
'includeHeader' => true,
'activeOnly' => true,
'activeArticleField' => 'OXACTIVE',
'activeCatField' => 'OXACTIVE',
'onStockOnly' => false,
'skipLastTerminator' => true,
'noVariants' => false,
'excludeParent' => true,
'catPathSeparator' => ">",
'customSqlCondition' => '',
'eol' => 'LF',
'notCancelledOnly' => false,
'cancelledOderField' => 'OXSTORNO',
);
protected $arrConfig = array();
protected $blnSkipTrim = false;
public function __construct()
{
// Get shop config object
$this->oOxidConfig = $this->getConfig();
// Set job config
$this->arrConfig = array_merge($this->arrDefaultSettings,(is_array($GLOBALS['CONFIG']) ? $GLOBALS['CONFIG'] : array()));
// DB initialization
$this->db = oxDb::getDb();
$this->db->SetFetchMode(ADODB_FETCH_ASSOC);
// $this->db->query("SET character_set_results = '".strtoupper($this->arrConfig['encoding'])."'");
// Check config vars
$blnNotCancelledOnly = ($this->arrConfig['notCancelled'] === true ? true : false);
$blnCustomSqlCond = ($this->arrConfig['customSqlCondition'] ? true : false);
$order_where = '';
if (count($GLOBALS['EXPORT']['folders']['exclude']) > 0)
{
$order_excludes_array = array();
foreach($GLOBALS['EXPORT']['folders']['exclude_ids'] as $folder)
{
$order_excludes_array[] = "'".strtoupper($folder)."'";
}
$order_excludes = implode(',',$order_excludes_array);
$order_where .= ' AND oo.OXFOLDER NOT IN ('.$order_excludes.')';
}
if (count($GLOBALS['EXPORT']['folders']['include']) > 0)
{
$order_includes_array = array();
foreach($GLOBALS['EXPORT']['folders']['include'] as $folder)
{
$order_includes_array[] = "'".strtoupper($folder)."'";
}
$order_includes = implode(',',$order_includes_array);
$order_where .= ' AND oo.OXFOLDER IN ('.$order_includes.')';
}
if ($blnNotCancelledOnly)
{
$order_where .= ' AND oo.'.$this->arrConfig['cancelledOderField'].' = 1';
}
if ($blnCustomSqlCond)
{
$order_where .= ' AND '.$this->arrConfig['customSqlCondition'];
}
$sql = "SELECT oo.OXID, oo.OXUSERID FROM oxorder AS oo WHERE oo.oxesexported != 1".($order_where ? ' AND '.$order_where : '')." ORDER BY oo.OXORDERDATE";
// $sql = "SELECT oo.OXID, oo.OXUSERID FROM oxorder AS oo".($order_where ? ' WHERE '.$order_where : '')." ORDER BY oo.OXORDERDATE";
$rs = $this->db->execute($sql);
while($rs && !$rs->EOF)
{
$arrRow = $rs->fetchRow();
$this->_aOrders[] = array('user' => $arrRow['OXUSERID'], 'order' => $arrRow['OXID']);
}
}
function __call($name, $arguments)
{
switch ($name)
{
case 'getConfigParam':
return (array_key_exists($arguments[0],$this->arrConfig) ? $this->arrConfig[$arguments[0]] : false);
break;
case 'getJobConfig':
return $this->arrConfig;
break;
default:
throw new BadFunctionCallException('Method "'.$name.'" does not exist');
}
}
/**
* function getCategory
*
* @return object
*/
function getCategory($oxid)
{
if (isset($this->_aCategories[$oxid]) && is_object($this->_aCategories[$oxid]))
return $this->_aCategories[$oxid];
$oCategory = oxNew('oxcategory');
$oCategory->setLanguage($this->arrConfig['languageid']);
$oCategory->load($oxid);
$this->_aCategories[$oxid] = $oCategory;
return $this->_aCategories[$oxid];
}
function getCategoryPath($oxid)
{
$arrPath = array();
if (isset($this->_aCategories[$oxid]) && is_object($this->_aCategories[$oxid]))
{
$oCategory = &$this->_aCategories[$oxid];
} else {
$oCategory = oxNew('oxcategory');
$oCategory->setLanguage($this->arrConfig['languageid']);
$oCategory->load($oxid);
$this->_aCategories[$oxid] = $oCategory;
}
$arrPath[] = trim($oCategory->oxcategories__oxtitle->value);
if ($oCategory->oxcategories__oxparentid->value != 'oxrootid')
{
$arrPath = array_merge($arrPath,$this->getCategoryPath($oCategory->oxcategories__oxparentid->value));
}
return array_reverse($arrPath);
}
/**
* function replaceTags
*
* @return string
*/
protected function replaceTags($strBuffer)
{
//$tags = preg_split('/{{([^}]+)}}/', $strBuffer, -1, PREG_SPLIT_DELIM_CAPTURE);
$tags = preg_split('/\{\{(([^\{\}]*|(?R))*)\}\}/', $strBuffer, -1, PREG_SPLIT_DELIM_CAPTURE);
$strBuffer = '';
$arrCache = array();
for($_rit=0, $_cnt=count($tags); $_rit<$_cnt; $_rit+=3)
{
/*if (!isset($tags[$_rit+1]))
{
continue;
}*/
$strBuffer .= $tags[$_rit];
$strTag = (isset($tags[$_rit+1]) ? $tags[$_rit+1] : '');
// Skip empty tags
if (!strlen($strTag))
{
continue;
}
// Load value from cache array
if (isset($arrCache[$strTag]))
{
$strBuffer .= $arrCache[$strTag];
continue;
}
// Run the replacement again if there are more tags (see #4402)
if (strpos($strTag, '{{') !== false)
{
$strTag = $this->replaceTags($strTag);
}
$elements = explode('::', $strTag);
$arrCache[$strTag] = '';
// Replace tag
switch (strtolower($elements[0]))
{
case 'parent':
if (is_null($this->currentArticle['parent']))
{
if (is_null($this->currentArticle['article']))
{
$this->currentArticle['article'] = $this->currentArticle['orderarticle']->getArticle();
}
if (!is_null($this->currentArticle['article']))
{
$this->currentArticle['parent'] = $this->currentArticle['article']->getParentArticle();
}
}
if (!is_null($this->currentArticle['parent']))
{
$arrCache[$strTag] = $this->currentArticle['parent']->{'oxarticles__'.strtolower($elements[1])}->value;
}
break;
case 'article':
if (is_null($this->currentArticle['article']))
{
$this->currentArticle['article'] = $this->currentArticle['orderarticle']->getArticle();
}
if (!is_null($this->currentArticle['article']))
{
$arrCache[$strTag] = $this->currentArticle['article']->{'oxarticles__' . strtolower($elements[1])}->value;
}
break;
case 'orderarticle':
$arrCache[$strTag] = $this->currentArticle['orderarticle']->{'oxorderarticles__'.strtolower($elements[1])}->value;
break;
case 'orderarticlepos':
$arrCache[$strTag] = $this->currentArticle['orderarticlepos'];
break;
case 'order':
$arrCache[$strTag] = $this->currentArticle['order']->{'oxorder__'.strtolower($elements[1])}->value;
break;
case 'user':
$arrCache[$strTag] = $this->currentArticle['user']->{'oxuser__'.strtolower($elements[1])}->value;
break;
case 'inheritance':
if (!$this->currentArticle['article']->{'oxarticles__'.strtolower($elements[1])}->value)
{
if (is_null($this->currentArticle['parent']))
{
if (is_null($this->currentArticle['article']))
{
$this->currentArticle['article'] = $this->currentArticle['orderarticle']->getArticle();
}
if (!is_null($this->currentArticle['article']))
{
$this->currentArticle['parent'] = $this->currentArticle['article']->getParentArticle();
}
}
$arrCache[$strTag] = (!$this->currentArticle['parent'] ? '' : $this->currentArticle['parent']->{'oxarticles__'.strtolower($elements[1])}->value);
} else {
$arrCache[$strTag] = $this->currentArticle['article']->{'oxarticles__'.strtolower($elements[1])}->value;
}
break;
case 'category':
if (is_null($this->currentArticle['category']))
{
if (is_null($this->currentArticle['article']))
{
$this->currentArticle['article'] = $this->currentArticle['orderarticle']->getArticle();
}
if (!is_null($this->currentArticle['article']))
{
$this->currentArticle['category'] = $this->currentArticle['article']->getCategory();
}
}
if (!is_null($this->currentArticle['category']))
{
$arrCache[$strTag] = $this->currentArticle['category']->{'oxcategories__' . strtolower($elements[1])}->value;
}
break;
case 'categorypath':
$arrCache[$strTag] = implode($this->arrConfig['catPathSeparator'],$this->getCategoryPath($this->currentArticle['category']->oxcategories__oxid->value));
break;
case 'crossselling':
$oCrossSelling = $this->currentArticle['article']->getCrossSelling();
$arrCrossSelling = array();
if (!is_null($oCrossSelling) && $intLimit = $oCrossSelling->count())
{
if (isset($elements[1]))
{
$intLimit = intval($elements[1]);
}
$i=0;
while ($oCrossSelling->valid() && $i < $intLimit)
{
if ($oCrossSelling->current()->getVariants())
{
$arrCrossSelling[] = $oCrossSelling->current()->oxarticles__oxartnum->value.'__parent';
} else {
$arrCrossSelling[] = $oCrossSelling->current()->oxarticles__oxartnum->value;
}
$oCrossSelling->next();
$i++;
}
}
$arrCache[$strTag] = implode(',',$arrCrossSelling);
break;
case 'db_foreign':
if (isset($elements[1]) && isset($elements[2]) && ($chunks = explode('=',$elements[1])))
{
list($foreign_table, $foreign_field) = explode('.',$chunks[0]);
$foreign_keyValue = $this->currentArticle['article']->{'oxarticles__'.strtolower($chunks[1])}->value;
if (($sViewName = getViewName($foreign_table, $this->arrConfig['languageid'])))
{
$sDbValue = $this->db->getOne("select ".$elements[2]." from {$sViewName} where ".$foreign_field." = " . $this->db->quote($foreign_keyValue));
} else {
$sDbValue = $this->db->getOne("select ".$elements[2]." from {$foreign_table} where ".$foreign_field." = " . $this->db->quote($foreign_keyValue));
}/* else {
$sql = "SELECT * FROM ".$foreign_table." WHERE ".$foreign_field."='".$foreign_keyValue."'";
$resSql = $this->db->execute($sql);
$arrCache[$strTag] = ($resSql->recordCount() < 1) ? '' : $resSql->fields($elements[2]);
}*/
if ($sDbValue)
{
$oForeign = new oxField();
$oForeign->setValue($sDbValue, oxField::T_RAW);
$arrCache[$strTag] = $oForeign->value;
}
unset($resSql,$oForeign);
}
break;
case 'link':
switch(strtolower($elements[1]))
{
case 'article':
if ( oxRegistry::getUtils()->seoIsActive() )
{
$arrCache[$strTag] = preg_replace('/(?<=\.html)\?.*$/', '', $this->currentArticle['article']->getMainLink());
} else {
$arrCache[$strTag] = $this->currentArticle['article']->getMainLink();
}
break;
case 'category':
if ( oxRegistry::getUtils()->seoIsActive() )
{
$arrCache[$strTag] = preg_replace('/(?<=\.html)\?.*$/', '', $this->currentArticle['category']->getMainLink());
} else {
$arrCache[$strTag] = $this->currentArticle['category']->getMainLink();
}
break;
}
break;
case 'image':
switch(strtolower($elements[1]))
{
case 'article':
switch(strtolower($elements[2]))
{
case 'thumb':
$arrCache[$strTag] = $this->currentArticle['article']->getThumbnailUrl();
break;
case 'icon':
$arrCache[$strTag] = $this->currentArticle['article']->getIconUrl();
break;
default:
$arrCache[$strTag] = ($this->currentArticle['article']->{'oxarticles__oxpic'.$elements[2]}->value ? $this->currentArticle['article']->getZoomPictureUrl(intval($elements[2])) : '');
break;
}
break;
case 'category':
$arrCache[$strTag] = '';
break;
}
break;
case 'db_if':
if (isset($elements[1]) && isset($elements[2]) && isset($elements[3]) && isset($elements[4]))
{
$db_value = $this->currentArticle['article']->{'oxarticles__'.strtolower($elements[1])}->value;
if (isset($elements[5]))
{
$varVal = $elements[4];
$varAltVal = $elements[5];
} else {
$varVal = $db_value;
$varAltVal = $elements[4];
}
switch($elements[2])
{
case '>':
$arrCache[$strTag] = ($db_value > $elements[3]) ? $varVal : $varAltVal;
break;
case '>=':
$arrCache[$strTag] = ($db_value >= $elements[3]) ? $varVal : $varAltVal;
break;
case '<':
$arrCache[$strTag] = ($db_value < $elements[3]) ? $varVal : $varAltVal;
break;
case '<=':
$arrCache[$strTag] = ($db_value <= $elements[3]) ? $varVal : $varAltVal;
break;
case '=':
$arrCache[$strTag] = ($db_value == $elements[3]) ? $varVal : $varAltVal;
break;
case '!=':
$arrCache[$strTag] = ($db_value != $elements[3]) ? $varVal : $varAltVal;
break;
}
}
break;
case 'not_empty':
if (isset($elements[1]) && isset($elements[2]))
{
if ($elements[1])
{
$arrCache[$strTag] = $elements[2];
} else {
$arrCache[$strTag] = '';
}
}
break;
case 'fixval':
$arrCache[$strTag] = $elements[1];
break;
case 'has_variants':
if (isset($elements[1]) && isset($elements[2]))
{
$arrCache[$strTag] = ($this->currentArticle['hasVariants'] ? $elements[1] : $elements[2]);
}
break;
case 'parse_smarty':
$arrCache[$strTag] = oxRegistry::get("oxUtilsView")->parseThroughSmarty($elements[1], basename($this->arrConfig['filename']) . $this->arrConfig['languageid'], null, true);
break;
case 'fstring':
if (isset($elements[1]) && isset($elements[2]))
{
$this->blnSkipTrim = true;
//$strFstring = call_user_func_array("sprintf",array_slice($elements,1,2));
$strFstring = sprintf($elements[1],$this->convert($elements[2]));
if (isset($elements[3]))
{
$strFstring = substr($strFstring,0,$elements[3]);
}
$arrCache[$strTag] = $this->convert($strFstring,'utf-8');
}
break;
case 'fdate':
if (isset($elements[1]) && isset($elements[2]))
{
$oDate = new DateTime($elements[2]);
if (is_object($oDate))
$arrCache[$strTag] = $oDate->format($elements[1]);
}
break;
case 'price':
if (isset($elements[1]))
{
$oPrice = oxNew( 'oxPrice' );
$blPriceNet = (bool) $this->getConfig()->getConfigParam('blShowNetPrice');
if ($blPriceNet)
{
$oPrice->setNettoPriceMode();
} else {
$oPrice->setBruttoPriceMode();
}
$oPrice->setPrice(doubleval($elements[1]));
if (isset($elements[2]))
{
switch ($elements[2])
{
case 'net':
case 'netto':
$arrCache[$strTag] = $oPrice->getNettoPrice();
break;
case 'gross':
case 'brutto':
$arrCache[$strTag] = $oPrice->getBruttoPrice();
break;
default:
$arrCache[$strTag] = $oPrice->getPrice();
break;
}
}
}
break;
case 'oxcountry':
if (isset($elements[1]) && isset($elements[2]))
{
$oCountry = oxNew('oxcountry');
$oCountry->load($elements[2]);
$arrCache[$strTag] = $oCountry->{'oxcountry__'.strtolower($elements[1])}->value;
}
break;
case 'translate':
if (isset($elements[1]) && isset($elements[2]))
{
if (isset($GLOBALS['EXPORT']['translate'][$elements[1]][$elements[2]]))
{
$arrCache[$strTag] = $GLOBALS['EXPORT']['translate'][$elements[1]][$elements[2]];
}
}
break;
case 'eval':
if (isset($elements[1]))
{
ob_start();
eval('echo ('.$elements[1].');');
$arrCache[$strTag] = ob_get_contents();
ob_end_clean();
}
break;
}
$strBuffer .= $arrCache[$strTag];
}
return $strBuffer;
}
protected function parseLine($arrArticle,$strFieldConf='fields')
{
$oArticle = oxNew('oxorderarticle');
$oArticle->load($arrArticle['orderarticle']);
$oOrder = oxNew('oxorder');
$oOrder->load($arrArticle['order']);
$oUser = oxNew('oxuser');
$oUser->load($arrArticle['user']);
$this->currentArticle = array
(
'order' => $oOrder,
'orderarticle' => $oArticle,
'orderarticlepos' => $arrArticle['orderarticlepos'],
'user' => $oUser,
'article' => null,
'category' => null,
'parent' => null
);
$this->blnSkipTrim = false;
$strLine = '';
$index = 0;
foreach($GLOBALS['EXPORT'][$strFieldConf] as $field)
{
$field = $this->replaceTags($field);
$field = $this->encapsulate($field, ($this->arrConfig['skipLastTerminator'] && ++$index == count($GLOBALS['EXPORT']['fields']) ? true : false));
// $field = mb_convert_encoding($field, strtoupper($this->arrConfig['encoding']), 'UTF-8');
$strLine .= $this->convert($field);
}
return $strLine.(strtoupper($this->arrConfig['eol']) == 'CRLF' ? "\r\n" : "\n");
}
public function encapsulate($strVal, $blnSkipTerminator=false)
{
$strSrcEncoding = mb_detect_encoding($strVal,"UTF-8,".$this->arrConfig['encoding'].",cp1252,cp1251,cp1250,iso-8859-1,iso-8859-15",true);
if (!$this->blnSkipTrim)
{
$strVal = trim($strVal);
}
$strVal = preg_replace('/[\\n\\r]/', '
', $strVal);
if ($this->arrConfig['stripHTML'])
{
if ($this->arrConfig['strictStrip']) {
$strVal = preg_replace('/(
)+/i', ' ', $strVal);
$strVal = preg_replace('/(
)+/i', ' ', $strVal);
$strVal = strip_tags($strVal);
$strVal = mb_convert_encoding($strVal, 'HTML-ENTITIES', $strSrcEncoding);
if (!$this->blnSkipTrim)
{
$strVal = trim(preg_replace('/[\xa0\s]+/', ' ', $strVal));
}
$strVal = str_ireplace(' ','',$strVal);
} else {
$strVal = strip_tags($strVal,'
');
$strVal = preg_replace('/(
){2,}/', '
', $strVal);
}
}
$strVal = str_replace($this->arrConfig['field_encloser'],$this->arrConfig['escape_char'].$this->arrConfig['field_encloser'],$strVal);
if (strlen($strVal))
{
$strVal = preg_replace('/(^|$)/',$this->arrConfig['field_encloser'],$strVal);
} else {
$strVal = $this->arrConfig['field_encloser'].$this->arrConfig['field_encloser'];
}
return $strVal.($blnSkipTerminator ? '' : $this->arrConfig['field_terminator']);
}
protected function convert($strValue, $strCharset = null)
{
if (is_null($strCharset))
{
$strCharset = strtoupper($this->arrConfig['encoding']);
} else {
$strCharset = strtoupper($strCharset);
}
$strSrcEncoding = mb_detect_encoding($strValue,"UTF-8,".$this->arrConfig['encoding'].",cp1252,cp1251,cp1250,iso-8859-1,iso-8859-15",true);
return ($strSrcEncoding == $strCharset) ? $strValue : mb_convert_encoding($strValue, $strCharset, $strSrcEncoding);
}
protected function getHeader()
{
$strHeader = '';
$index = 0;
foreach(array_keys($GLOBALS['EXPORT']['fields']) as $field)
{
$field = $this->encapsulate($field, ($this->arrConfig['skipLastTerminator'] && ++$index == count($GLOBALS['EXPORT']['fields']) ? true : false));
$strHeader .= $this->convert($field);
}
return $strHeader."\n";
}
public function getCSV()
{
// echo 'Datensätze: '.count($this->arrDB)."\n";
$strBuffer = ($this->arrConfig['includeHeader']) ? $this->getHeader() : '';
foreach($this->arrDB as $this->arrRow)
{
$strBuffer .= $this->parseLine($this->arrRow);
}
return $strBuffer;
}
public function saveCSV()
{
$tmpname = sys_get_temp_dir().'/'.hash('crc32', uniqid(microtime()));
$count = 0;
if (count($this->_aOrders) < 1)
{
return $count;
}
//$fh = fopen($tmpname,"a");
$fh = fopen(getShopBasePath() . $this->arrConfig['filename'],"a");
fputs($fh,(($this->arrConfig['includeHeader']) ? $this->getHeader() : ''));
foreach($this->_aOrders as $order)
{
$this->_aArticles = array();
$sql = "SELECT OXID FROM oxorderarticles AS ooa WHERE ooa.OXORDERID = " . $this->db->quote($order['order']) . " ORDER BY ooa.OXARTNUM";
$rs = $this->db->execute($sql);
while ($rs && !$rs->EOF)
{
$arrRow = $rs->fetchRow();
$this->_aArticles[] = array_merge($order,array('orderarticle'=>$arrRow['OXID'], 'orderarticlepos'=>count($this->_aArticles)+1));
}
foreach ($this->_aArticles as $article)
{
// echo $article['article']->oxarticles__oxtitle->value."\n";
// echo $article['category']->oxcategories__oxtitle->value."\n\n";
fputs($fh, $this->parseLine($article));
}
// Shipping costs
$aShipping = $article;
$aShipping['orderarticlepos'] = $aShipping['orderarticlepos']+1;
fputs($fh, $this->parseLine($aShipping,'shipping'));
$sql = "UPDATE oxorder SET oxesexported = 1 WHERE oxid = " . $this->db->quote($order['order']) . "";
$rs = $this->db->execute($sql);
$count += count($this->_aArticles);
}
fclose($fh);
/*if (!rename($tmpname, getShopBasePath() . $this->arrConfig['filename']))
{
die('Export file could not be created');
}*/
return $count;
}
}
$Export = new Export();
$intArticles = $Export->saveCSV();
header('Content-Type: text/plain; charset='.$Export->getConfigParam['encoding']);
echo "Items exported: " . $intArticles."\n";
$intMemory = memory_get_peak_usage(true);
$hrsize = function($intMemory) {
$kilobyte = 1024;
$megabyte = $kilobyte * 1024;
$gigabyte = $megabyte * 1024;
$terabyte = $gigabyte * 1024;
$precision = 2;
$bytes = $intMemory;
if (($bytes >= 0) && ($bytes < $kilobyte)) {
return $bytes . ' B';
} elseif (($bytes >= $kilobyte) && ($bytes < $megabyte)) {
return round($bytes / $kilobyte, $precision) . ' KB';
} elseif (($bytes >= $megabyte) && ($bytes < $gigabyte)) {
return round($bytes / $megabyte, $precision) . ' MB';
} elseif (($bytes >= $gigabyte) && ($bytes < $terabyte)) {
return round($bytes / $gigabyte, $precision) . ' GB';
} elseif ($bytes >= $terabyte) {
return round($bytes / $terabyte, $precision) . ' TB';
} else {
return $bytes . ' B';
}
};
echo "Memory used for export: " . $hrsize($intMemory)."\n";