| |
| # 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 |
| ``` |