php 是 PHP 脚本语言的命令行解释器,用于在命令行中执行 PHP 代码、运行 PHP 脚本和进行 PHP 相关操作。
📦 基本语法
bash
php [选项] [文件] [参数...]
🎯 主要功能
- 执行 PHP 脚本:运行本地 PHP 文件
- 命令行代码执行:直接执行 PHP 代码片段
- 交互式 Shell:进入 PHP 交互式环境
- 内置 Web 服务器:快速启动 PHP 开发服务器
- 代码检查:语法检查、代码分析
- 扩展管理:查看和管理 PHP 扩展
- 配置文件:管理 PHP 配置
💡 常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
-a |
交互模式(REPL) | php -a |
-c |
指定 php.ini 文件 | php -c /path/to/php.ini |
-f |
执行文件 | php -f script.php |
-r |
执行单行代码 | php -r 'echo "Hello";' |
-i |
显示 PHP 信息(phpinfo) | php -i |
-l |
语法检查(lint) | php -l script.php |
-m |
显示已加载的模块 | php -m |
-v |
显示 PHP 版本 | php -v |
-w |
显示去注释后的源代码 | php -w script.php |
-s |
语法高亮显示源代码 | php -s script.php |
-z |
加载 Zend 扩展 | php -z extension.so |
-d |
定义 INI 配置项 | php -d max_execution_time=60 |
-e |
生成扩展信息 | php -e |
-B |
在处理输入前执行代码 | 配合管道使用 |
-R |
对每行输入执行代码 | 配合管道使用 |
-F |
对每行输入执行文件 | 配合管道使用 |
-E |
在处理完成后执行代码 | 配合管道使用 |
-S |
启动内置 Web 服务器 | php -S localhost:8000 |
-t |
指定 Web 服务器根目录 | php -S localhost:8000 -t /www |
--rf |
显示函数信息 | php --rf function_name |
--rc |
显示类信息 | php --rc class_name |
--re |
显示扩展信息 | php --re extension_name |
--ri |
显示扩展配置 | php --ri extension_name |
-h |
显示帮助 | php -h |
🔧 实际应用示例
示例 1:基本 PHP 脚本执行
bash
# 1. 创建简单的 PHP 脚本
cat > hello.php << 'EOF'
<?php
echo "Hello, World!\n";
echo "Current time: " . date('Y-m-d H:i:s') . "\n";
echo "PHP Version: " . PHP_VERSION . "\n";
?>
EOF
# 2. 运行 PHP 脚本
php hello.php
# 3. 指定配置文件运行
php -c /etc/php/8.1/cli/php.ini hello.php
# 4. 设置临时配置
php -d display_errors=1 -d error_reporting=E_ALL hello.php
# 5. 包含路径设置
php -d include_path='.:/usr/share/php' script.php
示例 2:命令行代码执行
bash
# 1. 单行代码执行
php -r 'echo "Hello from command line!\n";'
# 2. 多行代码(使用 NOWDOC)
php -r '
$name = "World";
echo "Hello, $name!\n";
for ($i = 1; $i <= 5; $i++) {
echo "Count: $i\n";
}
'
# 3. 使用变量
php -r '$x = 10; $y = 20; echo "Sum: " . ($x + $y) . "\n";'
# 4. 包含文件
php -r 'require "config.php"; echo CONFIG_VALUE;'
# 5. 命令行参数
php -r 'echo "Arguments: " . implode(", ", $argv) . "\n";' arg1 arg2 arg3
示例 3:交互式 Shell(REPL)
bash
# 1. 启动交互式 Shell
php -a
# 进入交互模式,可以输入PHP代码
# 2. 交互模式示例
php -a
Interactive mode enabled
php > echo "Hello, World!\n";
Hello, World!
php > $x = 5 * 5;
php > echo "Result: $x\n";
Result: 25
php > function hello($name) { return "Hello, $name!"; }
php > echo hello("PHP") . "\n";
Hello, PHP!
php > exit
# 或按 Ctrl+D 退出
# 3. 使用 Psysh(更好的 REPL)
# 安装
composer global require psy/psysh
# 使用
psysh
示例 4:内置 Web 服务器
bash
# 1. 启动简单 Web 服务器
php -S localhost:8000
# 2. 指定根目录
php -S localhost:8000 -t /var/www/html
# 3. 指定路由器脚本
php -S localhost:8000 router.php
# 4. 监听所有接口
php -S 0.0.0.0:8000
# 5. 完整示例脚本
cat > server.php << 'EOF'
<?php
$port = 8000;
$host = '0.0.0.0';
$docroot = __DIR__;
echo "Starting PHP development server...\n";
echo "Server: http://$host:$port\n";
echo "Document root: $docroot\n";
echo "Press Ctrl+C to stop\n\n";
// 启动服务器
passthru("php -S $host:$port -t $docroot");
?>
EOF
php server.php
示例 5:语法检查和代码分析
bash
# 1. 语法检查(Lint)
php -l script.php
# 输出:No syntax errors detected in script.php
# 2. 检查多个文件
for file in *.php; do
echo "Checking $file..."
php -l "$file" || echo "Syntax error in $file"
done
# 3. 显示去注释后的代码
php -w script.php > script.min.php
# 4. 语法高亮显示
php -s script.php
# 或输出为 HTML
php -s script.php > script.html
# 5. 使用 token_get_all 进行更复杂的分析
php -r '
$code = file_get_contents("script.php");
$tokens = token_get_all($code);
foreach ($tokens as $token) {
if (is_array($token)) {
echo token_name($token[0]) . ": " . $token[1] . "\n";
}
}
'
示例 6:PHP 信息管理
bash
# 1. 显示完整 PHP 信息
php -i
# 2. 显示特定信息
php -i | grep -E "(memory_limit|max_execution_time|upload_max_filesize)"
# 3. 显示 PHP 版本
php -v
php --version
# 4. 显示已加载的模块
php -m
php -m | grep -i mysql # 查找特定模块
# 5. 显示模块信息
php --ri pdo_mysql
php --ri json
php --ri xdebug
# 6. 显示函数信息
php --rf strlen
php --rf preg_match
# 7. 显示类信息
php --rc DateTime
php --rc PDO
示例 7:数据处理和转换
bash
# 1. JSON 处理
echo '{"name":"John","age":30}' | php -r 'print_r(json_decode(stream_get_contents(STDIN)));'
# 2. CSV 处理
cat data.csv | php -r '
while (($line = fgets(STDIN)) !== false) {
$data = str_getcsv($line);
print_r($data);
}
'
# 3. XML 处理
cat data.xml | php -r '
$xml = simplexml_load_string(stream_get_contents(STDIN));
print_r($xml);
'
# 4. Base64 编码/解码
echo "Hello" | php -r 'echo base64_encode(stream_get_contents(STDIN));'
echo "SGVsbG8=" | php -r 'echo base64_decode(stream_get_contents(STDIN));'
# 5. MD5/SHA1 哈希
echo "password" | php -r 'echo md5(stream_get_contents(STDIN)) . "\n";'
echo "password" | php -r 'echo sha1(stream_get_contents(STDIN)) . "\n";'
示例 8:文件批量处理
bash
#!/bin/bash
# 使用 PHP 批量处理文件
# 1. 批量重命名文件
php -r '
foreach (glob("*.txt") as $filename) {
$new_name = str_replace(".txt", ".bak.txt", $filename);
rename($filename, $new_name);
echo "Renamed: $filename -> $new_name\n";
}
'
# 2. 批量修改文件内容
for file in *.php; do
php -r '
$content = file_get_contents($argv[1]);
$content = str_replace("old_string", "new_string", $content);
file_put_contents($argv[1], $content);
echo "Updated: " . $argv[1] . "\n";
' "$file"
done
# 3. 批量图片处理(需要GD扩展)
php -r '
foreach (glob("*.jpg") as $image) {
$im = imagecreatefromjpeg($image);
$im_resized = imagescale($im, 200);
imagejpeg($im_resized, "resized/" . basename($image));
imagedestroy($im);
imagedestroy($im_resized);
echo "Resized: $image\n";
}
'
# 4. 批量文件信息统计
php -r '
$total_size = 0;
$file_count = 0;
foreach (glob("*") as $file) {
if (is_file($file)) {
$size = filesize($file);
$total_size += $size;
$file_count++;
echo sprintf("%-30s %10d bytes\n", $file, $size);
}
}
echo "\nTotal: $file_count files, " . number_format($total_size) . " bytes\n";
'
示例 9:系统管理和监控
bash
#!/bin/bash
# PHP 系统管理脚本
# 1. 系统信息收集
php -r '
echo "=== System Information ===\n";
echo "Hostname: " . gethostname() . "\n";
echo "PHP Version: " . PHP_VERSION . "\n";
echo "OS: " . PHP_OS . "\n";
echo "Memory Limit: " . ini_get("memory_limit") . "\n";
echo "Max Execution Time: " . ini_get("max_execution_time") . "s\n";
// CPU 信息
if (is_readable("/proc/cpuinfo")) {
$cpuinfo = file("/proc/cpuinfo");
foreach ($cpuinfo as $line) {
if (strpos($line, "model name") !== false) {
echo "CPU: " . substr($line, strpos($line, ":") + 2);
break;
}
}
}
// 内存信息
if (is_readable("/proc/meminfo")) {
$meminfo = file("/proc/meminfo");
foreach ($meminfo as $line) {
if (strpos($line, "MemTotal") === 0 || strpos($line, "MemFree") === 0) {
echo trim($line) . "\n";
}
}
}
'
# 2. 进程监控
php -r '
exec("ps aux", $output);
echo "=== Process Monitoring ===\n";
foreach ($output as $line) {
if (strpos($line, "php") !== false) {
echo $line . "\n";
}
}
'
# 3. 磁盘空间检查
php -r '
echo "=== Disk Usage ===\n";
exec("df -h", $output);
foreach ($output as $line) {
echo $line . "\n";
}
'
# 4. 网络连接检查
php -r '
echo "=== Network Connections ===\n";
exec("netstat -tulpn 2>/dev/null", $output);
foreach ($output as $line) {
echo $line . "\n";
}
'
示例 10:Web 开发和测试
bash
#!/bin/bash
# PHP Web 开发工具
# 1. 快速创建测试脚本
create_test_script() {
cat > test.php << 'EOF'
<?php
// 简单的测试端点
header('Content-Type: application/json');
$request = [
'method' => $_SERVER['REQUEST_METHOD'],
'uri' => $_SERVER['REQUEST_URI'],
'query' => $_GET,
'post' => $_POST,
'headers' => getallheaders(),
'server' => $_SERVER,
];
if (isset($_FILES) && count($_FILES) > 0) {
$request['files'] = $_FILES;
}
echo json_encode([
'status' => 'success',
'timestamp' => date('Y-m-d H:i:s'),
'data' => $request,
], JSON_PRETTY_PRINT);
EOF
echo "测试脚本已创建: test.php"
}
# 2. 启动测试服务器
start_test_server() {
local port="${1:-8080}"
local host="${2:-localhost}"
echo "启动测试服务器: http://$host:$port"
echo "测试端点:"
echo " GET / - 显示请求信息"
echo " POST / - 测试 POST 请求"
echo " GET /info - PHP 信息"
echo " GET /phpinfo - PHP 信息页面"
echo ""
# 创建路由器
cat > router.php << 'EOF'
<?php
$uri = $_SERVER['REQUEST_URI'];
switch ($uri) {
case '/info':
phpinfo();
break;
case '/phpinfo':
header('Content-Type: text/html');
ob_start();
phpinfo();
$info = ob_get_clean();
echo '<!DOCTYPE html><html><head><title>PHP Info</title></head><body>' . $info . '</body></html>';
break;
default:
require 'test.php';
break;
}
EOF
php -S "$host:$port" router.php
}
# 3. API 测试工具
test_api() {
local url="$1"
php -r '
$url = $argv[1];
echo "Testing: $url\n\n";
// GET 请求
echo "=== GET Request ===\n";
$response = file_get_contents($url);
echo "Response:\n";
print_r(json_decode($response, true));
echo "\n";
// POST 请求
echo "=== POST Request ===\n";
$context = stream_context_create([
"http" => [
"method" => "POST",
"header" => "Content-Type: application/json\r\n",
"content" => json_encode(["test" => "data"])
]
]);
$response = file_get_contents($url, false, $context);
echo "Response:\n";
print_r(json_decode($response, true));
' "$url"
}
# 4. 数据库测试
test_database() {
php -r '
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", "root", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Database connection successful!\n";
// 创建测试表
$pdo->exec("CREATE TABLE IF NOT EXISTS test (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)");
// 插入测试数据
$stmt = $pdo->prepare("INSERT INTO test (name) VALUES (?)");
$stmt->execute(["Test " . date("H:i:s")]);
echo "Inserted test data\n";
// 查询数据
$result = $pdo->query("SELECT * FROM test ORDER BY id DESC LIMIT 5");
echo "Last 5 records:\n";
foreach ($result as $row) {
echo " ID: {$row["id"]}, Name: {$row["name"]}, Created: {$row["created_at"]}\n";
}
} catch (PDOException $e) {
echo "Database error: " . $e->getMessage() . "\n";
}
'
}
📊 高级用法
1. PHP 内置 Web 服务器配置
bash
# 创建带自定义配置的开发服务器
cat > dev-server.php << 'EOF'
<?php
$port = 8000;
$host = '127.0.0.1';
$root = __DIR__ . '/public';
// 自定义错误处理
function handle_error($errno, $errstr, $errfile, $errline) {
echo "Error [$errno]: $errstr in $errfile on line $errline\n";
return true;
}
set_error_handler('handle_error');
// 自定义路由
$router = function($url) use ($root) {
$path = $root . $url;
if (is_dir($path)) {
$path = rtrim($path, '/') . '/index.php';
}
if (file_exists($path)) {
return $path;
}
// 尝试添加 .php 扩展名
if (file_exists($path . '.php')) {
return $path . '.php';
}
return $root . '/index.php';
};
echo "Starting development server at http://$host:$port\n";
echo "Document root: $root\n";
echo "Press Ctrl+C to stop\n\n";
passthru("php -S $host:$port -t \"$root\"");
EOF
php dev-server.php
2. PHP 代码质量检查
bash
#!/bin/bash
# PHP 代码质量检查工具
# 1. 语法检查
check_syntax() {
echo "=== 语法检查 ==="
find . -name "*.php" -type f | while read file; do
if ! php -l "$file" > /dev/null 2>&1; then
echo "❌ $file"
php -l "$file"
else
echo "✅ $file"
fi
done
}
# 2. 编码规范检查(需要 PHP_CodeSniffer)
check_coding_standards() {
if command -v phpcs &> /dev/null; then
echo "=== 编码规范检查 ==="
phpcs --standard=PSR12 src/
else
echo "安装 PHP_CodeSniffer: composer global require squizlabs/php_codesniffer"
fi
}
# 3. 静态分析(需要 PHPStan)
check_static_analysis() {
if command -v phpstan &> /dev/null; then
echo "=== 静态分析 ==="
phpstan analyse src/ --level=8
else
echo "安装 PHPStan: composer global require phpstan/phpstan"
fi
}
# 4. 安全性检查
check_security() {
echo "=== 安全性检查 ==="
# 检查危险函数
dangerous_functions=("system\|exec\|shell_exec\|passthru\|eval\|assert\|popen\|proc_open\|pcntl_exec")
find . -name "*.php" -type f -exec grep -l "$dangerous_functions" {} \; | while read file; do
echo "⚠️ 可能危险: $file"
grep -n "$dangerous_functions" "$file"
done
# 检查 SQL 注入风险
echo ""
echo "检查 SQL 注入风险..."
find . -name "*.php" -type f -exec grep -l "mysql_query\|mysqli_query\|query(" {} \; | while read file; do
echo "检查: $file"
grep -n "query(" "$file" | head -5
done
}
# 5. 运行测试
run_tests() {
echo "=== 运行测试 ==="
if [ -f "vendor/bin/phpunit" ]; then
vendor/bin/phpunit tests/
elif command -v phpunit &> /dev/null; then
phpunit tests/
else
echo "安装 PHPUnit: composer require --dev phpunit/phpunit"
fi
}
# 6. 生成报告
generate_report() {
local report_file="php_quality_report_$(date +%Y%m%d_%H%M%S).txt"
echo "生成代码质量报告..."
{
echo "PHP 代码质量报告"
echo "生成时间: $(date)"
echo "========================"
echo ""
echo "1. 语法检查结果:"
check_syntax
echo ""
echo "2. 编码规范结果:"
check_coding_standards
echo ""
echo "3. 静态分析结果:"
check_static_analysis
echo ""
echo "4. 安全性检查结果:"
check_security
echo ""
echo "5. 测试结果:"
run_tests
} > "$report_file"
echo "报告已生成: $report_file"
}
⚠️ 注意事项
- 安全性 :不要在生产环境中使用
-r选项执行不受信任的代码 - 内存限制:长时间运行的脚本可能需要调整内存限制
- 超时设置:默认执行时间限制为30秒,需要时调整
- 错误报告:开发时启用错误报告,生产环境禁用
- 扩展依赖:确保所需扩展已安装和启用
- 权限问题:Web 服务器需要适当的文件系统权限
php 命令是 PHP 开发者的重要工具,不仅可以运行 Web 应用,还可以用于脚本开发、系统管理和快速原型开发。