我编写了一个在持续集成环境中执行的PHP CLI脚本。它所做的一件事就是运行Protractor测试。
我的计划是让内置的PHP 5.4's built-in web server在后台运行:
php -S localhost:9000 -t foo/ bar.php &
然后运行将使用localhost:9000
的量角器测试:
protractor ./test/protractor.config.js
但是,PHP的内置Web服务器不作为后台服务运行。我似乎无法找到任何可以让我用PHP执行此操作的内容。
可以这样做吗?如果是这样,怎么样? 如果这绝对不可能,我愿意接受其他解决方案。
答案 0 :(得分:20)
你可以像在后台运行任何应用程序一样。
void
server_client_set_title(struct client *c)
{
struct session *s = c->session;
const char *template;
char *title;
template = options_get_string(&s->options, "set-titles-string");
title = status_replace(c, NULL, NULL, NULL, template, time(NULL), 1);
if (c->title == NULL || strcmp(title, c->title) != 0) {
free(c->title);
c->title = xstrdup(title);
tty_set_title(&c->tty, c->title);
}
free(title);
}
此处,nohup用于防止终端锁定。然后,您需要重定向stdout(void
server_client_set_title(struct client *c)
{
struct session *s = c->session;
const char *template;
char *title;
struct format_tree *ft;
template = options_get_string(&s->options, "set-titles-string");
ft = format_create();
format_defaults(ft, c, NULL, NULL, NULL);
title = format_expand_time(ft, template, time(NULL));
if (c->title == NULL || strcmp(title, c->title) != 0) {
free(c->title);
c->title = xstrdup(title);
tty_set_title(&c->tty, c->title);
}
free(title);
format_free(ft);
}
)和stderr(nohup php -S localhost:9000 -t foo/ bar.php > phpd.log 2>&1 &
)。
答案 1 :(得分:8)
此处还有停止在后台运行的内置php服务器的方式:
# Run in the background as Devon advised
nohup php -S localhost:9000 -t foo/ bar.php > phpd.log 2>&1 &
# Get last background process PID
PHP_SERVER_PID=$!
# rinning tests and everything...
protractor ./test/protractor.config.js
# Send SIGQUIT to php built-in server running in background to stop it
kill -3 $PHP_SERVER_PID
当您需要在CI等的某个阶段运行测试时,这非常有用。
答案 2 :(得分:0)
您可以使用&>
将stderr和stdout都重定向到/dev/null
(无处)。
nohup php -S 0.0.0.0:9000 -t foo/bar.php &> /dev/null &