如何通过命令行详细步骤执行PHP脚本并了解其运行过程?
- 内容介绍
- 文章标签
- 相关推荐
本文共计746个文字,预计阅读时间需要3分钟。
不是所有安装了PHP的机器都能直接运行脚本——关键看php命令是否在系统PATH中,且版本满足需求。打开终端,执行:
php -v
如果报错command not found,说明PHP没加到PATH,或者只装了Apache模块版(如Windows下XAMPP默认不配CLI)。macOS用Homebrew安装的、Linux用apt/yum装的php-cli包,通常自带命令行支持;Windows用户要确认安装时勾选了“Add PHP to PATH”,或手动把PHP目录(如C:\php)加进系统环境变量。
怎么运行一个最简PHP脚本?别漏掉shebang和执行权限
写个hello.php:
<?php echo "Hello from CLI\n"; ?>
在终端里执行:php hello.php。这是最稳妥的方式。但想直接./hello.php运行?得加shebang并设权限:
立即学习“PHP免费学习笔记(深入)”;
- 第一行开头加
#!/usr/bin/env php(不要写死/usr/bin/php,路径因系统而异) - 保存后运行
chmod +x hello.php - 再执行
./hello.php
注意:Windows不支持shebang,直接php hello.php即可;Linux/macOS下如果忘了chmod,会提示Permission denied。
传参、读取STDIN、获取脚本路径——CLI和Web环境差异点
命令行下没有$_GET或$_POST,参数走$argv,数量是$argc:
<?php // hello.php name age echo "Name: " . $argv[1] . "\n"; // 第一个实际参数 echo "Age: " . $argv[2] . "\n"; ?>
交互式输入用fgets(STDIN),不是readline()(除非启用了readline扩展);获取当前脚本绝对路径用__FILE__,但注意它返回的是带符号链接的真实路径,需要realpath(__FILE__)才可靠。
常见坑:$argv[0]是脚本名本身,不是第一个业务参数;用php -r跑单行代码时(如php -r "echo date('Y');"),$argv不可用。
错误不显示?调试信息被吞了?关掉web服务器配置干扰
CLI模式默认开启display_errors,但如果你在php.ini里全局关了,或用了-c指定另一个配置文件,就可能看不到报错。执行时加-d display_errors=1强制显示:
php -d display_errors=1 script.php
更推荐的做法:在脚本开头加几行调试开关:
<?php error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('log_errors', 0); // CLI下别往error_log写,容易丢 ?>
另外,Web服务器常用的set_time_limit(0)在CLI里默认就是不限时,不用特意设;但内存限制(memory_limit)仍生效,大文件处理时可能触发Fatal error: Allowed memory size exhausted,需提前调高。
真正容易被忽略的是输出缓冲——CLI默认关闭output_buffering,但某些共享主机或自定义php.ini可能开了,导致echo内容延迟打印或不出现,检查php -i | grep output_buffering确认值为Off或0。
本文共计746个文字,预计阅读时间需要3分钟。
不是所有安装了PHP的机器都能直接运行脚本——关键看php命令是否在系统PATH中,且版本满足需求。打开终端,执行:
php -v
如果报错command not found,说明PHP没加到PATH,或者只装了Apache模块版(如Windows下XAMPP默认不配CLI)。macOS用Homebrew安装的、Linux用apt/yum装的php-cli包,通常自带命令行支持;Windows用户要确认安装时勾选了“Add PHP to PATH”,或手动把PHP目录(如C:\php)加进系统环境变量。
怎么运行一个最简PHP脚本?别漏掉shebang和执行权限
写个hello.php:
<?php echo "Hello from CLI\n"; ?>
在终端里执行:php hello.php。这是最稳妥的方式。但想直接./hello.php运行?得加shebang并设权限:
立即学习“PHP免费学习笔记(深入)”;
- 第一行开头加
#!/usr/bin/env php(不要写死/usr/bin/php,路径因系统而异) - 保存后运行
chmod +x hello.php - 再执行
./hello.php
注意:Windows不支持shebang,直接php hello.php即可;Linux/macOS下如果忘了chmod,会提示Permission denied。
传参、读取STDIN、获取脚本路径——CLI和Web环境差异点
命令行下没有$_GET或$_POST,参数走$argv,数量是$argc:
<?php // hello.php name age echo "Name: " . $argv[1] . "\n"; // 第一个实际参数 echo "Age: " . $argv[2] . "\n"; ?>
交互式输入用fgets(STDIN),不是readline()(除非启用了readline扩展);获取当前脚本绝对路径用__FILE__,但注意它返回的是带符号链接的真实路径,需要realpath(__FILE__)才可靠。
常见坑:$argv[0]是脚本名本身,不是第一个业务参数;用php -r跑单行代码时(如php -r "echo date('Y');"),$argv不可用。
错误不显示?调试信息被吞了?关掉web服务器配置干扰
CLI模式默认开启display_errors,但如果你在php.ini里全局关了,或用了-c指定另一个配置文件,就可能看不到报错。执行时加-d display_errors=1强制显示:
php -d display_errors=1 script.php
更推荐的做法:在脚本开头加几行调试开关:
<?php error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('log_errors', 0); // CLI下别往error_log写,容易丢 ?>
另外,Web服务器常用的set_time_limit(0)在CLI里默认就是不限时,不用特意设;但内存限制(memory_limit)仍生效,大文件处理时可能触发Fatal error: Allowed memory size exhausted,需提前调高。
真正容易被忽略的是输出缓冲——CLI默认关闭output_buffering,但某些共享主机或自定义php.ini可能开了,导致echo内容延迟打印或不出现,检查php -i | grep output_buffering确认值为Off或0。

