Section courante

A propos

Section administrative du site

Travailler avec l'application

Interface IWebApplication

Dans Fano Framework, l'application doit implémenter l'interface IWebApplication. Actuellement, elle ne fournit aucune méthode à l'exception de la méthode run() héritée de l'interface IRunnable étant son parent.

Implémentation intégrée

Le Fano Framework fournit des implémentations intégrées de IWebApplication :

Implémentation Description
TCgiWebApplication Une application Web CGI implémentant le protocole CGI. Il s'agit essentiellement d'une application interpréteur de commande s'exécutant puis se termine après avoir terminé son travail.
TDaemonWebApplication Est une application Web s'exécutant en permanence et écoute les requêtes jusqu'à ce qu'elle soit terminée manuellement. Elle est principalement utilisée pour les applications Web FastCGI, SCGI et uwsgi.

Interface IAppServiceProvider

Le TCgiWebApplication dépend de l'instance de l'interface IAppServiceProvider tandis que TDaemonWebApplication dépend de IDaemonAppServiceProvider. Ils fournissent des services essentiels pour l'application. Le code suivant est la déclaration de cette interface :

  1. Type
  2.  IAppServiceProvider=Interface(IServiceProvider)
  3.    ['{41032A70-F31D-45A6-AE26-574888BE4D07}']
  4.   Function getContainer():IDependencyContainer;
  5.   Property container:IDependencyContainer read getContainer;
  6.  
  7.   Function getErrorHandler():IErrorHandler;
  8.   Property errorHandler:IErrorHandler read getErrorHandler;
  9.  
  10.   Function getDispatcher():IDispatcher;
  11.   Property dispatcher:IDispatcher read getDispatcher;
  12.  
  13.   Function getEnvironment():ICGIEnvironment;
  14.   Property env:ICGIEnvironment read getEnvironment;
  15.  
  16.   Function getRouter():IRouter;
  17.   Property router:IRouter read getRouter;
  18.  
  19.   Function getStdIn():IStdIn;
  20.   Property stdIn:IStdIn read getStdIn;
  21.  End;
  22.  
  23.  IDaemonAppServiceProvider = interface(IAppServiceProvider)
  24.    ['{4FF6129E-171F-429C-BE5B-7A8B941D3626}']
  25.   Function getServer() : IRunnableWithDataNotif;
  26.   Property server : IRunnableWithDataNotif read getServer;
  27.  
  28.   Function getProtocol():IProtocolProcessor;
  29.   Property protocol:IProtocolProcessor read getProtocol;
  30.  
  31.   Function getOutputBuffer():IOutputBuffer;
  32.   Property outputBuffer:IOutputBuffer read getOutputBuffer;
  33.  
  34.   Function getStdOut():IStdOut;
  35.   Property stdOut:IStdOut read getStdOut;
  36.  End;

Le Fano Framework fournit plusieurs implémentations intégrées de cette interface que vous pouvez utiliser ou étendre :

Implémentation Description
TBasicAppServiceProvider Classe abstraite implémentant l'interface IAppServiceProvider. La plupart des méthodes ont déjà une implémentation, à l'exception de sa méthode register() que vous devez implémenter pour enregistrer les dépendances spécifiques à votre application. Pour les applications Web CGI, cette classe est celle que vous devez utiliser.
TDaemonAppServiceProvider La classe abstraite hérite de la classe TBasicAppServiceProvider implémentant l'interface IDaemonAppServiceProvider. La plupart des méthodes ont déjà une implémentation, à l'exception de sa méthode register() que vous devez implémenter pour enregistrer les dépendances spécifiques à votre application. Pour un service d'application Web, cette classe est celle que vous devez utiliser.
TServerAppServiceProvider Classe fournissant un serveur de travail pour le service de l'application Web.
TFastCgiAppServiceProvider Classe fournissant des services essentiels pour l'application Web FastCGI.
TScgiAppServiceProvider Classe fournissant des services essentiels pour l'application Web SCGI.
TUwsgiAppServiceProvider Classe fournissant des services essentiels pour l'application Web uwsgi.
TMhdAppServiceProvider Classe fournissant des services essentiels pour l'application Web libmicrohttpd.

Interface IRouteBuilder

Lors de la création d'une instance d'application, vous devez également implémenter l'interface IRouteBuilder étant chargée de configurer les itinéraires d'application.

Application CGI

TCgiWebApplication est une classe intégrée implémentant le protocole CGI. Sa tâche consiste essentiellement à lire les variables d'environnement CGI que le serveur Web envoie et à appeler le gestionnaire de requêtes approprié.

Sa méthode constructeur attend deux paramètres, une instance de l'interface IAppServiceProvider et IRouteBuilder. Le premier paramètre doit fournir les services essentiels requis par l'application et également enregistrer toutes les dépendances de l'application.

Pour l'application CGI, Fano Framework fournit la classe abstraite TBasicAppServiceProvider que vous devez étendre pour enregistrer vos dépendances d'application. Vous devez implémenter sa méthode register().

Le dernier paramètre est une instance de la classe responsable de la création des routes d'application. Fano Framework fournit la classe abstraite de base TRouteBuilder que vous devez étendre. Vous devez implémenter sa méthode buildRoutes(). Veuillez noter que vous n'êtes pas obligé d'hériter de la classe TRouteBuilder. Vous pouvez utiliser n'importe quelle classe tant qu'elle implémente l'interface IRouteBuilder.

  1. appInstance:=TCgiWebApplication.create(TAppServiceProvider.create(),TAppRoutes.create());

Où TAppServiceProvider est déclaré comme suit :

  1. TAppServiceProvider=Class(TBasicAppServiceProvider)
  2.  Public
  3.   Procedure register(const container : IDependencyContainer); override;
  4. End;
  5. ...
  6.  Procedure TAppServiceProvider.register(const container : IDependencyContainer);Begin
  7.     //inscrivez ici tous les services requis pour l'application
  8.  End;
  9.  
  10. TAppRoutes=class(TRouteBuilder)
  11.  Public
  12.   Procedure buildRoutes(Const container:IDependencyContainer;Const Router:IRouter); override;
  13.  End;
  14. ...
  15.  Procedure TAppRoutes.buildRoutes(Const container:IDependencyContainer;Const Router:IRouter);Begin
  16.   //inscrivez tous les itinéraires ici
  17.  End;

Service d'application Web

L'application Web s'exécutant en permanence en arrière-plan doit configurer un fournisseur de services héritant de TDaemonAppServiceProvider, comme une application Web utilisant le protocole FastCGI, SCGI ou uwsgi, car l'application dépend de l'interface IDaemonAppServiceProvider.

  1. TAppServiceProvider=Class(TDaemonAppServiceProvider)
  2.  Public
  3.   Procedure register(Const container:IDependencyContainer); override;
  4. End;

Application FastCGI

Pour créer une application Web prenant en charge le protocole FastCGI, créez un fournisseur de services d'application utilisant TFastCgiAppServiceProvider comme indiqué dans le code suivant :

  1. appInstance:=TDaemonWebApplication.create(
  2.         TFastCgiAppServiceProvider.create(
  3.                 TServerAppServiceProvider.create(
  4.                         TAppServiceProvider.create(),
  5.                         (TInetSvrFactory.create(host, port) as ISocketSvrFactory).build()
  6.                 )
  7.         ),
  8.         TAppRoutes.create()
  9. );

Vous pouvez remplacer TInetSvrFactory par la classe TUnixSvrFactory si vous souhaitez utiliser le fichier de socket de domaine Unix au lieu du port TCP.

Vous pouvez remplacer TInetSvrFactory par TBoundSvrFactory si vous souhaitez créer une application FastCGI s'exécutant et est gérée par un serveur Web, par exemple Apache avec le module mod_fcgid.

TInetSvrFactory, TUnixSvrFactory et TBoundSvrFactory utilisent select pour surveiller si le socket est prêt pour l'opération d'entrée/sortie. Pour utiliser epoll, remplacez par TEpollInetSvrFactory, TEpollUnixSvrFactory et TEpollBoundSvrFactory. Si vous utilisez FreeBSD, pour utiliser kqueue, remplacez-le par TKqueueInetSvrFactory, TKqueueUnixSvrFactory et TKqueueBoundSvrFactory. Vous devez ajouter une définition de compilation conditionnelle $DEFINE USE_KQUEUE ou ajouter la ligne -dUSE_KQUEUE dans le fichier build.cfg.

Application SCGI

Pour créer une application Web prenant en charge le protocole SCGI (Simple Common Gateway Interface), créez un fournisseur de services d'application utilisant TScgiAppServiceProvider comme indiqué dans le code suivant :

  1. appInstance:=TDaemonWebApplication.create(
  2.     TScgiAppServiceProvider.create(
  3.         TServerAppServiceProvider.create(
  4.             TAppServiceProvider.create(),
  5.             (TInetSvrFactory.create(host, port) as ISocketSvrFactory).build()
  6.         )
  7.     ),
  8.     TAppRoutes.create()
  9. );

Application Uwsgi

Pour créer une application Web prenant en charge le protocole uwsgi, créez un fournisseur de services d'application utilisant TUwsgiAppServiceProvider comme indiqué dans le code suivant :

  1. appInstance:=TDaemonWebApplication.create(
  2.     TUwsgiAppServiceProvider.create(
  3.         TServerAppServiceProvider.create(
  4.             TAppServiceProvider.create(),
  5.             (TInetSvrFactory.create(host, port) as ISocketSvrFactory).build()
  6.         )
  7.     ),
  8.     TAppRoutes.create()
  9. );

Application HTTP

Pour créer une application Web prenant en charge le protocole http à l'aide de libmicrohttpd, créez un fournisseur de services d'application qui utilise TMhdAppServiceProvider et remplissez également la configuration du serveur Web comme indiqué dans le code suivant :

  1. var
  2.     svrConfig:TMhdSvrConfig;
  3. (* ... *)
  4.     svrConfig.host:='exemple.fano';
  5.     svrConfig.port:=8080;
  6.     svrConfig.documentRoot:=getCurrentDir() + '/public';
  7.     svrConfig.serverName:='exemple.fano';
  8.     svrConfig.serverAdmin:='admin@exemple.fano';
  9.     svrConfig.serverSoftware:='Fano Framework Web App';
  10.     svrConfig.timeout:=120; // délai d'expiration de la connexion en secondes
  11.  
  12.     appInstance:=TDaemonWebApplication.create(
  13.         TMhdAppServiceProvider.create(
  14.             TAppServiceProvider.create(),
  15.             svrConfig
  16.         ),
  17.         TAppRoutes.create()
  18.     );

Utiliser l'adresse IPv6

Si vous souhaitez créer un serveur d'application Web lié à l'adresse IPv6, remplacez TInetSvrFactory, TEpollInetSvrFactory, TKqueueInetSvrFactory par la classe TInet6SvrFactory, TEpollInet6SvrFactory, TKqueueInet6SvrFactory respectivement.

Vous devrez peut-être remplacer l'adresse du serveur dans le module proxy du serveur Web. Par exemple, pour une application SCGI utilisant le module Apache mod_proxy_scgi, vous devez modifier la configuration de l'hôte virtuel comme indiqué dans l'exemple suivant.

# Adresse IPv4
# ProxyPassMatch ^/(.*)$ "scgi://127.0.0.1:20477"

# Adresse IPv6
ProxyPassMatch ^/(.*)$ "scgi://[::1]:20477"

Veuillez noter que l'adresse IPv6 doit être entre crochets.

Pour les applications Web basées sur libmicrohttpd, vous pouvez ajouter la prise en charge de l'adresse IPv6 en définissant le champ useIPv6 de l'enregistrement TMhdSvrConfig sur true. Si vous avez besoin à la fois d'IPv4 et d'IPv6, définissez le champ dualStack de TMhdSvrConfig sur true.

  1. var svrConfig:TMhdSvrConfig;
  2. ...
  3. svrConfig.useIPv6:=true;
  4. svrConfig.dualStack:=false; // Seulement IPv6

Comment choisir l'implémentation d'IWebApplication ?

Implémentation Avantages Inconvénients
Application CGI Facile à configurer, en particulier sur un hébergement partagé où vous ne possédez pas de privilège d'administrateur de serveur. Pas très performant par rapport à l'application FastCGI ou SCGI en raison du fonctionnement du protocole CGI.
Application FastCGI Les performances sont bonnes par rapport à l'application CGI. Nécessite un privilège d'administrateur de serveur pour la configuration. Vous ne pouvez pas déployer facilement l'application sur un hébergement partagé.
Application SCGI Les performances sont bonnes par rapport à l'application CGI et peut-être légèrement meilleures que FastCGI en raison d'une spécification de protocole plus simple. Nécessite un privilège d'administrateur de serveur pour la configuration. Vous ne pouvez pas déployer facilement l'application sur un hébergement partagé.
Application uwsgi Les performances sont comparables au protocole SCGI mais nécessitent moins de bande passante réseau en raison de l'utilisation du protocole binaire. Nécessite un privilège d'administrateur de serveur pour la configuration. Vous ne pouvez pas déployer facilement l'application sur un hébergement partagé.


Dernière mise à jour : Vendredi, le 18 octobre 2024