#Overview This directory contains source code for PHP implementation of gRPC layered on shared C library. ## Environment **Prerequisite:** * `php` 5.5 or above, 7.0 or above * `pecl` * `composer` * `phpunit` (optional) **Ubuntu/Debian:** ```sh $ sudo apt-get install php5 php5-dev ``` **PEAR/PECL:** ```sh $ curl -O http://pear.php.net/go-pear.phar $ sudo php -d detect_unicode=0 go-pear.phar ``` **Composer:** ```sh $ curl -sS https://getcomposer.org/installer | php $ sudo mv composer.phar /usr/local/bin/composer ``` **PHPUnit:** ```sh $ wget https://phar.phpunit.de/phpunit-old.phar $ chmod +x phpunit-old.phar $ sudo mv phpunit-old.phar /usr/bin/phpunit ``` ## Quick Install **Install the gRPC PHP extension** ```sh sudo pecl install grpc ``` This will compile and install the gRPC PHP extension into the standard PHP extension directory. You should be able to run the [unit tests](#unit-tests), with the PHP extension installed. **Add the gRPC PHP library as a Composer dependency** You need to add this to your project's `composer.json` file. ``` "require": { "grpc/grpc": "v1.0.0" } ``` To run tests with generated stub code from `.proto` files, you will also need the `composer` and `protoc` binaries. You can find out how to get these [below](#generated-code-tests). ## Build from Source ### gRPC C core library Clone this repository ```sh $ git clone -b $(curl -L http://grpc.io/release) https://github.com/grpc/grpc ``` Build and install the gRPC C core library ```sh $ cd grpc $ git pull --recurse-submodules && git submodule update --init --recursive $ make $ sudo make install ``` ### gRPC PHP extension Compile the gRPC PHP extension ```sh $ cd grpc/src/php/ext/grpc $ phpize $ ./configure $ make $ sudo make install ``` ### Update php.ini Add this line to your `php.ini` file, e.g. `/etc/php5/cli/php.ini` ```sh extension=grpc.so ``` ## Unit Tests You will need the source code to run tests ```sh $ git clone -b $(curl -L http://grpc.io/release) https://github.com/grpc/grpc $ cd grpc $ git pull --recurse-submodules && git submodule update --init --recursive ``` Run unit tests ```sh $ cd grpc/src/php $ ./bin/run_tests.sh ``` ## Generated Code Tests This section specifies the prerequisites for running the generated code tests, as well as how to run the tests themselves. ### Composer Install the runtime dependencies via `composer install`. ```sh $ cd grpc/src/php $ composer install ``` ### Protobuf compiler Again if you don't have it already, you need to install the protobuf compiler `protoc`, version 3.1.0+. If `protoc` hasn't been installed, you can download the `protoc` binaries from [the protocol buffers Github repository](https://github.com/google/protobuf/releases). If you really must compile `protoc` from source, you can run the following commands, but this is risky because there is no easy way to uninstall / upgrade to a newer release. ```sh $ cd grpc/third_party/protobuf $ ./autogen.sh && ./configure && make $ sudo make install ``` ### PHP Protoc Plugin You need the gRPC PHP protoc plugin to generate the client stub classes. It should already been compiled when you run `make` from the root directory of this repo. The plugin can be found in the `bins/opt` directory. We are planning to provide a better way to download and install the plugin in the future. ### Client Stub Generate client stub classes from `.proto` files ```sh $ cd grpc/src/php $ ./bin/generate_proto_php.sh ``` ### Run test server Run a local server serving the math services. Please see [Node][] for how to run an example server. ```sh $ cd grpc $ npm install $ node src/node/test/math/math_server.js ``` ### Run test client Run the generated code tests ```sh $ cd grpc/src/php $ ./bin/run_gen_code_test.sh ``` ## Use the gRPC PHP extension with Apache Install `apache2`, in addition to `php5` above ```sh $ sudo apt-get install apache2 ``` Add this line to your `php.ini` file, e.g. `/etc/php5/apache2/php.ini` ```sh extension=grpc.so ``` Restart apache ```sh $ sudo service apache2 restart ``` Make sure the Node math server is still running, as above. ```sh $ cd grpc $ npm install $ node src/node/test/math/math_server.js ``` Make sure you have run `composer install` to generate the `vendor/autoload.php` file ```sh $ cd grpc/src/php $ composer install ``` Make sure you have generated the client stub `math.php` ```sh $ ./bin/generate_proto_php.sh ``` Copy the `math_client.php` file into your Apache document root, e.g. ```sh $ cp tests/generated_code/math_client.php /var/www/html ``` You may have to fix the first two lines to point the includes to your installation: ```php include 'vendor/autoload.php'; include 'tests/generated_code/math.php'; ``` Connect to `localhost/math_client.php` in your browser, or run this from command line: ```sh $ curl localhost/math_client.php ``` ## Use the gRPC PHP extension with Nginx/PHP-FPM Install `nginx` and `php5-fpm`, in addition to `php5` above ```sh $ sudo apt-get install nginx php5-fpm ``` Add this line to your `php.ini` file, e.g. `/etc/php5/fpm/php.ini` ```sh extension=grpc.so ``` Uncomment the following lines in your `/etc/nginx/sites-available/default` file: ``` location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php5-fpm.sock; } ``` Restart nginx and php-fpm ```sh $ sudo service nginx restart $ sudo service php5-fpm restart ``` Make sure the Node math server is still running, as above. ```sh $ cd grpc $ npm install $ node src/node/test/math/math_server.js ``` Make sure you have run `composer install` to generate the `vendor/autoload.php` file ```sh $ cd grpc/src/php $ composer install ``` Make sure you have generated the client stub `math.php` ```sh $ ./bin/generate_proto_php.sh ``` Copy the `math_client.php` file into your Nginx document root, e.g. ```sh $ cp tests/generated_code/math_client.php /var/www/html ``` You may have to fix the first two lines to point the includes to your installation: ```php include 'vendor/autoload.php'; include 'tests/generated_code/math.php'; ``` Connect to `localhost/math_client.php` in your browser, or run this from command line: ```sh $ curl localhost/math_client.php ``` [Node]:https://github.com/grpc/grpc/tree/master/src/node/examples