mirror of https://github.com/grpc/grpc.git
parent
db7f5226d5
commit
f8401a757c
23 changed files with 525 additions and 103 deletions
@ -0,0 +1,2 @@ |
|||||||
|
composer.lock |
||||||
|
vendor/ |
@ -0,0 +1,84 @@ |
|||||||
|
gRPC in 3 minutes (PHP) |
||||||
|
=========================== |
||||||
|
|
||||||
|
PREREQUISITES |
||||||
|
------------- |
||||||
|
|
||||||
|
This requires PHP 5.5 or greater. |
||||||
|
|
||||||
|
INSTALL |
||||||
|
------- |
||||||
|
|
||||||
|
- Clone this repository |
||||||
|
|
||||||
|
```sh |
||||||
|
$ git clone https://github.com/grpc/grpc-common.git |
||||||
|
``` |
||||||
|
|
||||||
|
- Install Protobuf-PHP |
||||||
|
|
||||||
|
``` |
||||||
|
$ git clone https://github.com/murgatroid99/Protobuf-PHP.git |
||||||
|
$ cd Protobuf-PHP |
||||||
|
$ rake pear:package version=1.0 |
||||||
|
$ pear install Protobuf-1.0.tgz |
||||||
|
``` |
||||||
|
|
||||||
|
- Install composer |
||||||
|
|
||||||
|
``` |
||||||
|
$ cd grpc-common/php |
||||||
|
$ curl -sS https://getcomposer.org/installer | php |
||||||
|
``` |
||||||
|
|
||||||
|
- (Coming soon) Download the gRPC PECL extension |
||||||
|
|
||||||
|
``` |
||||||
|
Coming soon |
||||||
|
``` |
||||||
|
|
||||||
|
- (Temporary workaround) Compile gRPC extension from source |
||||||
|
|
||||||
|
``` |
||||||
|
$ git clone https://github.com/grpc/grpc.git |
||||||
|
$ cd grpc |
||||||
|
$ git checkout --track origin/release-0_9 |
||||||
|
$ git pull --recurse-submodules && git submodule update --init --recursive |
||||||
|
$ cd third_party/protobuf |
||||||
|
$ ./autogen.sh && ./configure --prefix=/usr && make && make install |
||||||
|
$ cd ../.. |
||||||
|
$ make && make install |
||||||
|
$ cd src/php/ext/grpc |
||||||
|
$ phpize && ./configure && make && make install |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
TRY IT! |
||||||
|
------- |
||||||
|
|
||||||
|
- Run the server |
||||||
|
|
||||||
|
Please follow the instruction in [Node](https://github.com/grpc/grpc-common/tree/master/node) to run the server |
||||||
|
``` |
||||||
|
$ cd grpc-common/node |
||||||
|
$ nodejs greeter_server.js |
||||||
|
``` |
||||||
|
|
||||||
|
- Run the client |
||||||
|
|
||||||
|
``` |
||||||
|
$ cd grpc-common/php |
||||||
|
$ php composer.phar install |
||||||
|
$ php -d extension=grpc.so greeter_client.php |
||||||
|
``` |
||||||
|
|
||||||
|
NOTE |
||||||
|
---- |
||||||
|
|
||||||
|
This directory has a copy of `helloworld.proto` because it currently depends on |
||||||
|
some Protocol Buffer 2.0 syntax. There is no proto3 support for PHP yet. |
||||||
|
|
||||||
|
TUTORIAL |
||||||
|
-------- |
||||||
|
|
||||||
|
Coming soon |
@ -0,0 +1,9 @@ |
|||||||
|
{ |
||||||
|
"name": "grpc/grpc-demo", |
||||||
|
"description": "gRPC example for PHP", |
||||||
|
"minimum-stability": "dev", |
||||||
|
"require": { |
||||||
|
"php": ">=5.5.0", |
||||||
|
"grpc/grpc": "dev-master" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
<?php |
||||||
|
/* |
||||||
|
* |
||||||
|
* Copyright 2015, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
require 'DrSlump/Protobuf.php'; |
||||||
|
\DrSlump\Protobuf::autoload(); |
||||||
|
require 'vendor/autoload.php'; |
||||||
|
require 'helloworld.php'; |
||||||
|
|
||||||
|
function greet($name) { |
||||||
|
$client = new helloworld\GreeterClient( |
||||||
|
new Grpc\BaseStub('localhost:50051', [])); |
||||||
|
$request = new helloworld\HelloRequest(); |
||||||
|
$request->setName($name); |
||||||
|
list($reply, $status) = $client->SayHello($request)->wait(); |
||||||
|
$message = $reply->getMessage(); |
||||||
|
return $message; |
||||||
|
} |
||||||
|
|
||||||
|
$name = !empty($argv[1]) ? $argv[1] : 'world'; |
||||||
|
print(greet($name)."\n"); |
@ -0,0 +1,160 @@ |
|||||||
|
<?php |
||||||
|
// DO NOT EDIT! Generated by Protobuf-PHP protoc plugin 1.0 |
||||||
|
// Source: helloworld.proto |
||||||
|
// Date: 2015-05-29 21:39:19 |
||||||
|
|
||||||
|
namespace helloworld { |
||||||
|
|
||||||
|
class HelloRequest extends \DrSlump\Protobuf\Message { |
||||||
|
|
||||||
|
/** @var string */ |
||||||
|
public $name = null; |
||||||
|
|
||||||
|
|
||||||
|
/** @var \Closure[] */ |
||||||
|
protected static $__extensions = array(); |
||||||
|
|
||||||
|
public static function descriptor() |
||||||
|
{ |
||||||
|
$descriptor = new \DrSlump\Protobuf\Descriptor(__CLASS__, 'helloworld.HelloRequest'); |
||||||
|
|
||||||
|
// OPTIONAL STRING name = 1 |
||||||
|
$f = new \DrSlump\Protobuf\Field(); |
||||||
|
$f->number = 1; |
||||||
|
$f->name = "name"; |
||||||
|
$f->type = \DrSlump\Protobuf::TYPE_STRING; |
||||||
|
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; |
||||||
|
$descriptor->addField($f); |
||||||
|
|
||||||
|
foreach (self::$__extensions as $cb) { |
||||||
|
$descriptor->addField($cb(), true); |
||||||
|
} |
||||||
|
|
||||||
|
return $descriptor; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check if <name> has a value |
||||||
|
* |
||||||
|
* @return boolean |
||||||
|
*/ |
||||||
|
public function hasName(){ |
||||||
|
return $this->_has(1); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Clear <name> value |
||||||
|
* |
||||||
|
* @return \helloworld\HelloRequest |
||||||
|
*/ |
||||||
|
public function clearName(){ |
||||||
|
return $this->_clear(1); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get <name> value |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getName(){ |
||||||
|
return $this->_get(1); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set <name> value |
||||||
|
* |
||||||
|
* @param string $value |
||||||
|
* @return \helloworld\HelloRequest |
||||||
|
*/ |
||||||
|
public function setName( $value){ |
||||||
|
return $this->_set(1, $value); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
namespace helloworld { |
||||||
|
|
||||||
|
class HelloReply extends \DrSlump\Protobuf\Message { |
||||||
|
|
||||||
|
/** @var string */ |
||||||
|
public $message = null; |
||||||
|
|
||||||
|
|
||||||
|
/** @var \Closure[] */ |
||||||
|
protected static $__extensions = array(); |
||||||
|
|
||||||
|
public static function descriptor() |
||||||
|
{ |
||||||
|
$descriptor = new \DrSlump\Protobuf\Descriptor(__CLASS__, 'helloworld.HelloReply'); |
||||||
|
|
||||||
|
// OPTIONAL STRING message = 1 |
||||||
|
$f = new \DrSlump\Protobuf\Field(); |
||||||
|
$f->number = 1; |
||||||
|
$f->name = "message"; |
||||||
|
$f->type = \DrSlump\Protobuf::TYPE_STRING; |
||||||
|
$f->rule = \DrSlump\Protobuf::RULE_OPTIONAL; |
||||||
|
$descriptor->addField($f); |
||||||
|
|
||||||
|
foreach (self::$__extensions as $cb) { |
||||||
|
$descriptor->addField($cb(), true); |
||||||
|
} |
||||||
|
|
||||||
|
return $descriptor; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check if <message> has a value |
||||||
|
* |
||||||
|
* @return boolean |
||||||
|
*/ |
||||||
|
public function hasMessage(){ |
||||||
|
return $this->_has(1); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Clear <message> value |
||||||
|
* |
||||||
|
* @return \helloworld\HelloReply |
||||||
|
*/ |
||||||
|
public function clearMessage(){ |
||||||
|
return $this->_clear(1); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get <message> value |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getMessage(){ |
||||||
|
return $this->_get(1); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set <message> value |
||||||
|
* |
||||||
|
* @param string $value |
||||||
|
* @return \helloworld\HelloReply |
||||||
|
*/ |
||||||
|
public function setMessage( $value){ |
||||||
|
return $this->_set(1, $value); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
namespace helloworld { |
||||||
|
|
||||||
|
class GreeterClient{ |
||||||
|
|
||||||
|
private $rpc_impl; |
||||||
|
|
||||||
|
public function __construct($rpc_impl) { |
||||||
|
$this->rpc_impl = $rpc_impl; |
||||||
|
} |
||||||
|
/** |
||||||
|
* @param helloworld\HelloRequest $input |
||||||
|
*/ |
||||||
|
public function SayHello(\helloworld\HelloRequest $argument, $metadata = array()) { |
||||||
|
return $this->rpc_impl->_simpleRequest('/helloworld.Greeter/SayHello', $argument, '\helloworld\HelloReply::deserialize', $metadata); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,50 @@ |
|||||||
|
// Copyright 2015, Google Inc. |
||||||
|
// All rights reserved. |
||||||
|
// |
||||||
|
// Redistribution and use in source and binary forms, with or without |
||||||
|
// modification, are permitted provided that the following conditions are |
||||||
|
// met: |
||||||
|
// |
||||||
|
// * Redistributions of source code must retain the above copyright |
||||||
|
// notice, this list of conditions and the following disclaimer. |
||||||
|
// * Redistributions in binary form must reproduce the above |
||||||
|
// copyright notice, this list of conditions and the following disclaimer |
||||||
|
// in the documentation and/or other materials provided with the |
||||||
|
// distribution. |
||||||
|
// * Neither the name of Google Inc. nor the names of its |
||||||
|
// contributors may be used to endorse or promote products derived from |
||||||
|
// this software without specific prior written permission. |
||||||
|
// |
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
syntax = "proto2"; |
||||||
|
|
||||||
|
option java_package = "ex.grpc"; |
||||||
|
|
||||||
|
package helloworld; |
||||||
|
|
||||||
|
// The greeting service definition. |
||||||
|
service Greeter { |
||||||
|
// Sends a greeting |
||||||
|
rpc SayHello (HelloRequest) returns (HelloReply) {} |
||||||
|
} |
||||||
|
|
||||||
|
// The request message containing the user's name. |
||||||
|
message HelloRequest { |
||||||
|
optional string name = 1; |
||||||
|
} |
||||||
|
|
||||||
|
// The response message containing the greetings |
||||||
|
message HelloReply { |
||||||
|
optional string message = 1; |
||||||
|
} |
Loading…
Reference in new issue