php instalar protobuf, instalar la extensión gRPC, habilitar GMP (función matemática)

Cuando entré por primera vez en contacto con la base de datos, estaba pensando en una pregunta: si la cantidad de datos es enorme, ¿existe alguna herramienta mágica para el almacenamiento e interpretación de datos que pueda ayudarme? Cuando crecí, aprendí que había un artefacto de código abierto llamado protobuf en Google. Cuando lo supe por primera vez, todavía estaba aturdido. ¿Que es esto? ¿Cuál es el beneficio? ¿Cómo instalarlo? ¿Cómo usarlo? , Este artículo responde principalmente a estas preguntas.

Basándome en el hecho de que he verificado mucha información, la mayor parte de la información es copiada y copiada, no tengo más remedio que resumirla yo mismo.

¿Qué es protobuf y cómo surgió?

En pocas palabras, está haciendo lo mismo que xml, almacenando la información de una determinada estructura de datos en un formato determinado. Se utiliza principalmente para almacenamiento de datos, formato de protocolo de transmisión y otras ocasiones.

Respuesta profesional: 
Protocol Buffers es un formato de almacenamiento de datos estructurado ligero y eficiente, que se puede utilizar para la serialización de datos estructurados y es muy adecuado para el almacenamiento de datos o el formato de intercambio de datos RPC. Se puede utilizar para formatos de datos estructurados serializados extensibles, independientes del lenguaje, independientes de la plataforma en protocolos de comunicación, almacenamiento de datos y otros campos.

Algunos compañeros simplemente preguntaron, ¿por qué no construyes ruedas y creas un protobuf si ya tienes xml? .

La causa principal sigue siendo: el rendimiento de XML no es bueno.

1. Dimensión de tiempo: la sobrecarga del formato xml (serialización) es buena, pero la sobrecarga del análisis de XML (deserialización) está bien. 
2. Dimensión espacial: para tener una mejor legibilidad, el formato XML introduce información de texto redundante, por lo que la sobrecarga de espacio no es muy buena.

Esto es insoportable para la gran cantidad de Google. Debe ser un rendimiento mejor que xml.

¿Cuáles son los beneficios de protobuf?

1. El rendimiento de serialización y deserialización de la estructura de datos es mejor que el de xml 
2. Mecanismo de generación de código, que es muy conveniente de usar (mencionado más adelante) 
3. Se utilizan proyectos estrella: se entiende que Google, Sina, Meipai, Se usa Protobuf, por lo que ciertamente no está mal pasar al proyecto.

¿Cómo instalar protobuf?

Instalar protobuf

protobuf
wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz

 

 

 

 

Puede ver el siguiente proceso de instalación:

su raíz

wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
 
tar zxvf protobuf-2.6.1.tar.gz
 
cd protobuf-2.6.1 /
 
./ configure --prefix = / usr / local / protobuf
 
make && make install
 
export PATH = / usr / local / protobuf / bin: $ PATH
 
protocol --version

 

A continuación, instale la extensión protobuf de php:

 

 

 

sudo vim /etc/php/7.2/mods-available/protobuf.ini 添加 extensión = protobuf.so

Reiniciar php

¡Puede ver una instalación exitosa!

Luego ingrese la dependencia de instalación:

 

Cree el archivo cbstest.proto:

 

message Person {     nombre de la cadena requerida = 1;     requerido int32 id = 2;     correo electrónico de cadena opcional = 3;     dinero doble opcional = 4; }




Ejecute el comando php ./protoc-gen-php.php cbstest.proto:

Puede ver que el archivo Person.php se genera en el directorio

<? php
/ **
 * Generado automáticamente a partir de cbstest.proto el 2021-03-05 04:02:43
 * /

espacio de nombres { / **  * Mensaje de persona  * / clase Persona amplía \ ProtobufMessage {     / * Constantes de índice de campo * /     const NAME = 1;     ID constante = 2;     const EMAIL = 3;     DINERO constante = 4;









    / * @var array Descriptores de campo * /
    protected static $ fields = array (
        self :: NAME => array (
            'name' => 'name',
            'required' => true,
            'type' => \ ProtobufMessage :: PB_TYPE_STRING ,
        ),
        self :: ID => array (
            'nombre' => 'id',
            'required' => true,
            'type' => \ ProtobufMessage :: PB_TYPE_INT,
        ),
        self :: EMAIL => array (
            'nombre '=>' email ',
            ' required '=> false,
            ' type '=> \ ProtobufMessage :: PB_TYPE_STRING,
        ),
        self :: DINERO => array (
            'nombre' => 'dinero',
            'requerido' => falso,
            'tipo' => \ ProtobufMessage :: PB_TYPE_DOUBLE,
        ),
    );

    / **
     * Construye un nuevo contenedor de mensajes y borra su estado interno
     * /
    función pública __construct ()
    {         $ this-> reset ();     }

    / **
     * Borra los valores de los mensajes y establece los predeterminados
     *
     * @return null
     * /
    public function reset ()
    {         $ this-> values ​​[self :: NAME] = null;         $ esto-> valores [self :: ID] = null;         $ esto-> valores [self :: EMAIL] = null;         $ esto-> valores [self :: DINERO] = nulo;     }




    / **
     * Devuelve descriptores de campo
     *
     * @return array
     * /
    public function fields ()
    {         return self :: $ fields;     }

    / **
     * Establece el valor de la propiedad 'nombre'
     *
     * @param string $ value Valor de la propiedad
     *
     * @return null
     * /
    función pública setName ($ value)
    {         return $ this-> set (self :: NAME, $ value) ;     }

    / **
     * Devuelve el valor de la propiedad 'nombre'
     *
     * @return string
     * /
    public function getName ()
    {         $ value = $ this-> get (self :: NAME);         devolver $ valor === nulo? (cadena) $ valor: $ valor;     }


    / **
     * Devuelve verdadero si se establece la propiedad 'nombre', falso en caso contrario
     *
     * @return boolean
     * /
    función pública hasName ()
    {         return $ this-> get (self :: NAME)! == null;     }

    / **
     * Establece el valor de la propiedad 'id'
     *
     * @param integer $ value Valor de la propiedad
     *
     * @return null
     * /
    public function setId ($ value)
    {         return $ this-> set (self :: ID, $ value) ;     }

    / **
     * Devuelve el valor de la propiedad 'id'
     *
     * @return integer
     * /
    public function getId ()
    {         $ value = $ this-> get (self :: ID);         devolver $ valor === nulo? (entero) $ valor: $ valor;     }


    / **
     * Devuelve verdadero si se establece la propiedad 'id', falso en caso contrario
     *
     * @return boolean
     * /
    public function hasId ()
    {         return $ this-> get (self :: ID)! == null;     }

    / **
     * Establece el valor de la propiedad 'email'
     *
     * @param string $ value Valor de la propiedad
     *
     * @return null
     * /
    public function setEmail ($ value)
    {         return $ this-> set (self :: EMAIL, $ value) ;     }

    / **
     * Devuelve el valor de la propiedad 'email'
     *
     * @return string
     * /
    public function getEmail ()
    {         $ value = $ this-> get (self :: EMAIL);         devolver $ valor === nulo? (cadena) $ valor: $ valor;     }


    / **
     * Devuelve verdadero si se establece la propiedad 'email', falso en caso contrario
     *
     * @return boolean
     * /
    public function hasEmail ()
    {         return $ this-> get (self :: EMAIL)! == null;     }

    / **
     * Establece el valor de la propiedad 'dinero'
     *
     * @param double $ value Valor de la propiedad
     *
     * @return null
     * /
    función pública setMoney ($ value)
    {         return $ this-> set (self :: MONEY, $ value) ;     }

    / **
     * Devuelve el valor de la propiedad 'dinero'
     *
     * @return double
     * /
    public function getMoney ()
    {         $ value = $ this-> get (self :: MONEY);         devolver $ valor === nulo? (doble) $ valor: $ valor;     }


    / **
     * Devuelve verdadero si se establece la propiedad 'dinero', falso en caso contrario
     *
     * @return boolean
     * /
    función pública hasMoney ()
    {         return $ this-> get (self :: MONEY)! == null;     } } }



 

Luego escribimos un archivo de prueba: test.php:

 

 Después de guardar, lo ejecutamos:

 

 

Puede ver cada valor obtenido después de la serialización. ¡Esto puede ser conveniente de usar en rpc!

Instala grpc por cierto

sudo pecl instalar grpc

Compile todo el tiempo y espere hasta el final, verá:

En este momento, agregue grpc.so a php.ini y reinicie php

¡Puedes ver que se genera la extensión!

Más adelante hablaremos sobre el uso de grpc

Función matemática gmp, la extensión gmp debe estar instalada cuando se usa:

 

sudo apt-get install php7.2-gmp

Reiniciar después de la instalación

 

La función matemática gmp se usará cuando se use grpc para hacer la cadena de bloques más adelante.

Supongo que te gusta

Origin blog.csdn.net/lchmyhua88/article/details/114393471
Recomendado
Clasificación