当PHP内置服务器崩溃时,端口仍在使用中

Mar*_*tyn 4 php composer-php php-builtin-server

我正在使用 PHP 内置服务器,如下所示:

$ composer serve
> php -S localhost:8000 -t public/
Run Code Online (Sandbox Code Playgroud)

但超时了..?

[Symfony\Component\Process\Exception\ProcessTimedOutException]                     
  The process "php -S localhost:8080 -t public/" exceeded the timeout of 300 seconds.
Run Code Online (Sandbox Code Playgroud)

所以,我尝试再次启动它:

$ composer serve
> php -S localhost:8000 -t public/
[Thu May 26 21:31:51 2016] Failed to listen on localhost:8000 (reason: Address already in use)
Script php -S localhost:8000 -t public/ handling the serve event returned with error code 1
Run Code Online (Sandbox Code Playgroud)

为什么超时之前服务器运行的同一端口仍在使用中?我可以停止服务器内置的所有 PHP 实例吗?

如果重要的话,下面是我的composer.json 文件:

{
    .
    .
    .
    "scripts": {
        "serve": "php -S localhost:8000 -t public/"
    }
}
Run Code Online (Sandbox Code Playgroud)

red*_*802 7

问题是 Composer 在 300 秒后默认超时。

Composer 附带了composer-script process-timeout 静态帮助器来禁用它,只需将其添加到脚本顶部即可:

{
    "scripts": {
        "serve": [
            "Composer\\Config::disableProcessTimeout",
            "@php -S localhost:8000 -t public"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

要在不更改脚本的情况下进行测试,请执行您可以使用的命令--timeout=0,这会禁用超时。在您的示例中,该命令看起来像composer run-script --timeout=0 serve或带有环境参数前缀,例如COMPOSER_PROCESS_TIMEOUT=0 composer serve

更多信息还可参阅为什么 Composer 安装在 300 秒后超时?现场。

  • 我明白了,谢谢。可能只是回去输入完整的“php -S ...”,然后因为我只喜欢输入“composerserve”的便利:)我认为没有办法将 --timeout 值放入作曲家中.json 文件? (2认同)

sai*_*aif 5

您可以在文件中设置进程超时,composer.json如下所示:

  {
    ...
    "scripts": {
      "start": "php -S 127.0.0.1:80 .router.php -t public"
    },
    "config": {
      "process-timeout": 0
    }
  }
Run Code Online (Sandbox Code Playgroud)

并像这样启动网络服务器:

$ composer start