xref: /aosp_15_r20/external/grpc-grpc/src/php/README.md (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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