php grpc中文文档和实例
<p>2020年10月21日15:23:53</p><p>官方文档</p>
<p>https://www.grpc.io/docs/languages/php/quickstart/</p>
<h3 id="prerequisites"><span>先决条件</span></h3>
<ul>
<li><span>PHP 5.5或更高版本,7.0或更高版本</span></li>
<li><span>PECL</span></li>
<li><span>compsoer</span></li>
<li><span>PHPUnit(可选)</span></li>
</ul>
<p>在Ubuntu / Debian上安装PHP和PECL:</p>
<p><span>对于PHP5:</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ sudo apt-get install php5 php5-dev php-pear phpunit
</code></pre>
</div>
<p><span>对于PHP7:</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ sudo apt-get install php7.0 php7.0-dev php-pear phpunit
</code></pre>
</div>
<p><span>要么</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ sudo apt-get install php php-dev php-pear phpunit
</code></pre>
</div>
<p>在CentOS / RHEL 7上安装PHP和PECL:</p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
$ sudo yum install php56w php56w-devel php-pear phpunit gcc zlib-devel
</code></pre>
</div>
<p>在Mac上安装PHP和PECL:</p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ brew install homebrew/php/php56-grpc
$ curl -O http://pear.php.net/go-pear.phar
$ sudo php -d detect_unicode=0 go-pear.phar
</code></pre>
</div>
<p>安装Composer(Linux或Mac):</p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
</code></pre>
</div>
<p>安装PHPUnit(Linux或Mac):</p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ wget https://phar.phpunit.de/phpunit-old.phar
$ chmod +x phpunit-old.phar
$ sudo mv phpunit-old.phar /usr/bin/phpunit
</code></pre>
</div>
<h3 id="install-the-grpc-php-extension"><span>安装gRPC PHP扩展</span></h3>
<p><span>有两种安装gRPC PHP扩展的方法:</span></p>
<ul>
<li><code>pecl</code></li>
<li><code>build from source</code></li>
</ul>
<h4 id="using-pecl"><span>使用PECL</span></h4>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">sudo pecl install grpc
</code></pre>
</div>
<p><span>或特定版本</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">sudo pecl install grpc-1.7.0
</code></pre>
</div>
<div class="admonition is-warning">
<div class="container">
<div class="columns is-vcentered is-variable is-8">
<div class="column is-1"> </div>
<div class="column">
<p class="title is-size-5 is-size-6-mobile"><span>警告</span></p>
<div class="content"><span>不幸的是,此步骤不适用于CentOS / RHEL6。请按照以下说明从源代码编译PECL扩展。</span></div>
</div>
</div>
</div>
</div>
<h5 id="install-on-windows"><span>在Windows上安装</span></h5>
<p><span><span>您可以从PECL</span><span>网站</span><span>下载预编译的gRPC扩展</span></span></p>
<h4 id="build-from-source-with-grpc-c-core-library"><span>使用gRPC C核心库从源代码构建</span></h4>
<p><span>在给定的发行标签处克隆该存储库</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ git clone -b v1.32.0 https://github.com/grpc/grpc
</code></pre>
</div>
<h5 id="build-and-install-the-grpc-c-core-library"><span>构建并安装gRPC C核心库</span></h5>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ cd grpc
$ git submodule update --init
$ make
$ sudo make install
</code></pre>
</div>
<h5 id="build-and-install-grpc-php-extension"><span>构建并安装gRPC PHP扩展</span></h5>
<p><span>编译gRPC PHP扩展</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ cd grpc/src/php/ext/grpc
$ phpize
$ ./configure
$ make
$ sudo make install
</code></pre>
</div>
<p><span><span>这会将gRPC PHP扩展编译并安装到标准PHP扩展目录中。</span><span>您应该能够在安装了PHP扩展的情况下运行单元测试。</span></span></p>
<h4 id="update-phpini"><span>更新php.ini</span></h4>
<p><span>安装GRPC扩展后,请确保您此行添加到您的</span><code>php.ini</code><span>文件(例如</span><code>/etc/php5/cli/php.ini</code><span>, </span><code>/etc/php5/apache2/php.ini</code><span>或</span><code>/usr/local/etc/php/5.6/php.ini</code><span>),这取决于您的PHP安装。</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">extension=grpc.so
</code></pre>
</div>
<p>将gRPC PHP库添加为Composer依赖项</p>
<p><span>您需要将此添加到项目的</span><code>composer.json</code><span>文件中。</span></p>
<div class="highlight">
<pre><code class="language-json" data-lang="json">"require": {
"grpc/grpc": "v1.7.0"
}
</code></pre>
</div>
<p><span>要使用</span><code>.proto</code><span><span>文件中</span><span>生成的存根代码运行测试</span><span>,您还需要</span></span><code>composer</code><span>和</span><code>protoc</code><span><span>二进制文件。</span><span>您可以在下面找到如何获得这些信息。</span></span></p>
<h3 id="install-other-prerequisites-for-both-mac-os-x-and-linux"><span>为Mac OS X和Linux安装其他先决条件</span></h3>
<ul>
<li><code>protoc: protobuf compiler</code></li>
<li><code>protobuf.so: protobuf runtime library</code></li>
<li><code>grpc_php_plugin: Generates PHP gRPC service interface out of Protobuf IDL</code></li>
</ul>
<h4 id="install-protobuf-compiler"><span>安装Protobuf编译器</span></h4>
<p><span>如果尚未安装,则需要</span><code>protoc</code><span><span>为当前gRPC版本</span><span>安装protobuf编译器 </span><span>3.4.0+版本(越新越好)。</span><span>如果已经安装,请确保protobuf版本与所安装的grpc版本兼容。</span><span>如果从源代码构建grpc.so,则可以检查package.xml文件中的grpc版本。</span></span></p>
<p><span>下表列出了grpc和protobuf版本之间的兼容性:</span></p>
<table style="float: left">
<thead>
<tr><th><span><span>grpc</span></span></th><th><span><span>原虫</span></span></th></tr>
</thead>
<tbody>
<tr>
<td><span><span>v1.0.0</span></span></td>
<td><span><span>3.0.0(GA)</span></span></td>
</tr>
<tr>
<td><span><span>v1.0.1</span></span></td>
<td><span><span>3.0.2</span></span></td>
</tr>
<tr>
<td><span><span>v1.1.0</span></span></td>
<td><span><span>3.1.0</span></span></td>
</tr>
<tr>
<td><span><span>v1.2.0</span></span></td>
<td><span><span>3.2.0</span></span></td>
</tr>
<tr>
<td><span><span>v1.2.0</span></span></td>
<td><span><span>3.2.0</span></span></td>
</tr>
<tr>
<td><span><span>v1.3.4</span></span></td>
<td><span><span>3.3.0</span></span></td>
</tr>
<tr>
<td><span><span>v1.3.5</span></span></td>
<td style="text-align: left"><span><span>3.2.0</span></span></td>
</tr>
<tr>
<td><span><span>v1.4.0</span></span></td>
<td><span><span>3.3.0</span></span></td>
</tr>
<tr>
<td><span><span>v1.6.0</span></span></td>
<td><span><span>3.4.0</span></span></td>
</tr>
</tbody>
</table>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p style="text-align: left"> </p>
<p style="text-align: left"> </p>
<p style="text-align: left"> </p>
<p style="text-align: left"><span>如果</span><code>protoc</code><span>尚未安装,则可以</span><code>protoc</code><span><span>从</span><span>协议缓冲区GitHub存储库</span><span>下载</span><span>二进制文件 </span></span><span><span>。</span><span>然后解压缩该文件,并更新环境变量</span></span><code>PATH</code><span><span>以包含protoc二进制文件的路径(/ protobuf / releases)。</span><span>然后解压缩该文件,并更新环境变量</span></span><code>PATH</code><span>以包括协议二进制文件的路径。</span></p>
<p style="text-align: left"><span>如果确实必须</span><code>protoc</code><span><span>从源代码进行</span><span>编译</span><span>,则可以运行以下命令,但是这样做很冒险,因为没有简便的方法可以将其卸载/升级到较新的版本。</span></span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ cd grpc/third_party/protobuf
$ ./autogen.sh && ./configure && make
$ sudo make install
</code></pre>
</div>
<h4 id="protobuf-runtime-library"><span>Protobuf运行时库</span></h4>
<p><span><span>有两个protobuf运行时库可供选择。</span><span>就提供的API而言,它们是相同的。</span><span>C实现提供更好的性能,而本机实现更易于安装。</span><span>确保已安装的protobuf版本与grpc版本兼容。</span></span></p>
<h5 id="c-implementation-for-better-performance"><span>C实现(以获得更好的性能)</span></h5>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ sudo pecl install protobuf
</code></pre>
</div>
<p><span>或特定版本</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ sudo pecl install protobuf-3.4.0
</code></pre>
</div>
<p><span>protobuf的扩展是通过添加此行到您的安装,更新后的php.ini</span><code>php.ini</code><span>文件(例如</span><code>/etc/php5/cli/php.ini</code><span>, </span><code>/etc/php5/apache2/php.ini</code><span>或</span><code>/usr/local/etc/php/5.6/php.ini</code><span>),这取决于您的PHP安装。</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">extension=protobuf.so
</code></pre>
</div>
<h5 id="php-implementation-for-easier-installation"><span>PHP实现(为了更容易安装)</span></h5>
<p><span>将此添加到您的</span><code>composer.json</code><span>文件:</span></p>
<div class="highlight">
<pre><code class="language-json" data-lang="json">"require": {
"google/protobuf": "^v3.3.0"
}
</code></pre>
</div>
<h4 id="php-protoc-plugin"><span>PHP Protoc插件</span></h4>
<p><span><span>您需要使用gRPC PHP protoc插件来生成客户端存根类。</span><span>它可以根据.proto服务定义生成服务器和客户端代码。</span></span></p>
<p><code>make</code><span><span>从此仓库的根目录</span><span>运行时,它应该已经被编译</span><span>。</span><span>插件可以在</span></span><code>bins/opt</code><span><span>目录中</span><span>找到</span><span>。</span><span>我们计划将来提供一种更好的方式来下载和安装插件。</span></span></p>
<p><span>您还可以通过运行以下命令来构建gRPC PHP protoc插件:</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ git clone -b v1.32.0 https://github.com/grpc/grpc
$ cd grpc
$ git submodule update --init
$ make grpc_php_plugin
</code></pre>
</div>
<p><span>插件可能会使用新的protobuf版本的新功能,因此也请确保安装的protobuf版本与您构建此插件的grpc版本兼容。</span></p>
<h3 id="download-the-example"><span>下载示例</span></h3>
<p><span><span>您需要示例代码的本地副本才能完成此快速入门。</span><span>从我们的GitHub存储库下载示例代码(以下命令将克隆整个存储库,但是您仅需要有关此快速入门和其他教程的示例):</span></span></p>
<p><span><span>请注意,当前,您只能在PHP中为gRPC服务创建客户端。</span><span>使用</span></span>另一种语言<span>创建gRPC服务器。</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh"># Clone the repository to get the example code:
$ git clone -b v1.32.0 https://github.com/grpc/grpc
# Build grpc_php_plugin to generate proto files if not build before
$ cd grpc && git submodule update --init && make grpc_php_plugin
# Navigate to the "hello, world" PHP example:
$ cd examples/php
$ ./greeter_proto_gen.sh
$ composer install
</code></pre>
</div>
<h3 id="run-a-grpc-application"><span>运行gRPC应用程序</span></h3>
<p><span>从</span><code>examples/node</code><span>目录:</span></p>
<ol>
<li>
<p><span>运行服务器:</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ npm install
$ cd dynamic_codegen
$ node greeter_server.js
</code></pre>
</div>
</li>
<li>
<p><span>在另一个终端的</span><code>examples/php</code><span>目录中,运行客户端:</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ ./run_greeter_client.sh
</code></pre>
</div>
</li>
</ol>
<p><span><span>恭喜你!</span><span>您刚刚使用gRPC运行了客户端服务器应用程序。</span></span></p>
<h3 id="update-a-grpc-service"><span>更新gRPC服务</span></h3>
<p><span><span>现在让我们看一下如何使用服务器上的附加方法更新应用程序,以供客户端调用。</span><span>我们的gRPC服务是使用协议缓冲区定义的;</span><span>您可以</span></span><code>.proto</code><span> 在《</span>基础教程》中<span><span>找到更多有关如何在</span><span>文件中</span><span>定义服务的信息</span><span>。</span><span>现在,您只需要知道服务器和客户端“存根”都有一个</span></span><code>SayHello</code><span>RPC方法,该方法</span><code>HelloRequest</code><span><span>从客户端</span><span>获取 </span><span>参数并</span></span><code>HelloResponse</code><span><span>从服务器</span><span>返回a </span><span>,并且该方法的定义如下:</span></span></p>
<div class="highlight">
<pre><code class="language-protobuf" data-lang="protobuf">// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
</code></pre>
</div>
<p><span>让我们对其进行更新,以便该</span><code>Greeter</code><span>服务具有两种方法。</span><code>examples/protos/helloworld.proto</code><span>使用</span><code>SayHelloAgain</code><span><span> 具有相同请求和响应类型</span><span>的新</span><span>方法来</span><span>编辑 </span><span>和更新它</span><span>:</span></span></p>
<div class="highlight">
<pre><code class="language-protobuf" data-lang="protobuf">// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
// Sends another greeting
rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
</code></pre>
</div>
<p><span>记住要保存文件!</span></p>
<h3 id="generate-grpc-code"><span>生成gRPC代码</span></h3>
<p><span><span>接下来,我们需要更新应用程序使用的gRPC代码以使用新的服务定义。</span><span>从</span></span><code>grpc</code><span>根目录:</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ protoc --proto_path=examples/protos \
--php_out=examples/php \
--grpc_out=examples/php \
--plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin \
./examples/protos/helloworld.proto
</code></pre>
</div>
<p><span>或在</span><code>grpc/example/php</code><span><span>目录</span><span>下运行帮助程序脚本(</span><span>如果您通过源代码构建grpc-php-plugin):</span></span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ ./greeter_proto_gen.sh
</code></pre>
</div>
<p><span>这将重新生成protobuf文件,其中包含我们生成的客户端类,以及用于填充,序列化和检索我们的请求和响应类型的类。</span></p>
<h3 id="update-and-run-the-application"><span>更新并运行应用程序</span></h3>
<p><span>现在,我们有了新生成的客户代码,但是仍然需要在示例应用程序的人工编写部分中实现并调用新方法。</span></p>
<h4 id="update-the-server"><span>更新服务器</span></h4>
<p><span>在同一目录中,打开</span><code>greeter_server.js</code><span><span>。</span><span>像这样实现新方法:</span></span></p>
<div class="highlight">
<pre><code class="language-js" data-lang="js">function sayHello(call, callback) {
callback(null, {message: 'Hello ' + call.request.name});
}
function sayHelloAgain(call, callback) {
callback(null, {message: 'Hello again, ' + call.request.name});
}
function main() {
var server = new grpc.Server();
server.addProtoService(hello_proto.Greeter.service,
{sayHello: sayHello, sayHelloAgain: sayHelloAgain});
server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
server.start();
}
...
</code></pre>
</div>
<h4 id="update-the-client"><span>更新客户端</span></h4>
<p><span>在同一目录中,打开</span><code>greeter_client.php</code><span><span>。</span><span>像这样调用新方法:</span></span></p>
<div class="highlight">
<pre><code class="language-php" data-lang="php">$request = new Helloworld\HelloRequest();
$request->setName($name);
list($reply, $status) = $client->SayHello($request)->wait();
$message = $reply->getMessage();
list($reply, $status) = $client->SayHelloAgain($request)->wait();
$message = $reply->getMessage();<br><br><br></code><span style="font-family: monospace">运行</span>!</pre>
</div>
<p><span>就像我们之前所做的那样,从</span><code>examples/node/dynamic_codegen</code><span>目录:</span></p>
<ol>
<li>
<p><span>运行服务器:</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ node greeter_server.js
</code></pre>
</div>
</li>
<li>
<p><span>在另一个终端的</span><code>examples/php</code><span>目录中,运行客户端:</span></p>
<div class="highlight">
<pre><code class="language-sh" data-lang="sh">$ ./run_greeter_client.sh</code></pre>
</div>
</li>
</ol>
</div>
<div id="MySignature" role="contentinfo">
QQ一群 <span style="color: red">247823727 </span><br>
QQ二群 <span style="color: red">166427999 </span><br>
<span style="color: #FF4000">如果项目有技术瓶颈问题</span>,请联系↓↓<br>
QQ:
<span style="color: red">903464207</span><br>
微信:
<span style="color: red">zx903464207</span><br><br><br>
来源:https://www.cnblogs.com/zx-admin/p/13852609.html
頁:
[1]