启动应用程序并将其保持在内存中。FrankenPHP 将以几毫秒的速度处理传入的请求。

启动工作脚本

Docker

FRANKENPHP_CONFIG 环境变量的值设置为 worker /path/to/your/worker/script.php

  1. docker run \
  2. -e FRANKENPHP_CONFIG="worker /app/path/to/your/worker/script.php" \
  3. -v $PWD:/app \
  4. -p 80:80 -p 443:443 -p 443:443/udp \
  5. dunglas/frankenphp

独立二进制文件

使用 php-server 命令的 --worker 选项,使用工作进程来提供当前目录的内容:

  1. ./frankenphp php-server --worker /path/to/your/worker/script.php

如果您的 PHP 应用程序嵌入在二进制文件中,您可以在应用程序的根目录添加自定义的 Caddyfile。它将被自动使用。

Symfony 运行时

FrankenPHP 的工作模式由 Symfony 运行时组件 支持。要启动任何 Symfony 应用程序的工作进程,请安装 PHP 运行时的 FrankenPHP 包:

  1. composer require runtime/frankenphp-symfony

通过定义 APP_RUNTIME 环境变量来使用 FrankenPHP Symfony 运行时启动您的应用程序服务器:

  1. docker run \
  2. -e FRANKENPHP_CONFIG="worker ./public/index.php" \
  3. -e APP_RUNTIME=Runtime\\FrankenPhpSymfony\\Runtime \
  4. -v $PWD:/app \
  5. -p 80:80 -p 443:443 -p 443:443/udp \
  6. dunglas/frankenphp

Laravel Octane

请参阅 专用文档

# 自定义应用程序

以下示例展示了如何创建自己的工作脚本,而不依赖于第三方库:

  1. <?php
  2. // public/index.php
  3. // 阻止工作脚本在客户端连接中断时终止
  4. ignore_user_abort(true);
  5. // 启动您的应用程序
  6. require __DIR__.'/vendor/autoload.php';
  7. $myApp = new \App\Kernel();
  8. $myApp->boot();
  9. // 循环外的处理程序以获得更好的性能(做更少的工作)
  10. $handler = static function () use ($myApp) {
  11. // 当接收到请求时调用,
  12. // 超全局变量、php://input 等将被重置
  13. echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
  14. };
  15. for($nbRequests = 0, $running = true; isset($_SERVER['MAX_REQUESTS']) && ($nbRequests < ((int)$_SERVER['MAX_REQUESTS'])) && $running; ++$nbRequests) {
  16. $running = \frankenphp_handle_request($handler);
  17. // 发送 HTTP 响应后做一些事情
  18. $myApp->terminate();
  19. // 调用垃圾收集器,以减少在页面生成中间被触发的机会
  20. gc_collect_cycles();
  21. }
  22. // 清理
  23. $myApp->shutdown();

然后,启动您的应用程序并使用 FRANKENPHP_CONFIG 环境变量配置您的工作进程:

  1. docker run \
  2. -e FRANKENPHP_CONFIG="worker ./public/index.php" \
  3. -v $PWD:/app \
  4. -p 80:80 -p 443:443 -p 443:443/udp \
  5. dunglas/frankenphp

默认情况下,每个 CPU 启动 2 个工作进程。您还可以配置要启动的工作进程数量:

  1. docker run \
  2. -e FRANKENPHP_CONFIG="worker ./public/index.php 42" \
  3. -v $PWD:/app \
  4. -p 80:80 -p 443:443 -p 443:443/udp \
  5. dunglas/frankenphp

在一定数量的请求后重新启动工作进程

由于 PHP 最初并非为长运行进程而设计,因此仍有许多库和遗留代码存在内存泄漏问题。使用这种类型的代码在工作模式中的一个解决方法是,在处理一定数量的请求后重新启动工作脚本:

之前的工作代码片段允许通过设置名为 MAX_REQUESTS 的环境变量来配置要处理的最大请求数量。