lib/php/libsdk/SDK/Build/PGO/Tool/PGO.php (79 lines of code) (raw):
<?php
namespace SDK\Build\PGO\Tool;
use SDK\Exception;
use SDK\Build\PGO\Config as PGOConfig;
use SDK\Build\PGO\Interfaces;
class PGO
{
protected $php;
protected $conf;
protected $idx = 0;
public function __construct(PGOConfig $conf, Interfaces\PHP $php)
{
$this->conf = $conf;
$this->php = $php;
}
protected function getPgcName(string $fname) : string
{
$bn = basename($fname, substr($fname, -4, 4));
$dn = dirname($fname);
return $dn . DIRECTORY_SEPARATOR . $bn . "!" . $this->idx . ".pgc";
}
protected function getPgdName(string $fname) : string
{
$bn = basename($fname, substr($fname, -4, 4));
$dn = dirname($fname);
return $dn . DIRECTORY_SEPARATOR . $bn . ".pgd";
}
protected function getWorkItems() : array
{
$exe = glob($this->php->getRootDir() . DIRECTORY_SEPARATOR . "*.exe");
$dll = glob($this->php->getRootDir() . DIRECTORY_SEPARATOR . "*.dll");
$dll = array_merge($dll, glob($this->php->getExtRootDir() . DIRECTORY_SEPARATOR . "php*.dll"));
/* find out next index */
$tpl = glob($this->php->getRootDir() . DIRECTORY_SEPARATOR . "php{7,8,}{ts,}.dll", GLOB_BRACE)[0];
if (!$tpl) {
throw new Exception("Couldn't find php7[ts].dll in the PHP root dir.");
}
do {
if (!file_exists($this->getPgcName($tpl))) {
break;
}
$this->idx++;
} while (true);
return array_unique(array_merge($exe, $dll));
}
public function dump(bool $merge = true) : void
{
$its = $this->getWorkItems();
foreach ($its as $base) {
$pgc = $this->getPgcName($base);
$pgd = $this->getPgdName($base);
shell_exec("pgosweep $base $pgc");
//passthru("pgosweep $base $pgc");
if ($merge) {
shell_exec("pgomgr /merge:1000 $pgc $pgd");
//passthru("pgomgr /merge:1000 $pgc $pgd");
/* File is already spent, no need to keep it.
If seeing linker warnings about no pgc
were found for some object - most
likely the object were not included in
any training scenario. */
@unlink($pgc);
}
}
}
public function waste() : void
{
$this->dump(false);
}
public function clean(bool $clean_pgc = true, bool $clean_pgd = true) : void
{
if ($clean_pgc) {
$its = glob($this->php->getRootDir() . DIRECTORY_SEPARATOR . "*.pgc");
$its = array_merge($its, glob($this->php->getExtRootDir() . DIRECTORY_SEPARATOR . "*" . DIRECTORY_SEPARATOR . "*.pgc"));
foreach (array_unique($its) as $pgc) {
unlink($pgc);
}
}
if ($clean_pgd) {
$its = glob($this->php->getRootDir() . DIRECTORY_SEPARATOR . "*.pgd");
$its = array_merge($its, glob($this->php->getExtRootDir() . DIRECTORY_SEPARATOR . "*" . DIRECTORY_SEPARATOR . "*.pgd"));
foreach (array_unique($its) as $pgd) {
shell_exec("pgomgr /clear $pgd");
//passthru("pgomgr /clear $pgd");
}
}
}
}