Linux命令-php(PHP语言的命令行接口)

phpPHP 脚本语言的命令行解释器,用于在命令行中执行 PHP 代码、运行 PHP 脚本和进行 PHP 相关操作。

📦 基本语法

bash 复制代码
php [选项] [文件] [参数...]

🎯 主要功能

  1. 执行 PHP 脚本:运行本地 PHP 文件
  2. 命令行代码执行:直接执行 PHP 代码片段
  3. 交互式 Shell:进入 PHP 交互式环境
  4. 内置 Web 服务器:快速启动 PHP 开发服务器
  5. 代码检查:语法检查、代码分析
  6. 扩展管理:查看和管理 PHP 扩展
  7. 配置文件:管理 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"
}

⚠️ 注意事项

  1. 安全性 :不要在生产环境中使用 -r 选项执行不受信任的代码
  2. 内存限制:长时间运行的脚本可能需要调整内存限制
  3. 超时设置:默认执行时间限制为30秒,需要时调整
  4. 错误报告:开发时启用错误报告,生产环境禁用
  5. 扩展依赖:确保所需扩展已安装和启用
  6. 权限问题:Web 服务器需要适当的文件系统权限

php 命令是 PHP 开发者的重要工具,不仅可以运行 Web 应用,还可以用于脚本开发、系统管理和快速原型开发。

相关推荐
A_humble_scholar1 小时前
Linux(八) 进程内存全景:环境变量、main 函数参数与虚拟地址空间全链路深度解析
linux·运维·服务器
longforus1 小时前
linux上播放音乐的终极解决方案
linux·音频·折腾
xcLeigh1 小时前
鸿蒙PC平台 Shotwell 照片管理器适配实战:从 Linux GNOME 到 鸿蒙PC 的 Electron 迁移
linux·electron·harmonyos·鸿蒙·shotwell·照片管理器
Lang-12102 小时前
CentOS Linux服务器完整迁移方案
linux·服务器·centos
TCW11212 小时前
Linux操作系统系列.动态加载
linux·服务器
lisanmengmeng2 小时前
gitlab 免密配置
linux·服务器·gitlab
与代码不die不休2 小时前
RTX5060显卡torch和torch_radon库安装避坑指南(仅linux系统)
linux·图像处理·python·深度学习
vortex52 小时前
深入探讨 Linux/Unix 传统设计哲学
linux·运维·unix
不吃土豆的马铃薯2 小时前
C++ 正则表达式入门详解
linux·服务器·网络·数据库·c++·正则表达式