| # Overview | |
| This directory contains source code for PHP implementation of gRPC layered on | |
| shared C library. The same installation guides with more examples and | |
| tutorials can be seen at [grpc.io](https://grpc.io/docs/languages/php/quickstart). | |
| gRPC PHP installation instructions for Google Cloud Platform is in | |
| [cloud.google.com](https://cloud.google.com/php/grpc). | |
| ## Environment | |
| ### Prerequisites | |
| * `php`: version 7.0 or above (PHP 5.x support is deprecated from Sep 2020). | |
| * `pecl` | |
| * `composer` | |
| * `phpunit` (optional) | |
| ## Install the _grpc_ extension | |
| There are two ways to install the `grpc` extension. | |
| * Via `pecl` | |
| * Build from source | |
| ### Install from PECL | |
| ```sh | |
| $ [sudo] pecl install grpc | |
| ``` | |
| or specific version | |
| ```sh | |
| $ [sudo] pecl install grpc-1.30.0 | |
| ``` | |
| Please make sure your `gcc` version satisfies the minimum requirement as | |
| specified [here](https://grpc.io/docs/languages/#official-support). | |
| ### Install on Windows | |
| You can download the pre-compiled `grpc.dll` extension from the PECL | |
| [website](https://pecl.php.net/package/grpc). | |
| ### Build from source | |
| Clone this repository at the [latest stable release tag](https://github.com/grpc/grpc/releases). | |
| ```sh | |
| $ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc | |
| $ cd grpc | |
| ``` | |
| #### Build the gRPC C core library | |
| ```sh | |
| $ git submodule update --init | |
| $ EXTRA_DEFINES=GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK make | |
| ``` | |
| #### Build and install the `grpc` extension | |
| Compile the `grpc` extension from source | |
| ```sh | |
| $ grpc_root="$(pwd)" | |
| $ cd src/php/ext/grpc | |
| $ phpize | |
| $ GRPC_LIB_SUBDIR=libs/opt ./configure --enable-grpc="${grpc_root}" | |
| $ make | |
| $ [sudo] make install | |
| ``` | |
| This will compile and install the `grpc` extension into the | |
| standard PHP extension directory. You should be able to run | |
| the [unit tests](#unit-tests), with the `grpc` extension installed. | |
| ### Update php.ini | |
| After installing the `grpc` extension, make sure you add this line to your | |
| `php.ini` file, depending on where your PHP installation is, to enable the | |
| `grpc` extension. | |
| ```sh | |
| extension=grpc.so | |
| ``` | |
| ## Composer package | |
| In addition to the `grpc` extension, you will need to install the `grpc/grpc` | |
| composer package as well. Add this to your project's `composer.json` file. | |
| ```json | |
| "require": { | |
| "grpc/grpc": "~1.30.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. | |
| ## Protocol Buffers | |
| gRPC PHP supports | |
| [protocol buffers](https://developers.google.com/protocol-buffers) | |
| out-of-the-box. You will need the following things to get started: | |
| * `protoc`: the protobuf compiler binary to generate PHP classes for your | |
| messages and service definition. | |
| * `grpc_php_plugin`: a plugin for `protoc` to generate the service stub | |
| classes. | |
| * `protobuf.so`: the `protobuf` extension runtime library. | |
| ### `protoc` compiler | |
| If you don't have it already, you need to install the protobuf compiler | |
| `protoc`, version 3.5.0+ (the newer the better) for the current gRPC version. | |
| If you installed already, make the protobuf version is compatible to the | |
| grpc version you installed. If you build grpc.so from the souce, you can check | |
| the version of grpc inside package.xml file. | |
| The compatibility between the grpc and protobuf version is listed as table | |
| below: | |
| grpc | protobuf | grpc | protobuf | grpc | protobuf | |
| --- | --- | --- | --- | --- | --- | |
| v1.0.0 | 3.0.0(GA) | v1.12.0 | 3.5.2 | v1.22.0 | 3.8.0 | |
| v1.0.1 | 3.0.2 | v1.13.1 | 3.5.2 | v1.23.1 | 3.8.0 | |
| v1.1.0 | 3.1.0 | v1.14.2 | 3.5.2 | v1.24.0 | 3.8.0 | |
| v1.2.0 | 3.2.0 | v1.15.1 | 3.6.1 | v1.25.0 | 3.8.0 | |
| v1.2.0 | 3.2.0 | v1.16.1 | 3.6.1 | v1.26.0 | 3.8.0 | |
| v1.3.4 | 3.3.0 | v1.17.2 | 3.6.1 | v1.27.3 | 3.11.2 | |
| v1.3.5 | 3.2.0 | v1.18.0 | 3.6.1 | v1.28.1 | 3.11.2 | |
| v1.4.0 | 3.3.0 | v1.19.1 | 3.6.1 | v1.29.0 | 3.11.2 | |
| v1.6.0 | 3.4.0 | v1.20.1 | 3.7.0 | v1.30.0 | 3.12.2 | |
| v1.8.0 | 3.5.0 | v1.21.3 | 3.7.0 | |
| If `protoc` hasn't been installed, you can download the `protoc` binary from | |
| the protocol buffers | |
| [Github repository](https://github.com/protocolbuffers/protobuf/releases). | |
| Then unzip this file and update the environment variable `PATH` to include the | |
| path to the protoc binary file. | |
| 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 | |
| ``` | |
| ### `grpc_php_plugin` protoc plugin | |
| You need the `grpc_php_plugin` to generate the PHP client stub classes. This | |
| plugin works with the main `protoc` binary to generate classes that you can | |
| import into your project. | |
| You can build `grpc_php_plugin` with `cmake`: | |
| ```sh | |
| $ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc | |
| $ cd grpc | |
| $ git submodule update --init | |
| $ mkdir -p cmake/build | |
| $ cd cmake/build | |
| $ cmake ../.. | |
| $ make protoc grpc_php_plugin | |
| ``` | |
| The commands above will make `protoc` and `grpc_php_plugin` available | |
| in `cmake/build/third_party/protobuf/protoc` and `cmake/build/grpc_php_plugin`. | |
| Alternatively, you can also build the `grpc_php_plugin` with `bazel`: | |
| ```sh | |
| $ bazel build @com_google_protobuf//:protoc | |
| $ bazel build src/compiler:grpc_php_plugin | |
| ``` | |
| The `protoc` binary will be found in | |
| `bazel-bin/external/com_google_protobuf/protoc`. | |
| The `grpc_php_plugin` binary will be found in | |
| `bazel-bin/src/compiler/grpc_php_plugin`. | |
| Plugin may use the new feature of the new protobuf version, thus please also | |
| make sure that the protobuf version installed is compatible with the grpc | |
| version you build this plugin. | |
| ### `protobuf` runtime library | |
| There are two `protobuf` runtime libraries to choose from. They are identical | |
| in terms of APIs offered. The C implementation provides better performance, | |
| while the native implementation is easier to install. | |
| #### C implementation (for better performance) | |
| Install the `protobuf` extension from PECL: | |
| ``` sh | |
| $ [sudo] pecl install protobuf | |
| ``` | |
| or specific version | |
| ``` sh | |
| $ [sudo] pecl install protobuf-3.12.2 | |
| ``` | |
| And add this to your `php.ini` file: | |
| ```sh | |
| extension=protobuf.so | |
| ``` | |
| #### PHP implementation (for easier installation) | |
| Or require the `google/protobuf` composer package. Add this to your | |
| `composer.json` file: | |
| ```json | |
| "require": { | |
| "google/protobuf": "~v3.12.2" | |
| } | |
| ``` | |
| ### Generate PHP classes from your service definition | |
| With all the above done, now you can define your message and service definition | |
| in a `.proto` file and generate the corresponding PHP classes, which you can | |
| import into your project, with a command similar to the following: | |
| ``` | |
| $ protoc -I=. echo.proto --php_out=. --grpc_out=. \ | |
| --plugin=protoc-gen-grpc=<path to grpc_php_plugin> | |
| ``` | |
| ## Unit Tests | |
| You will need the source code to run tests | |
| ```sh | |
| $ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc | |
| $ cd grpc | |
| $ git submodule update --init | |
| ``` | |
| 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 | |
| ``` | |
| ### Client Stub | |
| The generate client stub classes have already been generated from `.proto` files | |
| by the `./bin/generate_proto_php.sh` script. | |
| ### Run test server | |
| Run a local server serving the `Math` | |
| [service](https://github.com/grpc/grpc/blob/master/src/proto/math/math.proto#L42). | |
| ```sh | |
| $ cd grpc/src/php/tests/generated_code | |
| $ npm install | |
| $ node math_server.js | |
| ``` | |
| ### Run test client | |
| Run the generated code tests | |
| ```sh | |
| $ cd grpc/src/php | |
| $ ./bin/run_gen_code_test.sh | |
| ``` | |
| ## Apache, PHP-FPM and Nginx | |
| For more information on how you can run the `grpc` library with Apache, | |
| PHP-FPM and Nginx, you can check out | |
| [this guide](https://github.com/grpc/grpc/tree/master/examples/php/echo). | |
| There you will find a series of Docker images where you can quickly run an | |
| end-to-end example. | |
| ## Misc Config Options | |
| ### SSL credentials | |
| Here's how you can specify SSL credentials when creating your PHP client: | |
| ```php | |
| $client = new Helloworld\GreeterClient('localhost:50051', [ | |
| 'credentials' => Grpc\ChannelCredentials::createSsl( | |
| file_get_contents('<path to certificate>')) | |
| ]); | |
| ``` | |
| ### pcntl_fork() support | |
| To make sure the `grpc` extension works with `pcntl_fork()` and related | |
| functions, add the following lines to your `php.ini` file: | |
| ``` | |
| grpc.enable_fork_support = 1 | |
| grpc.poll_strategy = epoll1 | |
| ``` | |
| ### Tracing and Logging | |
| To turn on gRPC tracing, add the following lines to your `php.ini` file. For | |
| all possible values of the `grpc.grpc.trace` option, please check | |
| [this doc](https://github.com/grpc/grpc/blob/master/doc/environment_variables.md). | |
| ``` | |
| grpc.grpc_verbosity=debug | |
| grpc.grpc_trace=all,-polling,-polling_api,-pollable_refcount,-timer,-timer_check | |
| grpc.log_filename=/var/log/grpc.log | |
| ``` | |
| > Make sure the log file above is writable, by doing the following: | |
| > ``` | |
| > $ sudo touch /var/log/grpc.log | |
| > $ sudo chmod 666 /var/log/grpc.log | |
| > ``` | |
| > Note: The log file does grow pretty quickly depending on how much logs are | |
| > being printed out. Make sure you have other mechanisms (perhaps another | |
| > cronjob) to zero out the log file from time to time, | |
| > e.g. `cp /dev/null /var/log/grpc.log`, or turn these off when logs or tracing | |
| > are not necessary for debugging purposes. | |
| ### User agent string | |
| You can customize the user agent string for your gRPC PHP client by specifying | |
| this `grpc.primary_user_agent` option when constructing your PHP client: | |
| ```php | |
| $client = new Helloworld\GreeterClient('localhost:50051', [ | |
| 'credentials' => Grpc\ChannelCredentials::createInsecure(), | |
| 'grpc.primary_user_agent' => 'my-user-agent-identifier', | |
| ]); | |
| ``` | |
| ### Maximum message size | |
| To change the default maximum message size, specify this | |
| `grpc.max_receive_message_length` option when constructing your PHP client: | |
| ```php | |
| $client = new Helloworld\GreeterClient('localhost:50051', [ | |
| 'credentials' => Grpc\ChannelCredentials::createInsecure(), | |
| 'grpc.max_receive_message_length' => 8*1024*1024, | |
| ]); | |
| ``` | |
| ### Compression | |
| You can customize the compression behavior on the client side, by specifying the following options when constructing your PHP client. | |
| ```php | |
| $client = new Helloworld\GreeterClient('localhost:50051', [ | |
| 'credentials' => Grpc\ChannelCredentials::createInsecure(), | |
| 'grpc.default_compression_algorithm' => 2, | |
| 'grpc.default_compression_level' => 2, | |
| ]); | |
| ``` | |
| Possible values for `grpc.default_compression_algorithm`: | |
| ``` | |
| 0: No compression | |
| 1: Compress with DEFLATE algorithm | |
| 2: Compress with GZIP algorithm | |
| 3: Stream compression with GZIP algorithm | |
| ``` | |
| Possible values for `grpc.default_compression_level`: | |
| ``` | |
| 0: None | |
| 1: Low level | |
| 2: Medium level | |
| 3: High level | |
| ``` |