运行时组件
编辑该页面运行时组件
运行时组件将引导逻辑从任何全局状态,以确保运行时的应用程序可以运行像PHP-PM ReactPHP, Swoole等没有任何变化。
安装
1
美元作曲家需要symfony /运行时ob娱乐下载
请注意
如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php
文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。
使用
运行时组件抽象最所谓引导逻辑运行时以一个通用的方式,允许您编写前端控制器。例如,运行时组件允许Symfony的ob娱乐下载公共/ index . php
看起来像这样:
1 2 3 4 5 6 7 8
/ /公共/ index . php使用应用程序\内核;require_once目录名(__DIR__)。“/供应商/ autoload_runtime.php”;返回函数(数组美元上下文):内核{返回新内核(美元上下文(“APP_ENV”),(保龄球)美元上下文(“APP_DEBUG”]);};
所以这个前端控制器是如何工作的呢?起初,特别autoload_runtime.php
文件是自动创建的作曲家插件组件。这个文件运行以下逻辑:
- 它实例化一个RuntimeInterface;
- 可调用的(返回的
公共/ index . php
)传递给运行时,其工作是解决参数(在这个例子中:数组$上下文
); - 然后,这个调用称为应用程序(
App \内核
); - 最后,用于运行应用程序的运行时(即调用
$内核- >处理(要求::createFromGlobals()) - >发送()
)。
谨慎
如果你使用的作曲家——no-plugins
选项时,autoload_runtime.php
文件不会被创建。
如果你使用的作曲家——没有剧本
选择,确保你的版本是作曲家> = 2.1.3
;否则,autoload_runtime.php
文件不会被创建。
一个控制台应用程序,引导代码看起来像:
1 2 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”]);/ /返回一个“应用程序”使得运行时一个控制台运行/ /应用程序而不是HTTP的内核返回新应用程序(美元内核);};
选择运行时
默认运行时ob娱乐下载SymfonyRuntime。优秀的作品在大多数应用程序使用一个网络服务器使用PHP-FPM像Nginx或Apache。
组件还提供了一个GenericRuntime使用PHP的$ _SERVER
,$ _POST
,$ _GET
,带有_file美元
和_SESSION美元
已经。你也可以使用一个自定义运行时(如集成Swoole或AWSλ)。
使用APP_RUNTIME
环境变量或通过指定extra.runtime.class
在composer.json
改变运行时类:
1 2 3 4 5 6 7 8 9 10
{“需要”:{“…”:“…”},“额外的”:{“运行时”:{“类”:“ob娱乐下载Symfony \ \组件\ \ Runtime \ \ GenericRuntime”}}}
使用运行时
一个运行时负责传递参数到返回的关闭和运行应用程序关闭。的ob娱乐下载SymfonyRuntime和GenericRuntime支持许多参数和不同的应用程序,您可以使用在你的前端控制器。
可分解的参数
关闭从前端控制器可能会返回零个或多个参数:
1 2 3 4 5 6 7 8 9 10
/ /公共/ index . php使用ob娱乐下载\包\FrameworkBundle\控制台\应用程序;使用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的内核。ob娱乐下载然而,许多不同的应用程序支持:
1 2 3 4 5 6 7 8
/ /公共/ index . php使用应用程序\内核;require_once目录名(__DIR__)。“/供应商/ autoload_runtime.php”;返回静态函数():内核{返回新内核(“刺激”,假);};
的ob娱乐下载SymfonyRuntime
这些应用程序可以处理:
- HttpKernelInterface
- 应用程序将运行HttpKernelRunner就像一个“标准”Symfony应用程ob娱乐下载序。
- 响应
-
响应将被打印出来ResponseRunner:
1 2 3 4 5 6 7 8
/ /公共/ index . php使用ob娱乐下载\组件\HttpFoundation\响应;require_once目录名(__DIR__)。“/供应商/ autoload_runtime.php”;返回静态函数():响应{返回新响应(“Hello world”);};
- 命令
-
写一个命令的应用程序。这将使用ConsoleApplicationRunner:
1 2 3 4 5 6 7 8 9 10 11 12 13
使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;require_once目录名(__DIR__)。“/供应商/ autoload_runtime.php”;返回静态函数(命令美元命令):命令{美元命令- >setCode (静态函数(InputInterface美元输入,OutputInterface美元输出):无效{美元输出- >写(“Hello World”);});返回美元命令;};
- 应用程序
-
有用与控制台应用程序与多个命令。这将使用ConsoleApplicationRunner:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用ob娱乐下载\组件\控制台\应用程序;使用ob娱乐下载\组件\控制台\命令\命令;使用ob娱乐下载\组件\控制台\输入\InputInterface;使用ob娱乐下载\组件\控制台\输出\OutputInterface;require_once目录名(__DIR__)。“/供应商/ autoload_runtime.php”;返回静态函数(数组美元上下文):应用程序{美元命令=新命令(“你好”);美元命令- >setCode (静态函数(InputInterface美元输入,OutputInterface美元输出):无效{美元输出- >写(“Hello World”);});美元应用程序=新应用程序();美元应用程序- >add (美元命令);美元应用程序- >setDefaultCommand (“你好”,真正的);返回美元应用程序;};
的GenericRuntime
和ob娱乐下载SymfonyRuntime
也支持这些通用的应用程序:
- RunnerInterface
-
的
RunnerInterface
是一种通用运行时使用一个自定义的应用程序:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /公共/ index . php使用ob娱乐下载\组件\运行时\RunnerInterface;require_once目录名(__DIR__)。“/供应商/ autoload_runtime.php”;返回静态函数():RunnerInterface{返回新类实现了RunnerInterface{公共函数运行():int{回声“Hello World”;返回0;}};};
-
可调用的
-
你也可以是一个“应用程序”
可调用的
。第一个调用将返回“应用程序”,第二个调用是“应用程序”本身:1 2 3 4 5 6 7 8 9 10 11 12
/ /公共/ index . phprequire_once目录名(__DIR__)。“/供应商/ autoload_runtime.php”;返回静态函数():可调用的{美元应用程序=静态函数():int{回声“Hello World”;返回0;};返回美元应用程序;};
-
无效
-
如果调用不返回任何值,
ob娱乐下载SymfonyRuntime
假设一切都很好:1 2 3 4 5
require_once目录名(__DIR__)。“/供应商/ autoload_runtime.php”;返回函数():无效{回声“Hello world”;};
利用期权
运行时的一些行为可以通过运行时修改选项。他们可以设置使用APP_RUNTIME_OPTIONS
环境变量:
1 2 3 4 5 6 7
美元_SERVER(“APP_RUNTIME_OPTIONS”]= [“project_dir”= >“/ var /任务”,);require_once目录名(__DIR__)。“/供应商/ autoload_runtime.php”;/ /……
您还可以配置extra.runtime
在composer.json
:
1 2 3 4 5 6 7 8 9 10
{“需要”:{“…”:“…”},“额外的”:{“运行时”:{“project_dir”:“/ var /任务”}}}
然后,更新你的作曲家文件(运行作曲家dump-autoload
,例如),所以供应商/ autoload_runtime.php
文件得到再生的新选项。
以下选项支持的ob娱乐下载SymfonyRuntime
:
-
env
(默认值:APP_ENV
环境变量,或者“开发”
) - 定义应用程序运行的环境的名称。
-
disable_dotenv
(默认值:假
) -
禁用寻找
.env
文件。 -
dotenv_path
(默认值:.env
) - 定义dot-env文件的路径。
-
dotenv_overload
(默认值:假
) -
告诉Dotenv是否覆盖
.env
var和.env.local
(或其他.env。*
文件) -
use_putenv
-
告诉Dotenv env var使用
putenv ()
(不推荐)。 -
prod_envs
(默认值:["刺激"]
) - 定义生产env的名称。
-
test_envs
(默认值:(“测试”)
) - 定义测试env的名称。
除了这些,GenericRuntime
和ob娱乐下载SymfonyRuntime
也支持这些选项:
-
调试
(默认值:env var的价值定义debug_var_name
选项 -
(通常,
APP_DEBUG
),或真正的
如果env变量没有定义)切换调试模式Symob娱乐下载fony应用程序(例如显示错误) -
运行时
-
地图”应用程序类型”
GenericRuntime
知道如何处理的实现。 -
error_handler
(默认值:BasicErrorHandler或ob娱乐下载SymfonyErrorHandler为ob娱乐下载SymfonyRuntime
) - 定义了类用于处理PHP错误。
-
env_var_name
(默认值:“APP_ENV”
) - 定义了env var的名称,商店的名字配置环境在运行应用程序时使用。
-
debug_var_name
(默认值:“APP_DEBUG”
) - 定义的名字env var,它存储的值调试模式国旗在运行应用程序时使用。
创建自己的运行时
这是一个高级主题,描述了运行时组件的内部。
使用运行时组件将有利于维护人员因为引导逻辑可能版本作为一个正常的一部分包。如果应用程序作者决定使用这个组件,运行时类的包维护者将有更多控制和修复bug,可以添加特性。
运行时组件的目的是完全通用的,可以运行任何应用程序之外的全局状态在6步骤:
- 主入口点返回可调用的(封装了应用程序的“应用程序”);
- 的应用程序可调用的传递给
RuntimeInterface: getResolver ()
,它返回一个ResolverInterface。这个解析器返回一个数组的应用程序可调用的(或装修这东西可调用)索引0及其所有参数指数1解决。 - 的应用程序可调用的调用的参数,它将返回一个对象,代表了应用程序。
- 这应用程序对象传递给
RuntimeInterface: getRunner ()
,它返回一个RunnerInterface:知道如何“运行”一个实例应用程序对象。 - 的
RunnerInterface:运行应用程序对象($)
叫,它返回退出状态码int
。 - PHP引擎终止状态代码。
当创建一个新的运行时,有两个问题需要考虑:首先,终端用户将使用哪些参数?其次,将用户的应用程序是什么样子的呢?
例如,假设您希望创建一个运行时ReactPHP:
终端用户将使用哪些参数?
对于一个通用的ReactPHP应用程序,不需要特殊的参数通常是。这意味着您可以使用GenericRuntime。
将用户的应用程序是什么样子的呢?
也没有典型的反应应用程序,所以您可能想要依靠PSR-15接口处理HTTP请求。
然而,ReactPHP应用程序将需要一些特殊的逻辑运行。这种逻辑添加新类实现RunnerInterface:
1 2 3 4 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
使用Psr\Http\消息\ResponseInterface;使用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美元请求)使用(美元应用程序):ResponseInterface{返回美元应用程序- >处理(美元请求);});/ /启动ReactPHP服务器美元套接字=新ReactSocketServer (美元这- >港口,美元循环);美元服务器- >听(美元套接字);美元循环- >run ();返回0;}}
通过扩展GenericRuntime
,您要确保应用程序总是使用这个ReactPHPRunner
:
1 2 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{私人int美元港口;公共函数__construct(数组美元选项){美元这- >端口=美元选项(“端口”)? ?8080年;父::__construct (美元选项);}公共函数getRunner(?对象美元应用程序):RunnerInterface{如果(美元应用程序运算符RequestHandlerInterface) {返回新ReactPHPRunner (美元应用程序,美元这- >港口);}/ /如果不是PSR-15应用程序中,使用GenericRuntime/ /运行应用程序(请参见上面的“可分解的应用程序”)返回父::getRunner (美元应用程序);}}
最终用户将可以创建前端控制器:
1 2 3 4 5
require_once目录名(__DIR__)。“/供应商/ autoload_runtime.php”;返回函数(数组美元上下文):SomeCustomPsr15Application{返回新SomeCustomPsr15Application ();};