将值传递给内置服务器 PHP 下的脚本 运行

Passing in values to scripts running under PHP built-in server

我有一个 PHP 应用程序,它将 API 作为 RESTful 网络服务实施,并使用 SQLite 进行数据存储。相关软件版本为:

我正在使用 PHPUnit 在两大领域测试应用程序:

  1. 测试每个 class 的方法。
  2. 测试网络服务 URL(例如 GET /items/1 returns JSON 项目 1 的表示)。

测试每个 class 的方法很容易,因为一切都在 PHPUnit 中处理,我可以使用 phpunit.xml 配置文件(包括到的路径)将常量设置为给定值在测试开始时创建的测试数据库 运行 并且为每个测试重置数据)。为了测试网络服务,我有一个 bootstrap 脚本启动 PHP 内置服务器,如下所示:

php -S localhost:8000 -t ./htdocs

bootstrap 脚本还存储服务器进程的 ID,因此它可以在 PHP 单元完成时将其终止。这一切都如我所料。

我遇到的问题是,当我测试 Web 服务时,我希望它使用测试数据库,在生产中我希望它使用实时数据库,并且这两个数据库具有不同的路径。目前生产数据库路径由 config.php 文件中的常量定义,但我想在 运行ning PHPUnit 时覆盖它。理想情况下,我想使用如下内容通过内置服务器传递一个值:

php -S localhost:8000 -t ./htdocs -D DATABASE_PATH=/path/to/sqlite.db

其中 DATABASE_PATH 将在 运行 网络服务的 PHP 代码中显示为常量。如果尚未指定路径,我可以使用 if (!defined('DATABASE_PATH') 检查来提供实时数据库路径。有没有办法使用内置服务器来做到这一点?我已经检查了 php 的手册页,但我可以找到任何提供此功能的参数 - 我发现最接近的是 -d 用于定义 INI 条目。

或者,我是不是以错误的方式解决这个问题,是否有另一种(更好的?)方法来实现同样的目标?

根据文档http://php.net/manual/en/features.commandline.webserver.php

您可以拨打:

$ php -S localhost:8000 router.php

其中 router.php 是您的调度程序文件(从文档页面复制):

<?php
// router.php
if (php_sapi_name() == 'cli-server') {
    /* route static assets and return false */
}
/* go on with normal index.php operations */
?>

所以一旦你检测到 cli-server 你就可以

define('PHPUNIT_DATABASE_PATH','path/to/your/database';

你试过了吗?