Компоненты маршрутизации Symfony (или мое неправильное использование) душат мое приложение

Несколько дней назад я задал вопрос, как я могу создать свой собственный обработчик аргументов для моей собственной фреймворк php, я понял, как благодаря ответу, но время не позволило мне его создать, поэтому я решил использовать Symfony:

Symfony\Component\Routing\RouteCollection
Symfony\Component\Routing\Route
Symfony\Component\Routing\Matcher\UrlMatcher
Symfony\HttpKernel\Controller\ControllerResolver
Symfony\Component\HttpKernel

Если Silex, Drupal и Laravel могут использовать их, почему не я?

Ну, я реализовал их и создал новый маршрут, назовем его / testroute (TestController :: IndexAction), пока все в порядке.
Я выполнил тесты с apache ab для моего индексного маршрута ‘/’: 1000 запросов для 10 одновременно работающих пользователей, и это привело к 3400 запросам в секунду.

Но затем я проверил мой новый маршрут, и результаты были …. 9 запросов в секунду, ага девять.

Я не могу избавиться от ощущения, что это как-то моя вина, но я открыт для предложений, вот код моей платформы:

.Htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /framework/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ front.php [L,QSA]
</IfModule>
DirectoryIndex index.html front.php

front.php (мой фронт-контроллер)

требует ‘config / configuration.php’;

require 'autoloader.php';

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing;
use Symfony\Component\Routing\RequestContext;

use core\Kernel\AppKernel;


$request = Request::createFromGlobals();
$routes = include 'config/routing.php';

$context = new RequestContext();
$context->fromRequest($request);

//App kernel created by me
$appKern = new AppKernel($request, $routes, $context);

$appKern->run();

routing.php (все маршруты)

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

$routes = new RouteCollection();

$routes->add('index', new Route('/', array('_controller' => 'app\Controllers\IndexController::indexAction')));
$routes->add('profiles', new Route('/profiles', array('_controller' => 'app\Controllers\ProfilesController::indexAction')));


return $routes;

AppKernel.php

ядро пространства имен \ Kernel;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel;
use Symfony\Component\Routing;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\RequestContext;

class AppKernel {

private $request;

private $routes;

private $context;


public function __construct(Request $request, RouteCollection $routes, RequestContext $context) {

$this->request = $request;
$this->routes = $routes;
$this->context = $context;
}

private function callController($controller, $arguments) {

$response = call_user_func_array($controller, $arguments);
}

public function run() {

$matcher = new Routing\Matcher\UrlMatcher($this->routes, $this->context);
$resolver = new HttpKernel\Controller\ControllerResolver();

try {
$this->request->attributes->add($matcher->match($this->request->getPathInfo()));

$controller = $resolver->getController($this->request);
$arguments = $resolver->getArguments($this->request, $controller);

$this->callController($controller, $arguments);
} catch (Routing\Exception\ResourceNotFoundException $e) {
$response = new Response('Not Found', 404);
} catch (Exception $e) {
$response = new Response('An error occurred', 500);
}
}

}

autoloader.php

require_once 'Symfony/Component/ClassLoader/ClassLoader.php';

use Symfony\Component\ClassLoader\ClassLoader;

$loader = new ClassLoader();

// to enable searching the include path (eg. for PEAR packages)
$loader->setUseIncludePath(true);

// ... register namespaces and prefixes here - see below

$loader->register();

$loader->addPrefix('Symfony\Component\HttpFoundation', 'Symfony/Components/http-foundation');
$loader->addPrefix('app\Controllers', ROOT . 'app/Controllers');
$loader->addPrefix('core\Db', ROOT . 'core/Db');
$loader->addPrefix('core\Kernel', ROOT . 'core/Kernel');
$loader->addPrefix('Symfony\Component\Routing', 'Symfony/Component/Routing');
$loader->addPrefix('Symfony\Component\HttpKernel', 'Symfony/Component/HttpKernel');

Оба моих контроллера пусты, я не верю, что проблема с ними.

Постскриптум Я следую за Потенсером, как создать свой собственный фреймворк

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …