lib/php/libsdk/SDK/Build/PGO/PHP/FCGI.php (88 lines of code) (raw):

<?php namespace SDK\Build\PGO\PHP; 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 FCGI extends Abstracts\PHP implements Interfaces\PHP { use FileOps; protected $is_tcp; public function __construct(PGOConfig $conf, bool $is_tcp) { if (!$is_tcp) { throw new Exception("FCGI training other than through TCP is not implemented yet."); } $this->conf = $conf; $this->is_tcp = $is_tcp; $this->scenario = $conf->getScenario(); $this->id = $this->getIdString(); $this->setupPaths(); } public function getExeFilename() : string { $exe = $this->getRootDir() . DIRECTORY_SEPARATOR . "php-cgi.exe"; if (!file_exists($exe)) { throw new Exception("Path '$exe' doesn't exist."); } return $exe; } protected function createEnv() : array { $env = parent::createEnv(); $fcgi_env = (array)$this->conf->getSectionItem("php", "fcgi:env"); foreach ($fcgi_env as $k => $v) { $env[$k] = $v; } return $env; } public function prepareInit(PackageWorkman $pw, bool $force = false) : void { } public function init() : void { /* echo "Initializing PHP FCGI.\n"; echo "PHP FCGI initialization done.\n";*/ } public function up() : void { echo "Starting PHP FCGI.\n"; if ("cache" == $this->scenario) { if (file_exists($this->opcache_file_cache)) { $this->rm($this->opcache_file_cache); } if (!mkdir($this->opcache_file_cache)) { throw new Exception("Failed to create '{$this->opcache_file_cache}'"); } } $exe = $this->getExeFilename(); $ini = $this->getIniFilename(); $host = $this->conf->getSectionItem("php", "fcgi", "host"); $port = $this->conf->getSectionItem("php", "fcgi", "port"); $cmd = "start /b $exe -n -c $ini -b $host:$port 2>&1"; $desc = array( 0 => array("file", "php://stdin", "r"), 1 => array("file", "php://stdout", "w"), 2 => array("file", "php://stderr", "w"), ); $p = proc_open($cmd, $desc, $pipes, $this->getRootDir(), $this->createEnv()); /* Give some time, it might be slow on PGI enabled proc. */ sleep(3); /*while(false !== ($s = fread($pipes[2], 1024))) { echo "$s"; }*/ $c = proc_close($p); if ($c) { throw new Exception("PHP FCGI process exited with code '$c'."); } /* XXX for Opcache, setup also file cache. */ echo "PHP FCGI started.\n"; } public function down(bool $force = false) : void { echo "Stopping PHP FCGI.\n"; exec("taskkill /f /im php-cgi.exe >nul 2>&1"); /* XXX Add cleanup interface. */ if ("cache" == $this->scenario) { try { $this->rm($this->opcache_file_cache); } catch (\UnexpectedValueException $e) { echo $e->getMessage(), "\n"; } } echo "PHP FCGI stopped.\n"; } }