如何在后台运行PHP的内置Web服务器?

时间:2015-05-15 19:27:07

标签: php protractor daemon php-5.4

我编写了一个在持续集成环境中执行的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执行此操作的内容。

可以这样做吗?如果是这样,怎么样? 如果这绝对不可能,我愿意接受其他解决方案。

3 个答案:

答案 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 &