首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 呼叫 C/C++ 程式:透過 Web 執行編譯語言的實作指南

     編輯:PHP 綜合知識

應用場景

當需要高效能運算、呼叫現有 C/C++ 函式庫、或存取底層硬體時,可將核心邏輯寫成 C/C++ 可執行檔,再由 PHP 透過 passthru()、exec() 或 proc_open() 呼叫,實現 Web 介面操作系統級程式。

環境需求

  • Linux/Unix 伺服器(內建 GCC/G++)
  • Apache + PHP(需允許執行外部程式)
  • 基礎 C++、Shell、PHP 開發經驗

步驟 1:撰寫 C++ 程式

範例 SampleApp.cpp 接收命令列參數並回顯:

#include <iostream>
using namespace std;

int main(int argc, char* argv[]) {
    cout << endl << "You passed " << argc-1
         << " argument" << (argc-1 == 1 ? "" : "s") << "." << endl;
    cout << (argc-1 == 1 ? "This" : "These")
         << " argument" << (argc-1 == 1 ? "" : "s")
         << " " << (argc-1 == 1 ? "is" : "are") << ": " << endl << endl;
    for (int i = 1; i < argc; i++) {
        cout << "[" << i << "] " << argv[i] << endl;
    }
    return 0;
}

編譯:

g++ SampleApp.cpp -o SampleApp

測試:

./SampleApp first second
# 輸出:
# You passed 2 arguments.
# These arguments are:
# [1] first
# [2] second

步驟 2:PHP 呼叫並取得輸出

<?php
$args = escapeshellarg($arg1) . ' ' . escapeshellarg($arg2);
$cmd = "./SampleApp $args";

// 方法 1:passthru 直接輸出到瀏覽器
header('Content-Type: text/plain; charset=utf-8');
passthru($cmd, $return_var);

// 方法 2:exec 取得最後一行
// $output = [];
// exec($cmd, $output, $return_var);
// echo implode("\n", $output);

// 方法 3:proc_open 雙向溝通(進階)
// $proc = proc_open($cmd, [['pipe','r'],['pipe','w'],['pipe','w']], $pipes);
// ...
?>

安全性關鍵點

  • 絕對路徑:指定完整執行檔路徑,避免 PATH 劫持
  • 參數轉義:escapeshellarg() 包裹每個參數,防指令注入
  • 權限最小化:Web 使用者不可為 root;C++ 程式僅開放必要權限
  • 輸入驗證:嚴格白名單驗證所有傳入參數
  • 超時控制:proc_open 搭配 stream_set_timeout 防止阻塞
  • 資源限制:ulimit 或 cgroups 限制 CPU/記憶體

替代方案比較

結語

CLI 呼叫適合快速驗證概念或整合舊系統,正式上線建議評估 FFI 或微服務架構以提升安全性與擴展性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案優點缺點
PHP 擴充模組效能最佳、型別安全開發門檻高、需重編譯 PHP
FFI (PHP 7.4+)無需編譯擴充、直接呼叫 C 函式僅支援簡單資料型別、效能稍遜
gRPC / Message Queue解耦、跨語言、可水平擴展架構複雜、延遲較高
CLI 呼叫 (本文)快速原型、重用既有程式進程開銷大、安全風險高