lib/php/libsdk/SDK/Build/PGO/Server/NGINX.php (106 lines of code) (raw):
<?php
namespace SDK\Build\PGO\Server;
use SDK\Build\PGO\Interfaces;
use SDK\Build\PGO\Abstracts;
use SDK\Build\PGO\{Config as PGOConfig};
use SDK\{Exception, FileOps};
use SDK\Build\PGO\Tool\PackageWorkman;
class NGINX extends Abstracts\Server implements Interfaces\Server\HTTP
{
use FileOps;
protected $name = "NGINX";
protected $conf;
protected $base;
protected $php;
public function __construct(PGOConfig $conf, Interfaces\PHP $php)
{
$this->conf = $conf;
$this->base = $conf->getSrvDir(strtolower($this->name));
$this->php = $php;
}
protected function setupDist() : void
{
$nginx_conf_in = $this->conf->getTplDir($this->name) . DIRECTORY_SEPARATOR . "nginx.conf";
$conf_fn = $this->base . DIRECTORY_SEPARATOR . "conf" . DIRECTORY_SEPARATOR . "nginx.conf";
$port = $this->conf->getSectionItem($this->name, "port");
if (!$port) {
$port = $this->conf->getNextPort();
$this->conf->setSectionItem($this->name, "port", $port);
}
$vars = array(
$this->conf->buildTplVarName($this->name, "docroot") => str_replace("\\", "/", $this->base . DIRECTORY_SEPARATOR . "html"),
);
$this->conf->processTplFile(
$nginx_conf_in,
$conf_fn,
$vars
);
}
public function prepareInit(PackageWorkman $pw, bool $force = false) : void
{
$url = $this->conf->getSectionItem($this->name, "pkg_url");
$pw->fetchAndUnzip($url, "nginx.zip", $this->conf->getSrvDir(), "nginx", $force);
}
public function init() : void
{
echo "Initializing " . $this->name . ".\n";
$this->setupDist();
$this->upMe();
$this->downMe(true);
echo $this->name . " initialization done.\n";
}
protected function upMe() : void
{
echo "Starting " . $this->name . ".\n";
$cwd = getcwd();
chdir($this->base);
$h = popen("start /b .\\nginx.exe 2>&1", "r");
if (!is_resource($h)) {
chdir($cwd);
throw new Exception("Failed to start NGINX.");
}
sleep(3);
/* while (!feof($h)) {
echo fread($h, 1024);
}*/
pclose($h);
chdir($cwd);
echo $this->name . " started.\n";
}
public function up() : void
{
$this->php->up();
$this->upMe();
}
public function downMe(bool $force = false) : void
{
echo "Stopping " . $this->name . ".\n";
$cwd = getcwd();
chdir($this->base);
exec(".\\nginx.exe -s quit");
if ($force) {
sleep(1);
exec("taskkill /f /im nginx.exe >nul 2>&1");
}
chdir($cwd);
echo $this->name . " stopped.\n";
}
public function down(bool $force = false) : void
{
$this->php->down();
$this->downMe($force);
}
/* Use only for init phase! */
public function addServer(string $part_tpl_fn, array $tpl_vars = array())
{
if (!file_exists($part_tpl_fn)) {
throw new Exception("Template file '$part_tpl_fn' doesn't exist.");
}
/* We've already did a fresh (re)config, so use the work file now. */
$nginx_conf_in = $this->base . DIRECTORY_SEPARATOR . "conf" . DIRECTORY_SEPARATOR . "nginx.conf";
$cur_conf = file_get_contents($nginx_conf_in);
$in = file_get_contents($part_tpl_fn);
$out = $this->conf->processTpl($in, $tpl_vars);
$tpl = " # PHP_SDK_PGO_NGINX_SERVERS_INC_TPL";
$new_conf = str_replace($tpl, "$out\n$tpl", $cur_conf);
$conf_fn = $this->base . DIRECTORY_SEPARATOR . "conf" . DIRECTORY_SEPARATOR . "nginx.conf";
if (!file_put_contents($conf_fn, $new_conf)) {
throw new Exception("Couldn't write '$conf_fn'.");
}
}
}