PHP hello world example first draft
diff --git a/php/.gitignore b/php/.gitignore
new file mode 100644
index 0000000..d8a7996
--- /dev/null
+++ b/php/.gitignore
@@ -0,0 +1,2 @@
+composer.lock
+vendor/
diff --git a/php/README.md b/php/README.md
new file mode 100644
index 0000000..4c2e6f1
--- /dev/null
+++ b/php/README.md
@@ -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
diff --git a/php/composer.json b/php/composer.json
new file mode 100644
index 0000000..2deca5f
--- /dev/null
+++ b/php/composer.json
@@ -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"
+  }
+}
diff --git a/php/greeter_client.php b/php/greeter_client.php
new file mode 100644
index 0000000..8eeceb3
--- /dev/null
+++ b/php/greeter_client.php
@@ -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");
diff --git a/php/helloworld.php b/php/helloworld.php
new file mode 100644
index 0000000..22da3d3
--- /dev/null
+++ b/php/helloworld.php
@@ -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);
+    }
+  }
+}
diff --git a/php/helloworld.proto b/php/helloworld.proto
new file mode 100644
index 0000000..ad8f7a1
--- /dev/null
+++ b/php/helloworld.proto
@@ -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;
+}