4: 运行时助手和调度

两个消费者在没有你自己调用 /dispatch 的情况下运行守护进程:异步运行时助手和调度器。

4.1: 运行时助手

Phlo 的助手在应用选择加入时,都会使用池来运行目标,否则会回退到一次性子进程:

助手 功能
phlo_sync('Class::method', ...$args) 运行一个目标并等待其返回值
phlo_async('Class::method', ...$args) 排队一个目标,火并忘;一旦被接受就返回
await($job, $job, ...) 并发运行多个目标并收集它们的结果
phlo_stream('Class::method', ...$args) 逐行输出目标的结果

选择加入是在应用入口点中的一个常量:

phlo_app(
	id: 'Api',
	host: 'api.example.com',
	daemon: 3001,
);

设置了 daemon 时,助手通过 app 路径调度到池中;没有它时,它们会像之前一样生成一个一次性进程。无论哪种方式,应用代码都是相同的,因此采用守护进程只会改变吞吐量。

当一个请求分发时,增益最大。await() 超过一百个作业时,在一次性路径上会有一百个应用启动,但在使用守护进程时,会有一百个调度到常驻池中,受工作者数量的限制,而不是无限制的子进程爆发:

$results = await(
	['translate::run', 'nl', $text],
	['translate::run', 'de', $text],
	['translate::run', 'fr', $text],
)

4.2: 不使用 cron 的调度

守护进程每分钟在其主机映射中的每个应用上运行 tasks::run,这替代了 tasks 资源后面的每个应用的 cron 条目。无需配置:每个任务的调度信息存储在 %app->tasks 中(每个任务上的 every:),未加载 tasks 资源的应用在其第一次执行后会自动跳过:

{
	'dashboard.example.nl': { app: '/var/www/dashboard/www/app.php', build: true },
	'api.example.nl': { app: '/var/www/api/www/app.php', build: false },
}

下游的所有内容保持不变:相同的 %app->tasks 匹配,相同的到期检查,相同的磁盘状态。对于没有守护进程的主机,Cron 仍然是后备选项;你只能选择一个触发器,而不是两个。

我们使用必要的cookie来使该网站正常工作。在您的许可下,我们还使用分析工具来改善网站。