【天天播资讯】深入 Hyperf:HTTP 服务启动时发生了什么?

2023-05-19 15:32:47 来源: 博客园

当我们创建 Hyperf 项目之后,只需要在终端执行 php bin/hyperf.php start启动命令,等上几秒钟,就可以看到终端输出的 Worker 进程已启动,HTTP 服务监听在 9501 端口的日志信息。

[INFO] Worker#3 started.  [INFO] Worker#1 started.  [INFO] Worker#2 started.  [INFO] Worker#0 started.  [INFO] HTTP Server listening at 0.0.0.0:9501  

打开浏览器访问 http://127.0.0.1:9501,不出意外的话,页面会显示 Hello Hyperf,说明 HTTP 服务已经在工作了。那么这是怎么做到的呢?当我们执行启动命令后,Hyperf 是如何让 HTTP 服务启动的?


【资料图】

所以今天这篇文章我会从启动命令开始,给你介绍下 HTTP 服务是如何完成初始化并启动的。通过阅读这篇文章,你可以了解到以下内容:

Hyperf 启动时会做哪些初始化操作?HTTP 服务启动时会做哪些初始化操作?HTTP 服务初始化时有哪些关键配置项?

接下来,我们就从 Hyperf 的入口文件开始,了解启动 HTTP 服务的实现思路。

文章会持续修订,转载请注明来源地址:https://her-cat.com/posts/2023/05/15/what-happens-when-hyperf-http-server-starts/

bin/hyperf.php 文件:Hyperf 的入口

在启动命令中,除了 PHP 可执行文件以外,有两个是我们要关注的重点:

bin/hyperf.php:Hyperf 的入口文件start:启动命令的参数

先来看一下 bin/hyperf.php 文件,我将该文件的执行逻辑分成了四个阶段。

初始化项目配置信息

在这个阶段中,主要是通过调用一些 PHP 内置函数,完成 PHP 相关的配置初始化,比如运行内存大小限制、错误级别、时区等等。

我们需要注意下在这一阶段定义的两个常量: BASE_PATH 和 SWOOLE_HOOK_FLAGS。

BASE_PATH:保存的是 Hyperf 项目所在目录的完整路径,Hyperf 中很多操作都是基于该常量来定位目录和文件的路径。SWOOLE_HOOK_FLAGS:Swoole 采用 Hook 原生 PHP 函数的方式实现协程客户端,该常量保存的是 Hook 的函数的范围,比如套接字、文件、curl 等等。SWOOLE_HOOK_ALL 表示 Hook 所有函数。

我们经常会在 Swoole 相关的资料文档中看到「一键协程化」技术,实际上指的就是在启用协程时传入 SWOOLE_HOOK_ALL 配置项,通过 Hook 所有函数,让项目中会发生 IO 阻塞的代码变成可以协程调度的异步 IO,即一键协程化。

初始化类加载器

在 Hyperf 中,我们可以使用注解减少一些繁琐的配置,还可以基于注解实现很多强大的功能。比如注解注入、AOP 面向切面编程、路由定义、权限控制等等。这些功能能够正常运行,其实都离不开类加载器在初始化过程中的准备工作。

在初始化类加载器过程中,主要会进行以下操作:

收集注解使用信息并完成注解收集器的初始化。生成代理类,为实现 AOP 及 Inject 注解注入功能做准备工作。生成运行时缓存,提高框架启动速度。初始化依赖注入容器

在这个阶段, Hyperf 会先读取预先定义好的依赖关系的配置信息,包括 config/autoload/dependencies.php 配置文件中用户自定义的依赖关系,以及各组件中通过 ConfigProvider 机制定义的依赖关系。将这些初始的依赖关系保存到依赖注入容器中,完成对容器的初始化。

初始化命令行应用

我们回过头来看一下启动命令,你会发现,实际上 Hyperf 本身就是一个命令行应用,而启动命令中的 start 不过是命令行应用的参数,也就是要执行的命令的名字。

在 Hyperf 中有很多内置的命令,比如 start、migrate、gen 等等,当然我们也可以根据自己的需求自定义命令。初始化命令行应用的过程,就是将这些 Hyperf 内置的命令、自定义的命令,注册到命令行应用中的过程。

初始化并启动 HTTP 服务

到了这里,Hyperf 的初始化工作就已经结束了,命令行应用就会开始对启动命令中的参数进行解析,通过参数找到在命令行应用中注册的命令并执行。参数 start 对应的命令类是 StartServer,你可以在 hyperf/server组件中找到它。

在 StartServer 中,完成了对 HTTP 服务的初始化以及启动操作,包含检查运行环境、读取服务配置文件、初始化 HTTP 服务、启动 HTTP 服务四个步骤,下面我们来了解一下这些步骤中分别做了哪些事情。

检查运行环境

我们知道,Hyperf 目前使用 Swoole 作为底层框架,所以在启动的时候,会先检查是否安装了 Swoole 的扩展,然后再检查是否禁用了 Swoole 的函数短名(short function name),如果没有禁用,就会输出提示信息并终止程序的运行。

读取服务配置

在 Hyperf 中,我们使用 config/autoload/server.php文件来配置服务信息,详细的字段说明可以查看 Hyperf 官方文档。

其中有两个字段需要注意,分别是 server.typeserver.servers.type,很多人不太清楚这两个配置项的作用和区别,下面我们来了解一下。

Swoole 提供了异步和协程两种风格的服务端,下面是两者的不同之处。

协程风格的服务端可以在运行时动态创建、销毁,而异步风格的服务端在启动后就不能再对它进行操作了。协程风格的服务端对连接的处理是在单独的协程中完成,与客户端的交互是顺序性的,而异步风格的服务端无法保证顺序性。

Hyperf 作为上层框架,当然要支持这两种风格的服务端,同时还要考虑到扩展性,方便后续接入其它风格的服务端。

所以 Hyperf 在设计之初做了一层抽象,定义了一个 ServerInterface接口,在接口中定义了三个常量,作为服务类型的枚举值。用于在配置文件中通过 server.servers.type配置项设置服务的类型。同时,还定义了构造函数、初始化、启动三个方法。

interface ServerInterface{    // HTTP 服务      public const SERVER_HTTP = 1;        // Websocket 服务      public const SERVER_WEBSOCKET = 2;       // TCP 服务      public const SERVER_BASE = 3;       // 构造函数      public function __construct(ContainerInterface $container, LoggerInterface $logger, EventDispatcherInterface $dispatcher);       // 初始化      public function init(ServerConfig $config): ServerInterface;       // 启动      public function start(): void;}  

Hyperf 不仅实现了基于 Swoole 的两种风格的服务端,还实现了基于 Swow 的服务端。

Hyperf\Server\Server:异步风格的服务端,由 Swoole 提供底层支持。Hyperf\Server\CoroutineServer:协程风格的服务端,由 Swoole 提供底层支持。Hyperf\Server\SwowServer:协程风格的服务端,由 Swow 提供底层支持。

我们可以通过 server.type配置项,来决定使用哪种风格的服务端用于运行各种类型的服务。当然,你也可以通过实现 ServerInterface接口,自定义其它类型的服务端。

初始化 HTTP 服务

通过上面的内容你可以知道,在运行 Hyperf 的时候,只能使用一种服务端,但是可以运行多个不同类型的服务,比如 HTTP 服务、Websocket 服务等等。为了便于说明,我会使用异步风格服务端给你介绍初始化 HTTP 服务的过程。

初始化 HTTP 服务的操作,是在 ServerFactory::configure 方法中完成的,主要可以分为两个步骤。

第一步,将配置信息解析成 ServerConfig 对象。

在这一步骤中,主要是将配置文件中数组形式的配置信息,解析成 ServerConfig 对象。

class ServerConfig implements Arrayable{    public function __construct(protected array $config = [])    {    // 将各种类型的服务解析成 Port 对象        $servers = [];        foreach ($config["servers"] as $item) {            $servers[] = Port::build($item);        }// 将其它类型的配置都保存到对象中        $this->setType($config["type"] ?? Server::class)            ->setMode($config["mode"] ?? 0)            ->setServers($servers)            ->setProcesses($config["processes"] ?? [])            ->setSettings($config["settings"] ?? [])            ->setCallbacks($config["callbacks"] ?? []);    }}

当没有设置服务端的类型时,默认使用 Hyperf\Server\Server,即异步类型的服务端。

第二步,调用 Hyperf\Server\Server::init 方法完成对 HTTP 服务的初始化。

在这一步骤中,会调用 ServerFactory::getServer 方法,根据 ServerConfig 对象中的 type 属性实例化出对应的服务端对象,即 Hyperf\Server\Server 对象。在 Hyperf\Server\Server 对象中,定义了一个 server 属性,用于保存 Swoole 异步风格服务器对象。在 Swoole 异步风格的服务端中,有以下三种类型的服务器:

Swoole\Server:TCP 服务器,是所有异步风格服务器的基类。Swoole\Http\Server:HTTP 服务器。Swoole\WebSocket\Server:WebSocket 服务器。

在 init 方法中,会根据 server.servers.type配置项的值(即 ServerInterface接口中的常量),实例化出相应的服务器对象,并保存到 server 属性中。

这里会有一个问题,在 Hyperf\Server\Server 对象中只有一个 server 属性,但是,在 server.servers配置项中,我们可以配置多个不同类型的服务,那么是如何支持运行多个服务的呢?

这里就跟 Swoole 的服务器实现有关,Swoole 的异步风格服务器可以通过调用 addListener 方法监听多个端口,每个端口都可以设置不同的协议处理方式。这样就实现了一个服务器对象,同时运行多个不同类型的服务。

下面我们来看一下 init 方法的主要逻辑。

首先,在 init 方法中会先调用 ServerFactory::sortServers 方法,对需要启动的服务按照类型 Websocket、HTTP、TCP 的顺序进行排序。

然后,依次遍历这些服务,完成对每个服务的初始化。循环中包括两个分支:

第一个分支对应了 server 属性未初始化的情况。此时,会调用 makeServer 方法实例化出相应的服务器对象,然后为服务器对象注册事件回调函数,最后初始化服务器对象的配置信息。第二个分支对应了 server 属性已初始化的情况。此时,会调用服务器对象的 addListener 方法,增加一个端口并返回子服务器对象,然后为子服务器对象注册事件回调函数,最后初始化子服务器对象的配置信息。

在 makeServer 方法中,会根据服务类型实例化出相应的服务器对象,下面代码展示了这部分的逻辑,你可以看下。

switch ($type) {      case ServerInterface::SERVER_HTTP:          return new Swoole\Http\Server($host, $port, $mode, $sockType);      case ServerInterface::SERVER_WEBSOCKET:          return new Swoole\WebSocket\Server($host, $port, $mode, $sockType);      case ServerInterface::SERVER_BASE:          return new Swoole\Server($host, $port, $mode, $sockType);  }

Swoole 提供了很多事件,比如 workerStart 工作进程启动后的事件、request 收到请求后的事件,这些事件在 Hyperf\Server\Event 中都有相应的常量。

在 Hyperf 中,有三种事件回调函数的配置,分别是全局事件、服务事件、默认事件。

全局事件:使用 server.callbacks配置项设置全局的事件的回调函数。服务事件:使用 server.servers.callbacks配置项为每一个服务单独设置事件的回调函数。默认事件:在 Hyperf\Server\Server 对象的 defaultCallbacks 方法中配置了一些默认的事件的回调函数。

这些配置优先级是:服务事件 > 全局事件 > 默认事件。下面的代码展示了注册事件的回调函数的核心逻辑。

// 按照优先级获取配置的所有事件及其回调函数$callbacks = array_replace($this->defaultCallbacks(), $config->getCallbacks(), $callbacks);foreach ($callbacks as $event => $callback) {// 非 Swoole 事件,直接跳过    if (! Event::isSwooleEvent($event)) {        continue;    }    ...    // 为服务器对象注册该事件的回调函数    $server->on($event, $callback);}
启动 HTTP 服务

在启动 HTTP 服务之前,会执行以下代码设置一键协程化 Hook 的函数范围,swoole_hook_flags 函数的返回值就是 SWOOLE_HOOK_FLAGS 常量的值,即 SWOOLE_HOOK_ALL。

Coroutine::set(["hook_flags" => swoole_hook_flags()]);

接着会调用 ServerFactory::start 方法启动服务,在该方法中,直接调用 Hyperf\Server\Server 的 start 方法启动 Swoole 服务器。

当 Swoole 服务器启动后,会执行注册在服务器对象的 Event::ON_WORKER_START 事件的回调函数 WorkerStartCallback::onWorkerStart。

在 onWorkerStart 方法中,输出 Worker#{$workerId} started.日志信息,并通过事件分发器分发 AfterWorkerStart事件,在该事件的监听器 AfterWorkerStartListener中,输出 HTTP Server listening at 0.0.0.0:9501日志信息。

到这里,HTTP 服务就已经启动了。

总结

在这篇文章中,我们通过 bin/hyperf.php 文件,了解了 Hyperf 在初始化框架时会执行哪些操作。接着,又通过 StartServer 了解了 HTTP 服务在启动过程中的四个步骤。其中,HTTP 服务的初始化是整个启动过程中的关键步骤,你可以配合源码进一步了解 Hyperf 的设计和实现思路。

尽管本文的主题是 HTTP 服务,但实际上,无论是 WebSocket服务、TCP服务还是其他类型的服务,这些服务的启动过程与 HTTP 服务的启动过程大同小异。

因此,掌握 HTTP 服务的启动过程,不仅有助于你了解 HTTP 服务的运行细节,还有助于你了解 Hyperf 以及其它类型服务的运行细节。当你遇到问题时,可以按照启动过程中的步骤逐步检查,从而帮助你更快地解决问题。

标签:

【天天播资讯】深入 Hyperf:HTTP 服务启动时发生了什么?

当我们创建Hyperf项目之后,只需要在终端执行`phpbin hyperf phpstart`启动命令,等上几秒钟,就可以看到终

05-19 15:32:47

今日观点!高通骁龙 870 手机售价腰斩,1648 元的中兴 Axon 40 Pro还有1亿像素!

中兴Axon40Pro是中兴在去年5月发布的旗舰手机,8+256版发售价2998元。今日京东自营价格已腰斩到1698元,如

05-19 15:04:07

2023杭州入学早知道官网登录入口 天天观点

入学早知道官网登录入口:点击登录入学早知道注意:手机端登陆会更好。也可通过浙里办app进入入学早知道如

05-19 14:28:41

开创国际(600097):股价成功突破年线压力位-后市看多(涨)(05-19)_环球看点

资金流向数据,主力资金净流出51 65万元,占总成交额-4%,其中超大单净流入0 00元,

05-19 13:59:32

SITECNA 可变流量真空泵 VP系列316L

AISI316L可变流量真空泵–VP系列•高性能的真空流速和真空水平。流量和真空度性能•无堵塞、直通式设计。直

05-19 12:57:04

重庆确定首批36家市级粮食应急保障企业 不履行应急保障义务将取消资格

粮食应急保障就是守好粮食安全的底线!上游新闻今(19)日从重庆市粮食局获悉,经过本月上旬候选名单公示,

05-19 12:08:25

定了!新款索尼PS5游戏主机要来了|每日播报

据最近财报会议消息,R星母公司TakeTwo的CEOStraussZelnick表示,我们有可能会看到改款的PlayStation和Xbox

05-19 11:39:28

2023福州部分公办普高特色创新班自主招生考试及录取说明

为进一步推进考试招生制度改革,2023年福州一中等21所公办普高学校(或校区)实行特色创新班自主招生,招收

05-19 11:25:53

新资讯:旋律时光_关于旋律时光介绍

旋律时光,关于旋律时光介绍这个很多人还不知道,现在让我们一起来看看吧!1、《旋律时光》是迪士尼推出的第

05-19 10:53:04

平安证券:光伏产业链整体呈现竞争加剧的态势

平安证券:光伏产业链整体呈现竞争加剧的态势

05-19 10:24:45

苏宁环球:5月18日融资买入170.7万元,融资融券余额4.2亿元

5月18日,苏宁环球(000718)融资买入170 7万元,融资偿还142 45万元,融资净买入28 25万元,融资余额4 19亿元。

05-19 10:04:09

中国石油大学胜利学院有专科吗批次|全球观热点

1、中国石油大学胜利学院有专科吗山东省东营市主要有:中国石油大学胜利学院、东营职业学院、东营科技职业

05-19 09:23:32

“黔系列”民族文化产业品牌精品馆开馆_环球速看料

5月18日国际博物馆日,“黔系列”民族文化产业品牌精品馆开馆仪式暨2023“黔系列”品牌产品展销会、“黔...

05-19 08:50:31

天天短讯!什么是塑料姐妹(什么是塑料姐妹情)

1、“塑料姐妹”形容的就是女生之间勾心斗角,虚与委蛇的面子社交,特别虚假不走心。塑料原本是一种抗腐...

05-19 08:43:37

猪肉价格持续低位运行 养殖板块年内表现不佳_世界报资讯

证券时报记者朱听武5月18日,养殖板块持续走弱,牧原股份(002714)跌超6%,新希望(000876)、温氏股份(300498

05-19 08:05:43

华泰柏瑞中证光伏产业ETF净值下跌1.70% 请保持关注|焦点

金融界基金05月19日讯华泰柏瑞中证光伏产业ETF基金05月18日下跌1 75%,现价1 236元,成交72259 69万元。当

05-19 06:48:16

弱视0.1是不是接近失明_成人弱视可以治疗吗|环球即时看

1、成人弱视没有治疗方法。2、这种病一旦超过12岁,就没有治愈的可能。3、因为12岁时,视神经已经完全发育

05-19 06:00:29

弘阳地产(01996.HK):5月18日南向资金增持85.3万股-天天即时看

5月18日北向资金增持85 3万股弘阳地产(01996 HK)。近5个交易日中,获南向资金减持的有2天,累计净减持43

05-19 04:18:10

【环球播资讯】苏迪曼杯:国羽一场未输强势晋级 八强战将对印尼队

新华社苏州5月18日电(记者姬烨、王恒志、丁文娴)2023年苏迪曼杯世界羽毛球混合团体锦标赛18日结束小组赛

05-19 01:04:11

天天精选!医疗保险的钱不花是不是就没了?医疗保险的钱怎么样?

医疗保险的钱不花是不是就没了?医疗保险的钱怎么样?随社保网小编来看看。医疗保险是一项非常重要的社会保

05-18 23:02:44

粒径小比表面积为啥越大_比表面积与粒径的关系

1、比表面积有两种:一是重量比表面积,就是单位重量的比表面积,例如Sw=3000平方厘米 克。2、二是体积比表

05-18 22:13:37

同星科技(301252.SZ)披露发行结果:遭弃购21.08万股、由主承销商包销

格隆汇5月18日丨同星科技(301252 SZ)公布首次公开发行股票并在创业板上市发行结果公告,网上投资者放弃认购

05-18 21:31:02

浙江经济观察:金融触角如何伸至个体工商户?

中新网台州5月18日电(傅飞扬林婷)每天早晨,位于浙江省台州市椒江区界牌菜场的米丽食品店都会迎来不少熟面

05-18 20:41:09

天天讯息:农业农村部启动2023年农业品牌精品培育工作

央视网消息:据农业农村部网站消息,5月17日,农业农村部办公厅印发《关于开展2023年农业品牌精品培育工作

05-18 20:04:20

电脑贴纸对电脑有害吗(电脑贴纸对电脑有没有影响)

品牌型号:联想拯救者Y9000P系统:Windows11电脑贴纸对电脑有害,但危害比较小。电脑贴纸能影响到笔记本电

05-18 18:58:09

大连电瓷:江西大瓷一期工程生产线已于近日正式投产|最新快讯

大连电瓷(SZ002606,收盘价:9 47元)5月18日晚间发布公告称,江西大瓷项目于2021年4月开始计划施工建设,

05-18 18:32:34

全球聚焦:【龙虎榜】中电港5月18日成交明细

金融界APP2023年5月18日讯,中电港(001287)报收27 79元,涨幅3 54%,成交量4839 66万股,成交额130276 08万元,换手率26

05-18 18:02:01

兰州新区民办初中小升初报名所需材料

兰州新区民办初中报名提交材料1、户籍材料:学生本人及监护人户口簿原件、复印件(首页、监护人页、学生页)

05-18 17:11:50

每日热议!献花曲谱_献花曲mp3下载

1、军乐-献花曲mp3格式已经上传附件,请及时下载记得选一下满意回答,谢谢还有一个加长版(7分钟)。2、如

05-18 17:05:26

关于社保那些事·你问我答58 | 居民养老保险如何计算年限?是否可以补缴?-天天时讯

原标题:关于社保那些事·你问我答58|居民养老保险如何计算年限?是否可以补缴?新海南客户端、南海网、...

05-18 16:08:57

重庆银行将于6月21日召开股东大会

重庆银行(SH601963,收盘价:8 5元)5月18日发布公告称,2023年6月21日9点30分,公司将在重庆银行总行大楼

05-18 15:46:41

2023文山州519中国旅游日文旅促消费系列活动汇总

2023文山州519中国旅游日文旅促消费系列活动“云上边城,白马入关”,云南文山马关是一座坐落在中越边境...

05-18 15:06:36

港股异动 | 联易融科技-W(09959)午后涨超5% 机构指供应链融资需求逐渐恢复 市场对公司未来业绩增速展望良好

联易融科技-W(09959)午后涨超5%,截至发稿,涨4 02%,报2 59港元,成交额4322 01万港元。

05-18 14:39:18

异佛尔酮二异氰酸酯 IPDI商品报价动态(2023-05-18)

交易商品牌 产地交货地最新报价异佛尔酮二异氰酸酯 ≥99 5%济南洪旺化工有限公司国产山东省 济南市60000元 吨

05-18 14:08:56

增加排水能力!金安桥雨水泵站和调蓄池汛期将投入使用 快消息

北京日报客户端|记者李博程功由于地势低洼,石景山区金安桥附近一直是积水内涝的风险点位。记者从首发集团

05-18 13:01:29

去银行办银行卡需要哪些证件?信用卡多久不还会被列为失信? 当前热门

去银行办银行卡需要哪些证件?信用卡多久不还会被列为失信?下面是小编整理的一些相关信息,一起来看看吧!

05-18 12:27:14

财政部:1-4月土地和房地产相关税收中房产税1529亿元 同比增长20.5%

观点网讯:5月18日,财政部公布2023年4月财政收支情况。数据显示,1-4月累计,土地和房地产相关税收中,契

05-18 12:08:38

J.D. Power研究:二手车金融渗透率首次追平新车金融渗透率_环球短讯

财经网汽车讯5月18日,消费者洞察与市场研究机构J D Power|君迪发布2023中国经销商汽车金融满意度研究(DFS

05-18 11:37:28

一束鲜花9块9!鲜花团购兴起,传统花店纷纷转型

记者 吴昊娇艳欲滴的多头玫瑰、清新淡雅的洋甘菊、优雅别致的风铃,只需9块9就能买到。近期,越来越多

05-18 11:17:14

俄语手写体示范_俄语字母手写体写法-全球新动态

1、这是标准的手写体,而且写的很漂亮,俄语字母的手写体和英文书写时差不多,孰能生巧,而且俄语的手写体

05-18 10:29:14

恶灵骑士短篇故事46

据说,多年以前,意大利蒙扎市议会公布了一条法案,禁止宠物主人将金鱼养在弯曲的鱼缸里。提案负责人为此解

05-18 09:55:52

焦点信息:DRX冠军至臻剑魔 皮肤预览:玫瑰金加持,更加炫酷

今日SkinSpotlights官方更新,分享至臻DRX亚托克斯皮肤预览视频。玫瑰金加持,更加炫酷!

05-18 09:33:32

全球观点:蓝莓种植地区在哪里_蓝莓种植

你们好,最近小品发现有诸多的小伙伴们对于蓝莓种植地区在哪里,蓝莓种植这个问题都颇为感兴趣的,今天小活

05-18 08:58:44

当前热文:小公园里的休闲

小公园里的休闲

05-18 08:48:59

碣组词_碣有多少组词呢

1、碑文的通称[bIJie]。荆楚碑刻都是解索写的。——《南史颜协传》2、[M49Ji]墓的建造和修复,M49Ji

05-18 07:47:00

腰椎骨质增生的最佳治疗方法_腰椎骨质增生的症状

1、腰椎骨质增生是由于骨骼随年龄的增长而发生退行性改变,常表现为局部骨质增生。2、大多数骨质增生不会引

05-18 06:53:15

【天天聚看点】甘肃考区推进中医类别实践技能考试信息化全覆盖

日前召开的全国医师资格考试考务管理工作电视电话会议上,国家中医药管理局对甘肃省中医类别医师资格考试信

05-18 05:58:36

多座机场提示近期将安检升级,建议旅客提前 2-3 小时到机场-每日看点

每经AI快讯,多座机场宣布安检升级。首都机场官方微博5月16日发布提示称,近期,首都机场将采取更为严格的

05-18 04:49:46

赵丽颖整容前后照片_赵丽颖整容前后-天天关注

1、感觉赵丽颖应该没有大动,脸瘦了,至于是自然瘦下来还是打的瘦脸针就不知道了,因为正常人一定年龄过后

05-18 01:52:27

西电网院在线考试答案_西电网院

1、主要功能模块:直接授课系统、课件制作中心、网络教育信息中心、学生点播学习系统、BBS答疑系统、校外学

05-17 23:12:55

今日观点!高通骁龙 870 手机售价腰斩,1648 元的中兴 Axon 40 Pro还有1亿像素!
2023杭州入学早知道官网登录入口 天天观点
开创国际(600097):股价成功突破年线压力位-后市看多(涨)(05-19)_环球看点
SITECNA 可变流量真空泵 VP系列316L
重庆确定首批36家市级粮食应急保障企业 不履行应急保障义务将取消资格
定了!新款索尼PS5游戏主机要来了|每日播报
2023福州部分公办普高特色创新班自主招生考试及录取说明
新资讯:旋律时光_关于旋律时光介绍
平安证券:光伏产业链整体呈现竞争加剧的态势
苏宁环球:5月18日融资买入170.7万元,融资融券余额4.2亿元
中国石油大学胜利学院有专科吗批次|全球观热点
“黔系列”民族文化产业品牌精品馆开馆_环球速看料
天天短讯!什么是塑料姐妹(什么是塑料姐妹情)
猪肉价格持续低位运行 养殖板块年内表现不佳_世界报资讯
华泰柏瑞中证光伏产业ETF净值下跌1.70% 请保持关注|焦点
弱视0.1是不是接近失明_成人弱视可以治疗吗|环球即时看
弘阳地产(01996.HK):5月18日南向资金增持85.3万股-天天即时看
【环球播资讯】苏迪曼杯:国羽一场未输强势晋级 八强战将对印尼队
天天精选!医疗保险的钱不花是不是就没了?医疗保险的钱怎么样?
粒径小比表面积为啥越大_比表面积与粒径的关系
同星科技(301252.SZ)披露发行结果:遭弃购21.08万股、由主承销商包销
浙江经济观察:金融触角如何伸至个体工商户?
天天讯息:农业农村部启动2023年农业品牌精品培育工作
电脑贴纸对电脑有害吗(电脑贴纸对电脑有没有影响)
大连电瓷:江西大瓷一期工程生产线已于近日正式投产|最新快讯
全球聚焦:【龙虎榜】中电港5月18日成交明细
兰州新区民办初中小升初报名所需材料
每日热议!献花曲谱_献花曲mp3下载
关于社保那些事·你问我答58 | 居民养老保险如何计算年限?是否可以补缴?-天天时讯
重庆银行将于6月21日召开股东大会
2023文山州519中国旅游日文旅促消费系列活动汇总
港股异动 | 联易融科技-W(09959)午后涨超5% 机构指供应链融资需求逐渐恢复 市场对公司未来业绩增速展望良好
异佛尔酮二异氰酸酯 IPDI商品报价动态(2023-05-18)
增加排水能力!金安桥雨水泵站和调蓄池汛期将投入使用 快消息
去银行办银行卡需要哪些证件?信用卡多久不还会被列为失信? 当前热门
财政部:1-4月土地和房地产相关税收中房产税1529亿元 同比增长20.5%
J.D. Power研究:二手车金融渗透率首次追平新车金融渗透率_环球短讯
一束鲜花9块9!鲜花团购兴起,传统花店纷纷转型
俄语手写体示范_俄语字母手写体写法-全球新动态
恶灵骑士短篇故事46
焦点信息:DRX冠军至臻剑魔 皮肤预览:玫瑰金加持,更加炫酷
全球观点:蓝莓种植地区在哪里_蓝莓种植
当前热文:小公园里的休闲
碣组词_碣有多少组词呢
腰椎骨质增生的最佳治疗方法_腰椎骨质增生的症状
【天天聚看点】甘肃考区推进中医类别实践技能考试信息化全覆盖
多座机场提示近期将安检升级,建议旅客提前 2-3 小时到机场-每日看点
赵丽颖整容前后照片_赵丽颖整容前后-天天关注
西电网院在线考试答案_西电网院
【视频全集】徐远+张维迎+黄益平+郭凯:数字货币的经济逻辑
X 广告
资讯
X 广告

Copyright ©  2015-2022 海峡畜牧网版权所有  备案号:皖ICP备2022009963号-10   联系邮箱:396 029 142 @qq.com