启动应用程序并将其保持在内存中。FrankenPHP 将以几毫秒的速度处理传入的请求。
启动工作脚本
Docker
将 FRANKENPHP_CONFIG
环境变量的值设置为 worker /path/to/your/worker/script.php
:
docker run \
-e FRANKENPHP_CONFIG="worker /app/path/to/your/worker/script.php" \
-v $PWD:/app \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp
独立二进制文件
使用 php-server
命令的 --worker
选项,使用工作进程来提供当前目录的内容:
./frankenphp php-server --worker /path/to/your/worker/script.php
如果您的 PHP 应用程序嵌入在二进制文件中,您可以在应用程序的根目录添加自定义的 Caddyfile
。它将被自动使用。
Symfony 运行时
FrankenPHP 的工作模式由 Symfony 运行时组件 支持。要启动任何 Symfony 应用程序的工作进程,请安装 PHP 运行时的 FrankenPHP 包:
composer require runtime/frankenphp-symfony
通过定义 APP_RUNTIME
环境变量来使用 FrankenPHP Symfony 运行时启动您的应用程序服务器:
docker run \
-e FRANKENPHP_CONFIG="worker ./public/index.php" \
-e APP_RUNTIME=Runtime\\FrankenPhpSymfony\\Runtime \
-v $PWD:/app \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp
Laravel Octane
请参阅 专用文档。
# 自定义应用程序
以下示例展示了如何创建自己的工作脚本,而不依赖于第三方库:
<?php
// public/index.php
// 阻止工作脚本在客户端连接中断时终止
ignore_user_abort(true);
// 启动您的应用程序
require __DIR__.'/vendor/autoload.php';
$myApp = new \App\Kernel();
$myApp->boot();
// 循环外的处理程序以获得更好的性能(做更少的工作)
$handler = static function () use ($myApp) {
// 当接收到请求时调用,
// 超全局变量、php://input 等将被重置
echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
};
for($nbRequests = 0, $running = true; isset($_SERVER['MAX_REQUESTS']) && ($nbRequests < ((int)$_SERVER['MAX_REQUESTS'])) && $running; ++$nbRequests) {
$running = \frankenphp_handle_request($handler);
// 发送 HTTP 响应后做一些事情
$myApp->terminate();
// 调用垃圾收集器,以减少在页面生成中间被触发的机会
gc_collect_cycles();
}
// 清理
$myApp->shutdown();
然后,启动您的应用程序并使用 FRANKENPHP_CONFIG
环境变量配置您的工作进程:
docker run \
-e FRANKENPHP_CONFIG="worker ./public/index.php" \
-v $PWD:/app \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp
默认情况下,每个 CPU 启动 2 个工作进程。您还可以配置要启动的工作进程数量:
docker run \
-e FRANKENPHP_CONFIG="worker ./public/index.php 42" \
-v $PWD:/app \
-p 80:80 -p 443:443 -p 443:443/udp \
dunglas/frankenphp
在一定数量的请求后重新启动工作进程
由于 PHP 最初并非为长运行进程而设计,因此仍有许多库和遗留代码存在内存泄漏问题。使用这种类型的代码在工作模式中的一个解决方法是,在处理一定数量的请求后重新启动工作脚本:
之前的工作代码片段允许通过设置名为 MAX_REQUESTS
的环境变量来配置要处理的最大请求数量。