将值传递给内置服务器 PHP 下的脚本 运行
Passing in values to scripts running under PHP built-in server
我有一个 PHP 应用程序,它将 API 作为 RESTful 网络服务实施,并使用 SQLite 进行数据存储。相关软件版本为:
- PHP:PHP 5.4.30 (cli)(内置:2014 年 7 月 29 日 23:43:29)
- SQLite: 3.7.13
- PHP单位:4.3.4
我正在使用 PHPUnit 在两大领域测试应用程序:
- 测试每个 class 的方法。
- 测试网络服务 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';
你试过了吗?
我有一个 PHP 应用程序,它将 API 作为 RESTful 网络服务实施,并使用 SQLite 进行数据存储。相关软件版本为:
- PHP:PHP 5.4.30 (cli)(内置:2014 年 7 月 29 日 23:43:29)
- SQLite: 3.7.13
- PHP单位:4.3.4
我正在使用 PHPUnit 在两大领域测试应用程序:
- 测试每个 class 的方法。
- 测试网络服务 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';
你试过了吗?