ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
参考 `https://github.com/protobuf-php/protobuf` ### 安装Protobuf扩展 到PECL上下载protobuf代码,编译安装 下载地址:https://pecl.php.net/package/protobuf ``` [root@api ~]# mkdir package [root@api ~]# cd package [root@api package]# wget https://pecl.php.net/get/protobuf-3.7.0.tgz [root@api package]# tar xvf protobuf-3.7.0.tgz [root@api package]# cd protobuf-3.7.0 [root@api protobuf-3.7.0]# phpize [root@api protobuf-3.7.0]# ./configure [root@api protobuf-3.7.0]# make && make install ``` ### 安装Protobuf编译器 ``` [root@api addressbook]# yum install protobuf-compiler ``` 然后修改php.ini启用 protobuf扩展,重启php-fpm。用命令行`php -m`或者用`phpinfo()`函数查看扩展是否已经启用。 ### 创建测试项目 我们把测试项目创建在`/data/code/addressbook`中 ``` [root@api protobuf-3.7.0]# mkdir -p /data/code/addressbook [root@api protobuf-3.7.0]# cd /data/code/addressbook [root@api addressbook]# composer require protobuf-php/protobuf [root@api addressbook]# vim composer.json { "require": { "protobuf-php/protobuf": "^0.1.3" }, "autoload": { "psr-4": { "Tutorial\\": "src/Tutorial/" } } } [root@api addressbook]# mkdir src [root@api addressbook]# composer require "protobuf-php/protobuf-plugin" [root@api addressbook]# vim addressbook.proto ``` addressbook.proto写入如下内容: ``` package tutorial; import "php.proto"; option (php.package) = "Tutorial.AddressBookProtos"; message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } message AddressBook { repeated Person person = 1; } ``` 开始编译,生成PHP类库 ``` [root@api addressbook]# php ./vendor/bin/protobuf --include-descriptors -i . -o ./src/ ./addressbook.proto PHP classes successfully generate. ``` 创建命令程序 ``` [root@api addressbook]# touch addressbook [root@api addressbook]# chmod +x addressbook [root@api addressbook]# vim addressbook ``` 写入如下内容: ``` #!/usr/bin/env php <?php include 'vendor/autoload.php'; use Tutorial\AddressBookProtos\Person; use Tutorial\AddressBookProtos\AddressBook; // Read the existing address book or create a new one. $addressBook = is_file($argv[1]) ? new AddressBook(file_get_contents($argv[1])) : new AddressBook(); $person = new Person(); $id = intval(readline("Enter person ID: ")); $name = trim(readline("Enter person name: ")); $email = trim(readline("Enter email address (blank for none): ")); $person->setId($id); $person->setName($name); if ( ! empty($email)) { $person->setEmail($email); } while (true) { $number = trim(readline("Enter a phone number (or leave blank to finish):")); if (empty($number)) { break; } $phone = new Person\PhoneNumber(); $type = trim(readline("Is this a mobile, home, or work phone? ")); switch (strtolower($type)) { case 'mobile': $phone->setType(Person\PhoneType::MOBILE()); break; case 'work': $phone->setType(Person\PhoneType::WORK()); break; case 'home': $phone->setType(Person\PhoneType::HOME()); break; default: echo "Unknown phone type. Using default." . PHP_EOL; } $phone->setNumber($number); $person->addPhone($phone); } // Add a person. $addressBook->addPerson($person); // Print current address book echo $addressBook; // Write the new address book back to disk. file_put_contents($argv[1], $addressBook->toStream()); ``` 程序创建完毕,测试执行: ``` [root@api protobuf]# ./addressbook address.book Enter person ID: 1 Enter person name: Yang Wenjie Enter email address (blank for none): 13923458160 Enter a phone number (or leave blank to finish):0755-88889999 Is this a mobile, home, or work phone? home [root@api protobuf]# ./addressbook address.book Enter person ID: 1 Enter person name: Yang Wenjie Enter email address (blank for none): 8162782@qq.com Enter a phone number (or leave blank to finish):13923458160 Is this a mobile, home, or work phone? mobile Enter a phone number (or leave blank to finish):0755-99998888 Is this a mobile, home, or work phone? work Enter a phone number (or leave blank to finish):0755-99990000 Is this a mobile, home, or work phone? home Enter a phone number (or leave blank to finish): person { name: "Yang Wenjie" id: 1 email: "8162782@qq.com" phone { number: "13923458160" type: MOBILE } phone { number: "0755-99998888" type: WORK } phone { number: "0755-99990000" type: HOME } } [root@api protobuf]# ``` 程序在当前目录下输出了address.book二进制文件保存数据。