1*cc02d7e2SAndroid Build Coastguard Worker 2*cc02d7e2SAndroid Build Coastguard Worker# Overview 3*cc02d7e2SAndroid Build Coastguard Worker 4*cc02d7e2SAndroid Build Coastguard WorkerThis directory contains source code for PHP implementation of gRPC layered on 5*cc02d7e2SAndroid Build Coastguard Workershared C library. The same installation guides with more examples and 6*cc02d7e2SAndroid Build Coastguard Workertutorials can be seen at [grpc.io](https://grpc.io/docs/languages/php/quickstart). 7*cc02d7e2SAndroid Build Coastguard WorkergRPC PHP installation instructions for Google Cloud Platform is in 8*cc02d7e2SAndroid Build Coastguard Worker[cloud.google.com](https://cloud.google.com/php/grpc). 9*cc02d7e2SAndroid Build Coastguard Worker 10*cc02d7e2SAndroid Build Coastguard Worker## Environment 11*cc02d7e2SAndroid Build Coastguard Worker 12*cc02d7e2SAndroid Build Coastguard Worker### Prerequisites 13*cc02d7e2SAndroid Build Coastguard Worker 14*cc02d7e2SAndroid Build Coastguard Worker* `php`: version 7.0 or above (PHP 5.x support is deprecated from Sep 2020). 15*cc02d7e2SAndroid Build Coastguard Worker* `pecl` 16*cc02d7e2SAndroid Build Coastguard Worker* `composer` 17*cc02d7e2SAndroid Build Coastguard Worker* `phpunit` (optional) 18*cc02d7e2SAndroid Build Coastguard Worker 19*cc02d7e2SAndroid Build Coastguard Worker 20*cc02d7e2SAndroid Build Coastguard Worker## Install the _grpc_ extension 21*cc02d7e2SAndroid Build Coastguard Worker 22*cc02d7e2SAndroid Build Coastguard WorkerThere are two ways to install the `grpc` extension. 23*cc02d7e2SAndroid Build Coastguard Worker* Via `pecl` 24*cc02d7e2SAndroid Build Coastguard Worker* Build from source 25*cc02d7e2SAndroid Build Coastguard Worker 26*cc02d7e2SAndroid Build Coastguard Worker### Install from PECL 27*cc02d7e2SAndroid Build Coastguard Worker 28*cc02d7e2SAndroid Build Coastguard Worker```sh 29*cc02d7e2SAndroid Build Coastguard Worker$ [sudo] pecl install grpc 30*cc02d7e2SAndroid Build Coastguard Worker``` 31*cc02d7e2SAndroid Build Coastguard Worker 32*cc02d7e2SAndroid Build Coastguard Workeror specific version 33*cc02d7e2SAndroid Build Coastguard Worker 34*cc02d7e2SAndroid Build Coastguard Worker```sh 35*cc02d7e2SAndroid Build Coastguard Worker$ [sudo] pecl install grpc-1.30.0 36*cc02d7e2SAndroid Build Coastguard Worker``` 37*cc02d7e2SAndroid Build Coastguard Worker 38*cc02d7e2SAndroid Build Coastguard WorkerPlease make sure your `gcc` version satisfies the minimum requirement as 39*cc02d7e2SAndroid Build Coastguard Workerspecified [here](https://grpc.io/docs/languages/#official-support). 40*cc02d7e2SAndroid Build Coastguard Worker 41*cc02d7e2SAndroid Build Coastguard Worker 42*cc02d7e2SAndroid Build Coastguard Worker### Install on Windows 43*cc02d7e2SAndroid Build Coastguard Worker 44*cc02d7e2SAndroid Build Coastguard WorkerYou can download the pre-compiled `grpc.dll` extension from the PECL 45*cc02d7e2SAndroid Build Coastguard Worker[website](https://pecl.php.net/package/grpc). 46*cc02d7e2SAndroid Build Coastguard Worker 47*cc02d7e2SAndroid Build Coastguard Worker### Build from source 48*cc02d7e2SAndroid Build Coastguard Worker 49*cc02d7e2SAndroid Build Coastguard WorkerClone this repository at the [latest stable release tag](https://github.com/grpc/grpc/releases). 50*cc02d7e2SAndroid Build Coastguard Worker 51*cc02d7e2SAndroid Build Coastguard Worker```sh 52*cc02d7e2SAndroid Build Coastguard Worker$ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc 53*cc02d7e2SAndroid Build Coastguard Worker$ cd grpc 54*cc02d7e2SAndroid Build Coastguard Worker``` 55*cc02d7e2SAndroid Build Coastguard Worker 56*cc02d7e2SAndroid Build Coastguard Worker#### Build the gRPC C core library 57*cc02d7e2SAndroid Build Coastguard Worker 58*cc02d7e2SAndroid Build Coastguard Worker```sh 59*cc02d7e2SAndroid Build Coastguard Worker$ git submodule update --init 60*cc02d7e2SAndroid Build Coastguard Worker$ EXTRA_DEFINES=GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK make 61*cc02d7e2SAndroid Build Coastguard Worker``` 62*cc02d7e2SAndroid Build Coastguard Worker 63*cc02d7e2SAndroid Build Coastguard Worker#### Build and install the `grpc` extension 64*cc02d7e2SAndroid Build Coastguard Worker 65*cc02d7e2SAndroid Build Coastguard WorkerCompile the `grpc` extension from source 66*cc02d7e2SAndroid Build Coastguard Worker 67*cc02d7e2SAndroid Build Coastguard Worker```sh 68*cc02d7e2SAndroid Build Coastguard Worker$ grpc_root="$(pwd)" 69*cc02d7e2SAndroid Build Coastguard Worker$ cd src/php/ext/grpc 70*cc02d7e2SAndroid Build Coastguard Worker$ phpize 71*cc02d7e2SAndroid Build Coastguard Worker$ GRPC_LIB_SUBDIR=libs/opt ./configure --enable-grpc="${grpc_root}" 72*cc02d7e2SAndroid Build Coastguard Worker$ make 73*cc02d7e2SAndroid Build Coastguard Worker$ [sudo] make install 74*cc02d7e2SAndroid Build Coastguard Worker``` 75*cc02d7e2SAndroid Build Coastguard Worker 76*cc02d7e2SAndroid Build Coastguard WorkerThis will compile and install the `grpc` extension into the 77*cc02d7e2SAndroid Build Coastguard Workerstandard PHP extension directory. You should be able to run 78*cc02d7e2SAndroid Build Coastguard Workerthe [unit tests](#unit-tests), with the `grpc` extension installed. 79*cc02d7e2SAndroid Build Coastguard Worker 80*cc02d7e2SAndroid Build Coastguard Worker 81*cc02d7e2SAndroid Build Coastguard Worker### Update php.ini 82*cc02d7e2SAndroid Build Coastguard Worker 83*cc02d7e2SAndroid Build Coastguard WorkerAfter installing the `grpc` extension, make sure you add this line to your 84*cc02d7e2SAndroid Build Coastguard Worker`php.ini` file, depending on where your PHP installation is, to enable the 85*cc02d7e2SAndroid Build Coastguard Worker`grpc` extension. 86*cc02d7e2SAndroid Build Coastguard Worker 87*cc02d7e2SAndroid Build Coastguard Worker```sh 88*cc02d7e2SAndroid Build Coastguard Workerextension=grpc.so 89*cc02d7e2SAndroid Build Coastguard Worker``` 90*cc02d7e2SAndroid Build Coastguard Worker 91*cc02d7e2SAndroid Build Coastguard Worker## Composer package 92*cc02d7e2SAndroid Build Coastguard Worker 93*cc02d7e2SAndroid Build Coastguard WorkerIn addition to the `grpc` extension, you will need to install the `grpc/grpc` 94*cc02d7e2SAndroid Build Coastguard Workercomposer package as well. Add this to your project's `composer.json` file. 95*cc02d7e2SAndroid Build Coastguard Worker 96*cc02d7e2SAndroid Build Coastguard Worker```json 97*cc02d7e2SAndroid Build Coastguard Worker "require": { 98*cc02d7e2SAndroid Build Coastguard Worker "grpc/grpc": "~1.30.0" 99*cc02d7e2SAndroid Build Coastguard Worker } 100*cc02d7e2SAndroid Build Coastguard Worker``` 101*cc02d7e2SAndroid Build Coastguard Worker 102*cc02d7e2SAndroid Build Coastguard WorkerTo run tests with generated stub code from `.proto` files, you will also 103*cc02d7e2SAndroid Build Coastguard Workerneed the `composer` and `protoc` binaries. You can find out how to get these 104*cc02d7e2SAndroid Build Coastguard Workerbelow. 105*cc02d7e2SAndroid Build Coastguard Worker 106*cc02d7e2SAndroid Build Coastguard Worker## Protocol Buffers 107*cc02d7e2SAndroid Build Coastguard Worker 108*cc02d7e2SAndroid Build Coastguard WorkergRPC PHP supports 109*cc02d7e2SAndroid Build Coastguard Worker[protocol buffers](https://developers.google.com/protocol-buffers) 110*cc02d7e2SAndroid Build Coastguard Workerout-of-the-box. You will need the following things to get started: 111*cc02d7e2SAndroid Build Coastguard Worker 112*cc02d7e2SAndroid Build Coastguard Worker* `protoc`: the protobuf compiler binary to generate PHP classes for your 113*cc02d7e2SAndroid Build Coastguard Workermessages and service definition. 114*cc02d7e2SAndroid Build Coastguard Worker* `grpc_php_plugin`: a plugin for `protoc` to generate the service stub 115*cc02d7e2SAndroid Build Coastguard Workerclasses. 116*cc02d7e2SAndroid Build Coastguard Worker* `protobuf.so`: the `protobuf` extension runtime library. 117*cc02d7e2SAndroid Build Coastguard Worker 118*cc02d7e2SAndroid Build Coastguard Worker### `protoc` compiler 119*cc02d7e2SAndroid Build Coastguard Worker 120*cc02d7e2SAndroid Build Coastguard WorkerIf you don't have it already, you need to install the protobuf compiler 121*cc02d7e2SAndroid Build Coastguard Worker`protoc`, version 3.5.0+ (the newer the better) for the current gRPC version. 122*cc02d7e2SAndroid Build Coastguard WorkerIf you installed already, make the protobuf version is compatible to the 123*cc02d7e2SAndroid Build Coastguard Workergrpc version you installed. If you build grpc.so from the souce, you can check 124*cc02d7e2SAndroid Build Coastguard Workerthe version of grpc inside package.xml file. 125*cc02d7e2SAndroid Build Coastguard Worker 126*cc02d7e2SAndroid Build Coastguard WorkerThe compatibility between the grpc and protobuf version is listed as table 127*cc02d7e2SAndroid Build Coastguard Workerbelow: 128*cc02d7e2SAndroid Build Coastguard Worker 129*cc02d7e2SAndroid Build Coastguard Workergrpc | protobuf | grpc | protobuf | grpc | protobuf 130*cc02d7e2SAndroid Build Coastguard Worker--- | --- | --- | --- | --- | --- 131*cc02d7e2SAndroid Build Coastguard Workerv1.0.0 | 3.0.0(GA) | v1.12.0 | 3.5.2 | v1.22.0 | 3.8.0 132*cc02d7e2SAndroid Build Coastguard Workerv1.0.1 | 3.0.2 | v1.13.1 | 3.5.2 | v1.23.1 | 3.8.0 133*cc02d7e2SAndroid Build Coastguard Workerv1.1.0 | 3.1.0 | v1.14.2 | 3.5.2 | v1.24.0 | 3.8.0 134*cc02d7e2SAndroid Build Coastguard Workerv1.2.0 | 3.2.0 | v1.15.1 | 3.6.1 | v1.25.0 | 3.8.0 135*cc02d7e2SAndroid Build Coastguard Workerv1.2.0 | 3.2.0 | v1.16.1 | 3.6.1 | v1.26.0 | 3.8.0 136*cc02d7e2SAndroid Build Coastguard Workerv1.3.4 | 3.3.0 | v1.17.2 | 3.6.1 | v1.27.3 | 3.11.2 137*cc02d7e2SAndroid Build Coastguard Workerv1.3.5 | 3.2.0 | v1.18.0 | 3.6.1 | v1.28.1 | 3.11.2 138*cc02d7e2SAndroid Build Coastguard Workerv1.4.0 | 3.3.0 | v1.19.1 | 3.6.1 | v1.29.0 | 3.11.2 139*cc02d7e2SAndroid Build Coastguard Workerv1.6.0 | 3.4.0 | v1.20.1 | 3.7.0 | v1.30.0 | 3.12.2 140*cc02d7e2SAndroid Build Coastguard Workerv1.8.0 | 3.5.0 | v1.21.3 | 3.7.0 141*cc02d7e2SAndroid Build Coastguard Worker 142*cc02d7e2SAndroid Build Coastguard WorkerIf `protoc` hasn't been installed, you can download the `protoc` binary from 143*cc02d7e2SAndroid Build Coastguard Workerthe protocol buffers 144*cc02d7e2SAndroid Build Coastguard Worker[Github repository](https://github.com/protocolbuffers/protobuf/releases). 145*cc02d7e2SAndroid Build Coastguard WorkerThen unzip this file and update the environment variable `PATH` to include the 146*cc02d7e2SAndroid Build Coastguard Workerpath to the protoc binary file. 147*cc02d7e2SAndroid Build Coastguard Worker 148*cc02d7e2SAndroid Build Coastguard WorkerIf you really must compile `protoc` from source, you can run the following 149*cc02d7e2SAndroid Build Coastguard Workercommands, but this is risky because there is no easy way to uninstall / 150*cc02d7e2SAndroid Build Coastguard Workerupgrade to a newer release. 151*cc02d7e2SAndroid Build Coastguard Worker 152*cc02d7e2SAndroid Build Coastguard Worker```sh 153*cc02d7e2SAndroid Build Coastguard Worker$ cd grpc/third_party/protobuf 154*cc02d7e2SAndroid Build Coastguard Worker$ ./autogen.sh && ./configure && make 155*cc02d7e2SAndroid Build Coastguard Worker$ [sudo] make install 156*cc02d7e2SAndroid Build Coastguard Worker``` 157*cc02d7e2SAndroid Build Coastguard Worker 158*cc02d7e2SAndroid Build Coastguard Worker### `grpc_php_plugin` protoc plugin 159*cc02d7e2SAndroid Build Coastguard Worker 160*cc02d7e2SAndroid Build Coastguard WorkerYou need the `grpc_php_plugin` to generate the PHP client stub classes. This 161*cc02d7e2SAndroid Build Coastguard Workerplugin works with the main `protoc` binary to generate classes that you can 162*cc02d7e2SAndroid Build Coastguard Workerimport into your project. 163*cc02d7e2SAndroid Build Coastguard Worker 164*cc02d7e2SAndroid Build Coastguard WorkerYou can build `grpc_php_plugin` with `cmake`: 165*cc02d7e2SAndroid Build Coastguard Worker 166*cc02d7e2SAndroid Build Coastguard Worker```sh 167*cc02d7e2SAndroid Build Coastguard Worker$ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc 168*cc02d7e2SAndroid Build Coastguard Worker$ cd grpc 169*cc02d7e2SAndroid Build Coastguard Worker$ git submodule update --init 170*cc02d7e2SAndroid Build Coastguard Worker$ mkdir -p cmake/build 171*cc02d7e2SAndroid Build Coastguard Worker$ cd cmake/build 172*cc02d7e2SAndroid Build Coastguard Worker$ cmake ../.. 173*cc02d7e2SAndroid Build Coastguard Worker$ make protoc grpc_php_plugin 174*cc02d7e2SAndroid Build Coastguard Worker``` 175*cc02d7e2SAndroid Build Coastguard Worker 176*cc02d7e2SAndroid Build Coastguard WorkerThe commands above will make `protoc` and `grpc_php_plugin` available 177*cc02d7e2SAndroid Build Coastguard Workerin `cmake/build/third_party/protobuf/protoc` and `cmake/build/grpc_php_plugin`. 178*cc02d7e2SAndroid Build Coastguard Worker 179*cc02d7e2SAndroid Build Coastguard WorkerAlternatively, you can also build the `grpc_php_plugin` with `bazel`: 180*cc02d7e2SAndroid Build Coastguard Worker 181*cc02d7e2SAndroid Build Coastguard Worker```sh 182*cc02d7e2SAndroid Build Coastguard Worker$ bazel build @com_google_protobuf//:protoc 183*cc02d7e2SAndroid Build Coastguard Worker$ bazel build src/compiler:grpc_php_plugin 184*cc02d7e2SAndroid Build Coastguard Worker``` 185*cc02d7e2SAndroid Build Coastguard Worker 186*cc02d7e2SAndroid Build Coastguard WorkerThe `protoc` binary will be found in 187*cc02d7e2SAndroid Build Coastguard Worker`bazel-bin/external/com_google_protobuf/protoc`. 188*cc02d7e2SAndroid Build Coastguard WorkerThe `grpc_php_plugin` binary will be found in 189*cc02d7e2SAndroid Build Coastguard Worker`bazel-bin/src/compiler/grpc_php_plugin`. 190*cc02d7e2SAndroid Build Coastguard Worker 191*cc02d7e2SAndroid Build Coastguard WorkerPlugin may use the new feature of the new protobuf version, thus please also 192*cc02d7e2SAndroid Build Coastguard Workermake sure that the protobuf version installed is compatible with the grpc 193*cc02d7e2SAndroid Build Coastguard Workerversion you build this plugin. 194*cc02d7e2SAndroid Build Coastguard Worker 195*cc02d7e2SAndroid Build Coastguard Worker### `protobuf` runtime library 196*cc02d7e2SAndroid Build Coastguard Worker 197*cc02d7e2SAndroid Build Coastguard WorkerThere are two `protobuf` runtime libraries to choose from. They are identical 198*cc02d7e2SAndroid Build Coastguard Workerin terms of APIs offered. The C implementation provides better performance, 199*cc02d7e2SAndroid Build Coastguard Workerwhile the native implementation is easier to install. 200*cc02d7e2SAndroid Build Coastguard Worker 201*cc02d7e2SAndroid Build Coastguard Worker#### C implementation (for better performance) 202*cc02d7e2SAndroid Build Coastguard Worker 203*cc02d7e2SAndroid Build Coastguard WorkerInstall the `protobuf` extension from PECL: 204*cc02d7e2SAndroid Build Coastguard Worker 205*cc02d7e2SAndroid Build Coastguard Worker``` sh 206*cc02d7e2SAndroid Build Coastguard Worker$ [sudo] pecl install protobuf 207*cc02d7e2SAndroid Build Coastguard Worker``` 208*cc02d7e2SAndroid Build Coastguard Workeror specific version 209*cc02d7e2SAndroid Build Coastguard Worker 210*cc02d7e2SAndroid Build Coastguard Worker``` sh 211*cc02d7e2SAndroid Build Coastguard Worker$ [sudo] pecl install protobuf-3.12.2 212*cc02d7e2SAndroid Build Coastguard Worker``` 213*cc02d7e2SAndroid Build Coastguard Worker 214*cc02d7e2SAndroid Build Coastguard WorkerAnd add this to your `php.ini` file: 215*cc02d7e2SAndroid Build Coastguard Worker 216*cc02d7e2SAndroid Build Coastguard Worker```sh 217*cc02d7e2SAndroid Build Coastguard Workerextension=protobuf.so 218*cc02d7e2SAndroid Build Coastguard Worker``` 219*cc02d7e2SAndroid Build Coastguard Worker 220*cc02d7e2SAndroid Build Coastguard Worker#### PHP implementation (for easier installation) 221*cc02d7e2SAndroid Build Coastguard Worker 222*cc02d7e2SAndroid Build Coastguard WorkerOr require the `google/protobuf` composer package. Add this to your 223*cc02d7e2SAndroid Build Coastguard Worker`composer.json` file: 224*cc02d7e2SAndroid Build Coastguard Worker 225*cc02d7e2SAndroid Build Coastguard Worker```json 226*cc02d7e2SAndroid Build Coastguard Worker "require": { 227*cc02d7e2SAndroid Build Coastguard Worker "google/protobuf": "~v3.12.2" 228*cc02d7e2SAndroid Build Coastguard Worker } 229*cc02d7e2SAndroid Build Coastguard Worker``` 230*cc02d7e2SAndroid Build Coastguard Worker 231*cc02d7e2SAndroid Build Coastguard Worker### Generate PHP classes from your service definition 232*cc02d7e2SAndroid Build Coastguard Worker 233*cc02d7e2SAndroid Build Coastguard WorkerWith all the above done, now you can define your message and service definition 234*cc02d7e2SAndroid Build Coastguard Workerin a `.proto` file and generate the corresponding PHP classes, which you can 235*cc02d7e2SAndroid Build Coastguard Workerimport into your project, with a command similar to the following: 236*cc02d7e2SAndroid Build Coastguard Worker 237*cc02d7e2SAndroid Build Coastguard Worker``` 238*cc02d7e2SAndroid Build Coastguard Worker$ protoc -I=. echo.proto --php_out=. --grpc_out=. \ 239*cc02d7e2SAndroid Build Coastguard Worker--plugin=protoc-gen-grpc=<path to grpc_php_plugin> 240*cc02d7e2SAndroid Build Coastguard Worker``` 241*cc02d7e2SAndroid Build Coastguard Worker 242*cc02d7e2SAndroid Build Coastguard Worker## Unit Tests 243*cc02d7e2SAndroid Build Coastguard Worker 244*cc02d7e2SAndroid Build Coastguard WorkerYou will need the source code to run tests 245*cc02d7e2SAndroid Build Coastguard Worker 246*cc02d7e2SAndroid Build Coastguard Worker```sh 247*cc02d7e2SAndroid Build Coastguard Worker$ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc 248*cc02d7e2SAndroid Build Coastguard Worker$ cd grpc 249*cc02d7e2SAndroid Build Coastguard Worker$ git submodule update --init 250*cc02d7e2SAndroid Build Coastguard Worker``` 251*cc02d7e2SAndroid Build Coastguard Worker 252*cc02d7e2SAndroid Build Coastguard WorkerRun unit tests 253*cc02d7e2SAndroid Build Coastguard Worker 254*cc02d7e2SAndroid Build Coastguard Worker```sh 255*cc02d7e2SAndroid Build Coastguard Worker$ cd grpc/src/php 256*cc02d7e2SAndroid Build Coastguard Worker$ ./bin/run_tests.sh 257*cc02d7e2SAndroid Build Coastguard Worker``` 258*cc02d7e2SAndroid Build Coastguard Worker 259*cc02d7e2SAndroid Build Coastguard Worker## Generated Code Tests 260*cc02d7e2SAndroid Build Coastguard Worker 261*cc02d7e2SAndroid Build Coastguard WorkerThis section specifies the prerequisites for running the generated code tests, 262*cc02d7e2SAndroid Build Coastguard Workeras well as how to run the tests themselves. 263*cc02d7e2SAndroid Build Coastguard Worker 264*cc02d7e2SAndroid Build Coastguard Worker### Composer 265*cc02d7e2SAndroid Build Coastguard Worker 266*cc02d7e2SAndroid Build Coastguard WorkerInstall the runtime dependencies via `composer install`. 267*cc02d7e2SAndroid Build Coastguard Worker 268*cc02d7e2SAndroid Build Coastguard Worker```sh 269*cc02d7e2SAndroid Build Coastguard Worker$ cd grpc/src/php 270*cc02d7e2SAndroid Build Coastguard Worker$ composer install 271*cc02d7e2SAndroid Build Coastguard Worker``` 272*cc02d7e2SAndroid Build Coastguard Worker 273*cc02d7e2SAndroid Build Coastguard Worker 274*cc02d7e2SAndroid Build Coastguard Worker### Client Stub 275*cc02d7e2SAndroid Build Coastguard Worker 276*cc02d7e2SAndroid Build Coastguard WorkerThe generate client stub classes have already been generated from `.proto` files 277*cc02d7e2SAndroid Build Coastguard Workerby the `./bin/generate_proto_php.sh` script. 278*cc02d7e2SAndroid Build Coastguard Worker 279*cc02d7e2SAndroid Build Coastguard Worker### Run test server 280*cc02d7e2SAndroid Build Coastguard Worker 281*cc02d7e2SAndroid Build Coastguard WorkerRun a local server serving the `Math` 282*cc02d7e2SAndroid Build Coastguard Worker[service](https://github.com/grpc/grpc/blob/master/src/proto/math/math.proto#L42). 283*cc02d7e2SAndroid Build Coastguard Worker 284*cc02d7e2SAndroid Build Coastguard Worker```sh 285*cc02d7e2SAndroid Build Coastguard Worker$ cd grpc/src/php/tests/generated_code 286*cc02d7e2SAndroid Build Coastguard Worker$ npm install 287*cc02d7e2SAndroid Build Coastguard Worker$ node math_server.js 288*cc02d7e2SAndroid Build Coastguard Worker``` 289*cc02d7e2SAndroid Build Coastguard Worker 290*cc02d7e2SAndroid Build Coastguard Worker### Run test client 291*cc02d7e2SAndroid Build Coastguard Worker 292*cc02d7e2SAndroid Build Coastguard WorkerRun the generated code tests 293*cc02d7e2SAndroid Build Coastguard Worker 294*cc02d7e2SAndroid Build Coastguard Worker```sh 295*cc02d7e2SAndroid Build Coastguard Worker$ cd grpc/src/php 296*cc02d7e2SAndroid Build Coastguard Worker$ ./bin/run_gen_code_test.sh 297*cc02d7e2SAndroid Build Coastguard Worker``` 298*cc02d7e2SAndroid Build Coastguard Worker 299*cc02d7e2SAndroid Build Coastguard Worker## Apache, PHP-FPM and Nginx 300*cc02d7e2SAndroid Build Coastguard Worker 301*cc02d7e2SAndroid Build Coastguard WorkerFor more information on how you can run the `grpc` library with Apache, 302*cc02d7e2SAndroid Build Coastguard WorkerPHP-FPM and Nginx, you can check out 303*cc02d7e2SAndroid Build Coastguard Worker[this guide](https://github.com/grpc/grpc/tree/master/examples/php/echo). 304*cc02d7e2SAndroid Build Coastguard WorkerThere you will find a series of Docker images where you can quickly run an 305*cc02d7e2SAndroid Build Coastguard Workerend-to-end example. 306*cc02d7e2SAndroid Build Coastguard Worker 307*cc02d7e2SAndroid Build Coastguard Worker## Misc Config Options 308*cc02d7e2SAndroid Build Coastguard Worker 309*cc02d7e2SAndroid Build Coastguard Worker### SSL credentials 310*cc02d7e2SAndroid Build Coastguard Worker 311*cc02d7e2SAndroid Build Coastguard WorkerHere's how you can specify SSL credentials when creating your PHP client: 312*cc02d7e2SAndroid Build Coastguard Worker 313*cc02d7e2SAndroid Build Coastguard Worker```php 314*cc02d7e2SAndroid Build Coastguard Worker$client = new Helloworld\GreeterClient('localhost:50051', [ 315*cc02d7e2SAndroid Build Coastguard Worker 'credentials' => Grpc\ChannelCredentials::createSsl( 316*cc02d7e2SAndroid Build Coastguard Worker file_get_contents('<path to certificate>')) 317*cc02d7e2SAndroid Build Coastguard Worker]); 318*cc02d7e2SAndroid Build Coastguard Worker``` 319*cc02d7e2SAndroid Build Coastguard Worker 320*cc02d7e2SAndroid Build Coastguard Worker### pcntl_fork() support 321*cc02d7e2SAndroid Build Coastguard Worker 322*cc02d7e2SAndroid Build Coastguard WorkerTo make sure the `grpc` extension works with `pcntl_fork()` and related 323*cc02d7e2SAndroid Build Coastguard Workerfunctions, add the following lines to your `php.ini` file: 324*cc02d7e2SAndroid Build Coastguard Worker 325*cc02d7e2SAndroid Build Coastguard Worker``` 326*cc02d7e2SAndroid Build Coastguard Workergrpc.enable_fork_support = 1 327*cc02d7e2SAndroid Build Coastguard Workergrpc.poll_strategy = epoll1 328*cc02d7e2SAndroid Build Coastguard Worker``` 329*cc02d7e2SAndroid Build Coastguard Worker 330*cc02d7e2SAndroid Build Coastguard Worker### Tracing and Logging 331*cc02d7e2SAndroid Build Coastguard Worker 332*cc02d7e2SAndroid Build Coastguard WorkerTo turn on gRPC tracing, add the following lines to your `php.ini` file. For 333*cc02d7e2SAndroid Build Coastguard Workerall possible values of the `grpc.grpc.trace` option, please check 334*cc02d7e2SAndroid Build Coastguard Worker[this doc](https://github.com/grpc/grpc/blob/master/doc/environment_variables.md). 335*cc02d7e2SAndroid Build Coastguard Worker 336*cc02d7e2SAndroid Build Coastguard Worker``` 337*cc02d7e2SAndroid Build Coastguard Workergrpc.grpc_verbosity=debug 338*cc02d7e2SAndroid Build Coastguard Workergrpc.grpc_trace=all,-polling,-polling_api,-pollable_refcount,-timer,-timer_check 339*cc02d7e2SAndroid Build Coastguard Workergrpc.log_filename=/var/log/grpc.log 340*cc02d7e2SAndroid Build Coastguard Worker``` 341*cc02d7e2SAndroid Build Coastguard Worker 342*cc02d7e2SAndroid Build Coastguard Worker> Make sure the log file above is writable, by doing the following: 343*cc02d7e2SAndroid Build Coastguard Worker> ``` 344*cc02d7e2SAndroid Build Coastguard Worker> $ sudo touch /var/log/grpc.log 345*cc02d7e2SAndroid Build Coastguard Worker> $ sudo chmod 666 /var/log/grpc.log 346*cc02d7e2SAndroid Build Coastguard Worker> ``` 347*cc02d7e2SAndroid Build Coastguard Worker> Note: The log file does grow pretty quickly depending on how much logs are 348*cc02d7e2SAndroid Build Coastguard Worker> being printed out. Make sure you have other mechanisms (perhaps another 349*cc02d7e2SAndroid Build Coastguard Worker> cronjob) to zero out the log file from time to time, 350*cc02d7e2SAndroid Build Coastguard Worker> e.g. `cp /dev/null /var/log/grpc.log`, or turn these off when logs or tracing 351*cc02d7e2SAndroid Build Coastguard Worker> are not necessary for debugging purposes. 352*cc02d7e2SAndroid Build Coastguard Worker 353*cc02d7e2SAndroid Build Coastguard Worker### User agent string 354*cc02d7e2SAndroid Build Coastguard Worker 355*cc02d7e2SAndroid Build Coastguard WorkerYou can customize the user agent string for your gRPC PHP client by specifying 356*cc02d7e2SAndroid Build Coastguard Workerthis `grpc.primary_user_agent` option when constructing your PHP client: 357*cc02d7e2SAndroid Build Coastguard Worker 358*cc02d7e2SAndroid Build Coastguard Worker```php 359*cc02d7e2SAndroid Build Coastguard Worker$client = new Helloworld\GreeterClient('localhost:50051', [ 360*cc02d7e2SAndroid Build Coastguard Worker 'credentials' => Grpc\ChannelCredentials::createInsecure(), 361*cc02d7e2SAndroid Build Coastguard Worker 'grpc.primary_user_agent' => 'my-user-agent-identifier', 362*cc02d7e2SAndroid Build Coastguard Worker]); 363*cc02d7e2SAndroid Build Coastguard Worker``` 364*cc02d7e2SAndroid Build Coastguard Worker 365*cc02d7e2SAndroid Build Coastguard Worker### Maximum message size 366*cc02d7e2SAndroid Build Coastguard Worker 367*cc02d7e2SAndroid Build Coastguard WorkerTo change the default maximum message size, specify this 368*cc02d7e2SAndroid Build Coastguard Worker`grpc.max_receive_message_length` option when constructing your PHP client: 369*cc02d7e2SAndroid Build Coastguard Worker 370*cc02d7e2SAndroid Build Coastguard Worker```php 371*cc02d7e2SAndroid Build Coastguard Worker$client = new Helloworld\GreeterClient('localhost:50051', [ 372*cc02d7e2SAndroid Build Coastguard Worker 'credentials' => Grpc\ChannelCredentials::createInsecure(), 373*cc02d7e2SAndroid Build Coastguard Worker 'grpc.max_receive_message_length' => 8*1024*1024, 374*cc02d7e2SAndroid Build Coastguard Worker]); 375*cc02d7e2SAndroid Build Coastguard Worker``` 376*cc02d7e2SAndroid Build Coastguard Worker 377*cc02d7e2SAndroid Build Coastguard Worker### Compression 378*cc02d7e2SAndroid Build Coastguard Worker 379*cc02d7e2SAndroid Build Coastguard WorkerYou can customize the compression behavior on the client side, by specifying the following options when constructing your PHP client. 380*cc02d7e2SAndroid Build Coastguard Worker 381*cc02d7e2SAndroid Build Coastguard Worker```php 382*cc02d7e2SAndroid Build Coastguard Worker$client = new Helloworld\GreeterClient('localhost:50051', [ 383*cc02d7e2SAndroid Build Coastguard Worker 'credentials' => Grpc\ChannelCredentials::createInsecure(), 384*cc02d7e2SAndroid Build Coastguard Worker 'grpc.default_compression_algorithm' => 2, 385*cc02d7e2SAndroid Build Coastguard Worker 'grpc.default_compression_level' => 2, 386*cc02d7e2SAndroid Build Coastguard Worker]); 387*cc02d7e2SAndroid Build Coastguard Worker``` 388*cc02d7e2SAndroid Build Coastguard Worker 389*cc02d7e2SAndroid Build Coastguard WorkerPossible values for `grpc.default_compression_algorithm`: 390*cc02d7e2SAndroid Build Coastguard Worker 391*cc02d7e2SAndroid Build Coastguard Worker``` 392*cc02d7e2SAndroid Build Coastguard Worker0: No compression 393*cc02d7e2SAndroid Build Coastguard Worker1: Compress with DEFLATE algorithm 394*cc02d7e2SAndroid Build Coastguard Worker2: Compress with GZIP algorithm 395*cc02d7e2SAndroid Build Coastguard Worker3: Stream compression with GZIP algorithm 396*cc02d7e2SAndroid Build Coastguard Worker``` 397*cc02d7e2SAndroid Build Coastguard Worker 398*cc02d7e2SAndroid Build Coastguard WorkerPossible values for `grpc.default_compression_level`: 399*cc02d7e2SAndroid Build Coastguard Worker 400*cc02d7e2SAndroid Build Coastguard Worker``` 401*cc02d7e2SAndroid Build Coastguard Worker0: None 402*cc02d7e2SAndroid Build Coastguard Worker1: Low level 403*cc02d7e2SAndroid Build Coastguard Worker2: Medium level 404*cc02d7e2SAndroid Build Coastguard Worker3: High level 405*cc02d7e2SAndroid Build Coastguard Worker``` 406