记录值得记录下的事情

PHP调用外部C/C++并获取返回结果

PHP 调用 C/C++ 有很多方式,最常用的是通过 HTTP 或者 Socket 去调用,通过发送 TCP 请求去调用 C/C++ 编写的CGI/FastCGI 来实现。另外,PHP 还有一种直接执行外部应用程序的方式,但是这种方式会影响到系统的安全,容易被攻击者利用,所以使用的时候要谨慎处理好数据输入。

PHP 执行外部二进制命令的函数有好几个,比如 exec 和 passthru ,并且 passthru 函数能执行命令并且可以返回外部命令的输出,所以就使用 passthru 来实现,PHP 调用 C/C++函数 的目的就是处理复杂计算时提高计算效率,从而提高整体的系统性能。

1、首先编写一个 test.c 源文件,处理很简单就是对两个整数进行加法运算,代码如下:

#include<stdio.h>
int main(int argc, char **argv) {
    int a = atol(argv[1]);
    int b = atol(argv[2]);
    int sum = a + b;
    printf("%d\n", sum);
    return 0;
}

保存后,执行编译gcc test.c -o test,编译后会在当前目录下生成test可执行文件,通过 ./test 5 12 可以执行文件看到输出17。

接着是PHP代码(生产环境中要把 C/C++项目 放在 Web访问目录 之外,在 PHP 中使用绝对路径调用)

<?php
header("Content-Type:text/html; charset=utf-8");
if(isset($_POST['a']) && isset($_POST['b']) && !empty($_POST['a']) && !empty($_POST['b'])) {
    $command = './test '.$_POST['a'].' '.$_POST['b'];
    $result = passthru($command);
    print_r($result);
} else {
    echo "输入不能为空!";
}

标签: PHP, TCP, C/C++, HTTP, Socket

添加新评论