PHPで内網穿透でマルチプロセスにする方法

PHPでローカルネットワークを貫通するマルチプロセスを実現するには、pcntl拡張でプロセスを制御し、ソケットプログラミングでネットワーク接続を確立できます。

PHPで内向けトラフィックを複数のプロセスで処理する基本サンプルコードは次のとおりです。

<?php
// 内网穿透服务器地址和端口(公网)
$serverHost = 'xxx.xxx.xxx.xxx';
$serverPort = 12345;

// 内网地址和端口(局域网)
$localHost = '127.0.0.1';
$localPort = 8080;

// 创建服务器端socket
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, $serverHost, $serverPort);
socket_listen($serverSocket, 5);

echo "Server started on $serverHost:$serverPort\n";

// 循环接收客户端请求
while (true) {
    $clientSocket = socket_accept($serverSocket);

    // 创建子进程处理客户端请求
    $pid = pcntl_fork();
    if ($pid == -1) {
        die("Fork failed\n");
    } elseif ($pid == 0) {
        // 子进程
        socket_close($serverSocket);

        // 建立与内网的连接
        $localSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        socket_connect($localSocket, $localHost, $localPort);

        // 转发数据
        while (true) {
            // 从客户端读取数据并发送给内网
            $clientData = socket_read($clientSocket, 1024);
            socket_write($localSocket, $clientData, strlen($clientData));

            // 从内网读取数据并发送给客户端
            $localData = socket_read($localSocket, 1024);
            socket_write($clientSocket, $localData, strlen($localData));
        }

        socket_close($localSocket);
        socket_close($clientSocket);
        exit(0);
    } else {
        // 父进程
        socket_close($clientSocket);
    }
}

socket_close($serverSocket);
?>

サーバー側のソケットを作成してクライアントからの接続を受け付けます。クライアントが接続するとクライアントの要求を処理するためのサブプロセスを作成します。サブプロセスはイントラネットと接続し、イントラネットにクライアントからの要求データを転送し、イントラネットからの応答データをクライアントに転送します。

なお、これはごく単純なサンプルであり、実際に適用する際には同時接続数やエラー処理、セキュリティなどの考慮が必要な場合があります。

bannerAds