运行时组件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
运行时组件
运行时组件将引导逻辑从任何全局状态中解耦,以确保应用程序可以在不做任何更改的情况下与PHP-FPM、ReactPHP、Swoole等运行时一起运行。
5.3
Runtime组件是在Symfony 5.3中引入的。ob娱乐下载
安装
1
$作曲家需要symfony/runtob娱乐下载ime
请注意
如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。
使用
运行时组件抽象了大部分所谓的引导逻辑运行时,允许您以通用的方式编写前控制器。例如,Runtime组件允许Symfony的ob娱乐下载公共/ index . php
看起来像这样:
1 2 3 4 5 6 7 8 9
<?php/ /公共/ index . php使用应用程序\内核;require_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;返回函数(数组$上下文){返回新内核($上下文[“APP_ENV”),(保龄球)$上下文[“APP_DEBUG”]);};
那么前置控制器是如何工作的呢?首先是特别的autoload_runtime.php
文件由组件中的Composer插件自动创建。该文件运行如下逻辑:
- 它实例化了RuntimeInterface;
- 返回的可调用对象
公共/ index . php
)被传递给运行时,运行时的任务是解析参数(在本例中:数组$上下文
); - 然后,调用这个可调用对象以获取应用程序(
App \内核
); - 最后,运行时用于运行应用程序(即调用
内核- >处理(要求::createFromGlobals()) - >发送()
).
谨慎
如果你使用Composer——没有剧本
选项,确保你的Composer版本是> = 2.1.3
;否则,autoload_runtime.php
文件将不会被创建。
要创建一个控制台应用程序,引导代码看起来像这样:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#!/usr/bin/env php<?php/ / bin /控制台使用应用程序\内核;使用ob娱乐下载\包\FrameworkBundle\控制台\应用程序;require_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;返回函数(数组$上下文){$内核=新内核($上下文[“APP_ENV”),(保龄球)$上下文[“APP_DEBUG”]);//返回一个"Application"使运行时运行控制台//应用程序而不是HTTP内核返回新应用程序($内核);};
选择运行时
默认运行时为ob娱乐下载SymfonyRuntime.它在大多数使用PHP-FPM(如Nginx或Apache)的web服务器运行的应用程序上工作出色。
组件还提供了一个GenericRuntime,它使用PHP的$ _SERVER
,$ _POST
,$ _GET
,带有_file美元
而且_SESSION美元
已经。您也可以使用自定义运行时(例如与Swoole或AWS Lambda集成)。
使用APP_RUNTIME
环境变量或指定extra.runtime.class
在composer.json
修改Runtime类:
1 2 3 4 5 6 7 8 9 10
{“需要”: {“…”:“…”},“额外的”: {“运行时”: {“类”:“ob娱乐下载Symfony \ \组件\ \ Runtime \ \ GenericRuntime”}}}
使用运行时
运行时负责将参数传递到闭包中并运行由闭包返回的应用程序。的ob娱乐下载SymfonyRuntime而且GenericRuntime支持可以在前置控制器中使用的许多参数和不同的应用程序。
可分解的参数
从前端控制器返回的闭包可以有0个或多个参数:
1 2 3 4 5 6 7 8 9 10
<?php/ /公共/ index . php使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;require_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;返回函数(InputInterface$输入, OutputInterface$输出){/ /……};
属性支持以下参数ob娱乐下载SymfonyRuntime
:
- 请求
- 从全局变量创建的请求。
- InputInterface
- 读取选项和参数的输入。
- OutputInterface
- 控制台输出,打印到CLI的样式。
- 应用程序
- 用于创建CLI应用。
- 命令
-
用于创建一行命令CLI应用程序(使用
命令:setCode ()
).
这些论点得到了ob娱乐下载SymfonyRuntime
而且GenericRuntime
(类型和变量名都很重要):
-
数组$上下文
-
这和
$ _SERVER
+_ENV美元
. -
$ argv数组
-
传递给命令的参数(与
$ _SERVER (argv的)
). -
数组$请求
-
用钥匙
查询
,身体
,文件
而且会话
.
可分解的应用
下面的闭包返回的应用程序是一个Symfony Kernel。ob娱乐下载但是,支持许多不同的应用程序:
1 2 3 4 5 6 7 8 9
<?php/ /公共/ index . php使用应用程序\内核;require_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;返回函数(){返回新内核(“刺激”,假);};
的ob娱乐下载SymfonyRuntime
可以处理这些应用程序:
- HttpKernelInterface
- 应用程序将使用HttpKernelRunner就像一个“标准的”Symfony应用ob娱乐下载程序。
- 响应
-
响应将由ResponseRunner:
1 2 3 4 5 6 7 8 9
<?php/ /公共/ index . php使用ob娱乐下载\组件\HttpFoundation\响应;require_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;返回函数(){返回新响应(“Hello world”);};
- 命令
-
编写单个命令应用程序。这将使用ConsoleApplicationRunner:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
<?php使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;require_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;返回函数(命令$命令){$命令->setCode (函数(InputInterface$输入, OutputInterface$输出){$输出->写(“Hello World”);});返回$命令;};
- 应用程序
-
对于带有多个命令的控制台应用程序非常有用。这将使用ConsoleApplicationRunner:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
<?php使用ob娱乐下载\组件\控制台\应用程序;使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;require_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;返回函数(数组$上下文){$命令=新命令(“你好”);$命令->setCode (函数(InputInterface$输入, OutputInterface$输出){$输出->写(“Hello World”);});$应用程序=新应用程序();$应用程序->add ($命令);$应用程序->setDefaultCommand (“你好”,真正的);返回$应用程序;};
的GenericRuntime
而且ob娱乐下载SymfonyRuntime
还支持这些通用应用程序:
- RunnerInterface
-
的
RunnerInterface
是一种使用通用运行时的自定义应用程序的方法:12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<?php/ /公共/ index . php使用ob娱乐下载\组件\运行时\RunnerInterface;require_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;返回函数(){返回新类实现了RunnerInterface{公共函数运行():int{回声“Hello World”;返回0;}};};
-
可调用的
-
你的“应用”也可以是一个
可调用的
.第一个可调用对象返回“应用程序”,第二个可调用对象是“应用程序”本身:12 3 4 5 6 7 8 9 10 11 12 13 14
<?php/ /公共/ index . phprequire_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;返回函数(){$应用程序=函数(){回声“Hello World”;返回0;};返回$应用程序;};
-
无效
-
如果可调用对象没有返回任何东西,则
ob娱乐下载SymfonyRuntime
会假设一切正常:1 2 3 4 5 6 7
<?phprequire_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;返回函数(){回声“Hello world”;};
利用期权
运行时的一些行为可以通过运行时选项进行修改。可以使用APP_RUNTIME_OPTIONS
环境变量:
1 2 3 4 5 6 7 8 9
<?php$_SERVER[“APP_RUNTIME_OPTIONS”] = [“project_dir”= >“/ var /任务”,);require_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;/ /……
您还可以配置extra.runtime.options
在composer.json
:
1 2 3 4 5 6 7 8 9 10
{“需要”: {“…”:“…”},“额外的”: {“运行时”: {“project_dir”:“/ var /任务”}}}
方法支持以下选项ob娱乐下载SymfonyRuntime
:
-
env
(默认值:APP_ENV
环境变量,或“开发”
) - 定义应用程序运行的环境的名称。
-
disable_dotenv
(默认值:假
) -
禁用查找
.env
文件。 -
dotenv_path
(默认值:.env
) - 定义。env文件的路径。
-
use_putenv
-
告诉Dotenv设置环境变量使用
putenv ()
(不推荐)。 -
prod_envs
(默认值:["刺激"]
) - 定义生产环境的名称。
-
test_envs
(默认值:(“测试”)
) - 定义测试环境的名称。
除此之外,GenericRuntime
而且ob娱乐下载SymfonyRuntime
还支持以下选项:
-
调试
(默认值:APP_DEBUG
环境变量,或真正的
) - 切换显示错误。
-
运行时
-
将“应用程序类型”映射到
GenericRuntime
一个知道如何处理每一个的实现。 -
error_handler
(默认值:BasicErrorHandler或ob娱乐下载SymfonyErrorHandler为ob娱乐下载SymfonyRuntime
) - 定义用于处理PHP错误的类。
创建自己的运行时
这是一个高级主题,描述Runtime组件的内部结构。
使用Runtime组件将使维护者受益,因为引导逻辑可以作为普通包的一部分进行版本控制。如果应用程序作者决定使用此组件,则Runtime类的包维护者将拥有更多控制权,可以修复错误并添加特性。
请注意
在Symfonob娱乐下载y 5.3之前,Symfony引导逻辑是Flex配方的一部分。由于用户很少更新食谱,因此很少会安装错误补丁。
Runtime组件被设计为完全通用的,能够在全局状态之外运行任何应用程序,分为6步:
- 主入口点返回可调用的(“应用程序”)包装应用程序;
- 的应用程序可调用的传递给
RuntimeInterface: getResolver ()
,该函数返回ResolverInterface.这个解析器返回一个数组,在索引0处有应用程序可调用对象(或者修饰这个可调用对象的东西),在索引1处有它的所有已解析参数。 - 的应用程序可调用的时,它将返回一个表示应用程序的对象。
- 这应用程序对象传递给
RuntimeInterface: getRunner ()
,该函数返回RunnerInterface:知道如何“运行”应用程序对象的实例。 - 的
RunnerInterface:运行应用程序对象($)
调用,它返回退出状态代码为' int '。 - PHP引擎使用此状态代码终止。
在创建一个新的运行时时,有两件事需要考虑:首先,最终用户将使用什么参数?其次,用户的应用程序将是什么样子?
例如,假设您想创建一个运行时ReactPHP:
最终用户将使用什么参数?
对于一般的ReactPHP应用程序,通常不需要特殊的参数。这意味着您可以使用GenericRuntime.
用户的应用程序看起来会是什么样子?
也没有典型的React应用程序,因此您可能需要依赖PSR-15接口用于HTTP请求处理。
但是,ReactPHP应用程序将需要一些特殊的逻辑来实现运行.该逻辑被添加到一个新的类实现中RunnerInterface:
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
使用Psr\Http\消息\ServerRequestInterface;使用Psr\Http\服务器\RequestHandlerInterface;使用反应\EventLoop\工厂作为ReactFactory;使用反应\Http\服务器作为ReactHttpServer;使用反应\套接字\服务器作为ReactSocketServer;使用ob娱乐下载\组件\运行时\RunnerInterface;类ReactPHPRunner实现了RunnerInterface{私人$应用程序;私人$港口;公共函数__construct(RequestHandlerInterface$应用程序, int$港口){$这->应用=$应用程序;$这->端口=$港口;}公共函数运行():int{$应用程序=$这->应用程序;$循环= ReactFactory::create ();//配置ReactPHP以正确处理PSR-15应用程序$服务器=新ReactHttpServer ($循环,函数(ServerRequestInterface$请求)使用($应用程序){返回$应用程序->处理($请求);});启动ReactPHP服务器$套接字=新ReactSocketServer ($这->港口,$循环);$服务器->听($套接字);$循环->run ();返回0;}}
通过扩展GenericRuntime
,你要确保应用程序总是在使用这个ReactPHPRunner
:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
使用ob娱乐下载\组件\运行时\GenericRuntime;使用ob娱乐下载\组件\运行时\RunnerInterface;类ReactPHPRuntime扩展GenericRuntime{私人$港口;公共函数__construct(数组$选项){$这->端口=$选项[“端口”) ? ?8080;父::__construct ($选项);}公共函数getRunner(?对象$应用程序):RunnerInterface{如果($应用程序运算符RequestHandlerInterface) {返回新ReactPHPRunner ($应用程序,$这->港口);}//如果不是PSR-15应用程序,使用GenericRuntime来//运行应用程序(参见上面的“可解析应用程序”)返回父::getRunner ($应用程序);}}
最终用户现在可以创建前端控制器,比如:
1 2 3 4 5 6 7
<?phprequire_once目录名(__DIR__).“/供应商/ autoload_runtime.php”;返回函数(数组$上下文){返回新SomeCustomPsr15Application ();};