You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过CLI执行PHP文件并在文件内启动PHP内置服务器?Laravel示例解析

当然可行!而且Laravel Artisan也是这么做的

一、直接在PHP文件中启动内置服务器的方法

你完全可以在PHP脚本里通过执行系统命令来启动PHP内置服务器,常用的方式有两种:

1. 用exec()/shell_exec()快速启动

这是最简单的方式,直接调用系统命令启动服务器。比如创建一个start_server.php文件:

<?php
// 启动内置服务器,绑定localhost:8000,入口文件为当前目录的index.php
$serverCommand = 'php -S localhost:8000 index.php';

// 执行命令,默认会阻塞当前进程,直到服务器被终止(比如Ctrl+C)
exec($serverCommand);

// 如果想让服务器在后台运行(仅Linux/macOS),可以加&
// exec($serverCommand . ' &');
?>

然后在命令行执行:php start_server.php,就能启动内置服务器了。

2. 用proc_open()实现更可控的启动

如果你需要监控服务器的输出、错误信息,或者更灵活地控制进程,推荐用proc_open():

<?php
// 定义进程的输入输出管道
$descriptors = [
    0 => ['pipe', 'r'],  // 标准输入
    1 => ['pipe', 'w'],  // 标准输出
    2 => ['pipe', 'w']   // 标准错误
];

// 构建启动命令,指定Laravel那样的public目录作为根目录
$serverCommand = 'php -S localhost:8000 -t public/';

// 启动进程
$process = proc_open($serverCommand, $descriptors, $pipes);

if (is_resource($process)) {
    // 实时输出服务器的日志
    while (!feof($pipes[1])) {
        echo fgets($pipes[1]);
        flush();
    }

    // 关闭管道和进程
    fclose($pipes[0]);
    fclose($pipes[1]);
    fclose($pipes[2]);
    proc_close($process);
}
?>

二、Laravel Artisan的serve命令是怎么实现的?

Artisan的serve命令本质上也是通过执行系统命令启动内置服务器,只不过封装得更优雅:

  • 它会读取配置文件里的APP_URL来确定主机和端口,默认是localhost:8000
  • 它会指定Laravel的public目录作为服务器的根目录(对应-t public/参数)
  • 底层使用Symfony的Process组件来管理进程,这个组件比原生的exec()更强大,可以实时捕获输出、处理信号(比如Ctrl+C终止)
  • 启动后会给用户友好的提示,比如Laravel development server started: http://localhost:8000

简单来说,Artisan就是把我们手动执行的php -S localhost:8000 -t public/命令,用PHP代码封装成了一个可配置的命令行工具。

内容的提问来源于stack exchange,提问作者QaMar ALi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:02:10