Menu

怎么运行 PHP 文件:命令行和 php -S 服务器

在终端中用 php index.php 运行 PHP 文件,或者用 PHP 内置的服务器在浏览器中访问整个文件夹:php -S localhost:8000。两种方式都不需要 Apache 或 XAMPP。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

要运行一个 PHP 文件,在它所在的文件夹中打开终端,输入 php index.php。PHP 会运行这个文件,并在终端中输出结果。要在浏览器中查看 PHP 页面,用 php -S localhost:8000 启动内置服务器,然后打开 http://localhost:8000。

php index.php

第一个 index.php 可以只有一行。点击“运行”:输出的内容和 php index.php 打印的完全一样。

PHP 代码写在 <?php 标签之后。标签之前的所有内容都会作为普通文本输出,PHP 就是这样把代码和 HTML 混在一起的。

从命令行运行 PHP 文件

PHP CLI(命令行界面)运行一次脚本后就退出。你需要先安装 PHP;如果 php -v 输出了错误,先看安装 PHP。

cd ~/projects/hello
php index.php          # run the file
php -l index.php       # only check the syntax ("lint")
php index.php > out.txt   # save the output to a file

上传文件之前,php -l 很有用:它会报告解析错误及其所在行号,或者输出 No syntax errors detected in index.php。

用 $argv 传参数

文件名后面的单词会进入 $argv。$argv[0] 永远是脚本自己的名字,$argc 是参数个数,包括这个名字。这里的代码块运行时没有额外参数,所以只有名字:

在你自己的电脑上,php index.php Ada 3 会把问候语打印三遍。?? 提供的默认值让脚本在缺少参数时也能运行。对于 --name=Ada 这样的命名选项,使用 getopt:

<?php
// php index.php --name=Ada --verbose
$opts = getopt('', ['name:', 'verbose']);
echo "Hello, " . ($opts['name'] ?? 'world') . "\n";
if (isset($opts['verbose'])) {
    echo "Verbose mode\n";
}

用 php -S 在浏览器中运行 PHP

PHP 内置了一个开发用的 Web 服务器。在存放文件的文件夹中启动它:

php -S localhost:8000
[Sat Oct  3 07:21:34 2026] PHP 8.3.19 Development Server (http://localhost:8000) started

现在 http://localhost:8000/ 会运行 index.php,http://localhost:8000/about.php 会运行 about.php。每次加载页面都会重新运行文件,查询字符串在 $_GET 中。下面的代码块也是这样:运行它,然后点击一个链接,脚本会带着设置好的 $_GET['page'] 再运行一次。

常用选项:

php -S localhost:8000 -t public        # serve the public/ folder as the web root
php -S 0.0.0.0:8000                    # reachable from other devices on your network
php -S localhost:8000 router.php       # send every request through router.php

内置服务器一次只处理一个请求,只适合用于开发。在生产环境中,PHP 运行在 Nginx 或 Apache 后面,通常通过 PHP-FPM。

检查脚本是怎么启动的

PHP_SAPI 会告诉你是哪种“服务器 API”在运行脚本:终端中是 cli,php -S 下是 cli-server,真正的 Web 服务器后面是 fpm-fcgi 或 apache2handler。只应该在终端中运行的脚本会先检查它:

用 php -r 运行一行代码

快速测试不需要文件。php -r 运行你传入的代码,不需要 <?php 标签:

php -r 'echo date("Y-m-d"), PHP_EOL;'
php -r 'var_dump(0.1 + 0.2 == 0.3);'

在 Windows 的 cmd 中,代码要用双引号包住,里面使用单引号。要运行多行代码,php -a 会打开一个交互式 shell,每按一次 Enter 就运行一条语句。

在 macOS 和 Linux 上让脚本可以直接执行

在 <?php 前面加一行 shebang,并把文件标记为可执行。shebang 这一行不会被输出:

#!/usr/bin/env php
<?php
echo "Backup started\n";
chmod +x backup.php
./backup.php

cron 就是这样运行 PHP 脚本的:0 3 * * * /usr/bin/php /home/me/backup.php。

脚本的退出码

命令行脚本通过退出码报告成功或失败,shell 脚本和 cron 可以检查它。exit(0) 表示成功,其他任何数字都表示失败:

<?php
$file = $argv[1] ?? '';
if (!is_file($file)) {
    fwrite(STDERR, "File not found: $file\n");
    exit(1);
}
echo "Processing $file\n";
exit(0);

常见错误:运行了错误的文件或文件夹

Could not open input file: index.php 表示 PHP 在终端当前所在的位置找不到这个文件。用 pwd(Windows 上用 cd)检查当前文件夹,然后要么 cd 进入项目,要么给出完整路径:php ~/projects/hello/index.php。使用 php -S 时,如果一个确实存在的页面返回 404,通常说明服务器是在另一个文件夹中启动的;按 Ctrl+C 停止它,在正确的位置重新启动,或者用 -t 指定文件夹。如果文件运行了但输出的是空白页面,打开错误报告看看哪里出了问题。

常见问题

怎么在浏览器中运行 PHP 文件?

在文件所在的文件夹中用 php -S localhost:8000 启动内置服务器,然后打开 http://localhost:8000/yourfile.php。直接从磁盘打开文件是行不通的,因为没有任何东西去运行其中的 PHP 代码。

怎么给 PHP 脚本传参数?

把参数写在文件名后面:php report.php 2026 sales。在脚本中,$argv 是数组 ['report.php', '2026', 'sales'],$argc 是 3。第一个元素永远是脚本名。

不用文件怎么运行一行 PHP 代码?

使用 php -r,并省略 <?php 标签:php -r 'echo strtoupper("hi"), PHP_EOL;'。要运行多行代码,用 php -a 打开交互式 shell。

怎么知道 PHP 是从命令行运行的,还是在 Web 服务器上运行的?

检查 PHP_SAPI(或 php_sapi_name())。在终端中它是 "cli",在 php -S 下是 "cli-server",在 Web 服务器后面则是 "fpm-fcgi" 或 "apache2handler" 之类的值。

Coddy 编程语言插图

和 Coddy 一起学编程

开始