国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

批量向gateway發(fā)送并獲取數據,并發(fā)時接收信息會不會串

lizuowang

問題描述

這個向網關發(fā)送請求并接收應答,$client是從靜態(tài)屬性中取出,存在多進程并用的情況,
那在進程并發(fā)執(zhí)行 向網關發(fā)送消息時,能發(fā)確保收到的應答是本進程發(fā)送的請求應答呢?

 /**
     * 批量向gateway發(fā)送并獲取數據
     * @param $gateway_buffer_array
     * @return array
     */
    protected static function getBufferFromGateway($gateway_buffer_array)
    {
        $client_array = $status_data = $client_address_map = $receive_buffer_array = $recv_length_array = array();
        // 批量向所有gateway進程發(fā)送請求數據
        foreach ($gateway_buffer_array as $address => $gateway_buffer) {
            $client = static::getGatewayConnection("tcp://$address");
            if (strlen($gateway_buffer) === stream_socket_sendto($client, $gateway_buffer)) {
                $socket_id                        = (int)$client;
                $client_array[$socket_id]         = $client;
                $client_address_map[$socket_id]   = explode(':', $address);
                $receive_buffer_array[$socket_id] = '';
            }
        }
        // 超時5秒
        $timeout    = 5;
        $time_start = microtime(true);
        // 批量接收請求
        while (count($client_array) > 0) {
            $write = $except = array();
            $read  = $client_array;
            if (@stream_select($read, $write, $except, $timeout)) {
                foreach ($read as $client) {
                    $socket_id = (int)$client;
                    $buffer    = stream_socket_recvfrom($client, 65535);
                    if ($buffer !== '' && $buffer !== false) {
                        $receive_buffer_array[$socket_id] .= $buffer;
                        $receive_length = strlen($receive_buffer_array[$socket_id]);
                        if (empty($recv_length_array[$socket_id]) && $receive_length >= 4) {
                            $recv_length_array[$socket_id] = current(unpack('N', $receive_buffer_array[$socket_id]));
                        }
                        if (!empty($recv_length_array[$socket_id]) && $receive_length >= $recv_length_array[$socket_id] + 4) {
                            unset($client_array[$socket_id]);
                        }
                    } elseif (feof($client)) {
                        unset($client_array[$socket_id]);
                    }
                }
            }
            if (microtime(true) - $time_start > $timeout) {
                static::$gatewayConnections = [];
                break;
            }
        }
        $format_buffer_array = array();
        foreach ($receive_buffer_array as $socket_id => $buffer) {
            $local_ip                                    = ip2long($client_address_map[$socket_id][0]);
            $local_port                                  = $client_address_map[$socket_id][1];
            $format_buffer_array[$local_ip][$local_port] = unserialize(substr($buffer, 4));
        }
        return $format_buffer_array;
    }
895 1 0
1個回答

walkor 打賞

進程間是隔離的,進程間的變量也是隔離的。每個進程是單線程的,并且代碼是順序執(zhí)行的,沒有并發(fā)問題,不會串

  • lizuowang 2023-04-07

    多進程之間靜態(tài)屬性不是共享的嘛,不會有多個進程獲取到同一個client的情況嗎

  • walkor 2023-04-07

    多進程間變量是隔離的

  • lizuowang 2023-04-07

    哦哦哦 了解了,那同進程里的多個連接 同時拿到同一個client 這樣的情況 是什么保證網關響應不串的呢?

  • walkor 2023-04-07

    同一個進程內代碼是順序執(zhí)行的,不會并發(fā)執(zhí)行

  • lizuowang 2023-04-07

    懂了 謝謝大佬解惑

年代過于久遠,無法發(fā)表回答
??