Skip to content

Instantly share code, notes, and snippets.

@Mikulas
Created November 20, 2015 22:22
Show Gist options
  • Save Mikulas/1e6b0bc3297fdc4a2000 to your computer and use it in GitHub Desktop.
Save Mikulas/1e6b0bc3297fdc4a2000 to your computer and use it in GitHub Desktop.
Example Nette Framework bridge kernel connection to PHPFastCGI fast cgi FastCGIDaemon daemon
<?php
namespace App\FastCGI;
use App\Services\RouterFactory;
use Kdyby;
use Nette\Application\Application;
use Nette\Application\IPresenterFactory;
use Nette\Application\IRouter;
use Nette\Application\Routers\RouteList;
use Nette\Http;
use PHPFastCGI\FastCGIDaemon\Http\RequestInterface;
use PHPFastCGI\FastCGIDaemon\KernelInterface;
use Psr\Http\Message\ResponseInterface;
use Tracy\Debugger;
use Zend\Diactoros\Response\HtmlResponse;
/**
* Does not support nette error presenter, redirects and forwards
*/
class Kernel implements KernelInterface
{
/** @var IPresenterFactory */
private $presenterFactory;
/** @var IRouter */
private $router;
public function __construct(IPresenterFactory $presenterFactory, IRouter $router)
{
$this->presenterFactory = $presenterFactory;
$this->router = $router;
// prevent Nette\Application\Routers\CliRouter from matching
$_SERVER['console_argv'] = $_SERVER['argv'];
$_SERVER['console_argc'] = $_SERVER['argc'];
unset($_SERVER['argv'], $_SERVER['argc']);
// prevent Kdyby\Console\CliRouter from matching
if ($router instanceof RouteList) {
foreach ($router->getIterator() as $innerRouter) {
if ($innerRouter instanceof Kdyby\Console\CliRouter) {
$innerRouter->allowedMethods = [];
break;
}
}
}
}
/**
* Handles a request and returns a response.
*
* @param RequestInterface $request FastCGI HTTP request object
*
* @return ResponseInterface HTTP response message
*/
public function handleRequest(RequestInterface $request)
{
$serverRequest = $request->getServerRequest();
$url = new Http\UrlScript((string) $serverRequest->getUri());
$netteHttpRequest = new Http\Request(
$url, NULL,
$serverRequest->getParsedBody(),
$serverRequest->getUploadedFiles(),
$serverRequest->getCookieParams(),
$serverRequest->getHeaders(),
$serverRequest->getMethod()
// TODO
);
$netteHttpResponse = new Http\Response();
$netteAppRequest = $this->router->match($netteHttpRequest);
$app = new Application($this->presenterFactory, $this->router, $netteHttpRequest, $netteHttpResponse);
ob_start();
$app->processRequest($netteAppRequest);
$output = ob_get_clean();
return new HtmlResponse($output, $netteHttpResponse->getCode(), $netteHttpResponse->getHeaders());
}
private function debug()
{
file_put_contents('/dev/ttys004', Debugger::dump(func_get_args(), TRUE));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment