lib/php/libsdk/SDK/Build/PGO/Abstracts/TrainingCase.php (118 lines of code) (raw):
<?php
namespace SDK\Build\PGO\Abstracts;
use SDK\FileOps;
use SDK\Build\PGO\Tool;
abstract class TrainingCase
{
use FileOps;
const TYPE_WEB = "web";
const TYPE_CLI = "cli";
protected $stat = array();
/** @var \SDK\Build\PGO\Config */
protected $conf;
public function getType() : string
{
$type = $this->conf->getSectionItem($this->getName(), "type");
if (!$type) {
$type = "web";
}
return $type;
}
public function run() : void
{
$training = new Tool\Training($this->conf, $this);
$pgo = new Tool\PGO($this->conf, $this->php);
echo "Running " . $this->getName() . " training.\n";
$max_runs = $this->max_runs ?? 1;
$max_runs = (int)$max_runs > 0 ? $max_runs : 1;
$training->run($max_runs, $stat);
if ($this->getType() == "web") {
echo "HTTP responses:\n";
foreach ($stat["http_code"] as $code => $num) {
printf(" %d received %d times\n", $code, $num);
}
if (count($stat["not_ok"]) > 0) {
foreach($stat["not_ok"] as $st) {
echo "Code: $st[http_code], URL: $st[url]", ($st["redirect_url"] ? ", Redirected to: $st[redirect_url]" : ""), "\n";
}
printf("\033[31m WARNING: Not all HTTP responses have indicated success, the PGO data might be unsuitable!\033[0m\n");
}
}
echo $this->getName() . " training complete.\n";
echo "Dumping PGO data for " . $this->getName() . ".\n";
$pgo->dump();
echo "Finished dumping training data for " . $this->getName() . ".\n";
}
public function getHttpPort() : string
{
$port = $this->conf->getSectionItem($this->getName(), "http_port");
if (!$port) {
$port = $this->conf->getNextPort();
$this->conf->setSectionItem($this->getName(), "http_port", $port);
}
return $port;
}
public function getHttpHost() : string
{
$host = $this->conf->getSectionItem($this->getName(), "http_host");
if (!$host) {
$srv = $this->conf->getSrv(
$this->conf->getSectionItem($this->getName(), "srv_http")
);
if ($srv) {
$host = $this->conf->getSectionItem($srv->getName(), "host");
$this->conf->setSectionItem($this->getName(), "http_host", $host);
}
}
return $host;
}
protected function getDbConf(string $item) : string
{
$val = $this->conf->getSectionItem($this->getName(), "db_$item");
if (!$val) {
$srv = $this->conf->getSrv(
$this->conf->getSectionItem($this->getName(), "srv_db")
);
if ($srv) {
$val = $this->conf->getSectionItem($srv->getName(), $item);
$this->conf->setSectionItem($this->getName(), "db_$item", $val);
}
}
return $val;
}
public function getDbPass() : string
{
return $this->getDbConf("pass");
}
public function getDbUser() : string
{
return $this->getDbConf("user");
}
public function getDbHost() : string
{
return $this->getDbConf("host");
}
public function getDbPort() : string
{
return $this->getDbConf("port");
}
public function httpStatusOk(int $status) : bool
{
$ok = array();
$ok = array_merge($ok, range(200, 206));
$ok = array_merge($ok, range(300, 307));
return in_array($status, $ok);
}
public function probeUrl(string $url) : bool
{
$ret = false;
$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_exec($c);
if (!curl_errno($c)) {
$st = curl_getinfo($c, CURLINFO_HTTP_CODE);
$ret = $this->httpStatusOk((int)$st);
}
curl_close($c);
return $ret;
}
}