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


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

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

  • PHP: PHP 5.4.30 (cli) (构建时间: Jul 29 2014 23:43:29)
  • SQLite:3.7.13
  • 菲律宾语:4.3.4

我正在使用 PHPUnit 在两个广泛的领域测试应用程序:

  1. 测试每个类的方法。
  2. 测试 Web 服务 URL(例如,GET /items/1返回项目 1 的 JSON 表示形式)。

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

php -S localhost:8000 -t ./htdocs

引导脚本还存储服务器进程的 ID,以便在 PHPUnit 完成时可以终止它。这一切都如我所期望的那样工作。

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

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

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

或者,我是否以错误的方式做到这一点,是否有另一种(更好?)方法可以实现同样的事情?

根据文档 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';

你试过吗?