| <?php |
| /* |
| * |
| * Copyright 2020 gRPC authors. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| */ |
| |
| include 'vendor/autoload.php'; |
| |
| class MathService extends Math\MathStub |
| { |
| public function Div( |
| \Math\DivArgs $request, |
| \Grpc\ServerContext $context |
| ): ?\Math\DivReply { |
| $dividend = $request->getDividend(); |
| $divisor = $request->getDivisor(); |
| if ($divisor == 0) { |
| $context->setStatus( |
| \Grpc\Status::status( |
| \Grpc\STATUS_INVALID_ARGUMENT, |
| 'Cannot divide by zero' |
| ) |
| ); |
| return null; |
| } |
| // for GeneratedCodeTest::testRetry |
| $metadata = $context->clientMetadata(); |
| if (array_key_exists('response-unavailable', $metadata)) { |
| $trailingMetadata = array_key_exists('grpc-previous-rpc-attempts', $metadata) |
| ? ['unavailable-retry-attempts' => $metadata['grpc-previous-rpc-attempts']] |
| : null; |
| $context->setStatus( |
| \Grpc\Status::status( |
| \Grpc\STATUS_UNAVAILABLE, |
| "unavailable", |
| $trailingMetadata |
| ) |
| ); |
| return null; |
| } |
| usleep(1000); // for GeneratedCodeTest::testTimeout |
| $quotient = intdiv($dividend, $divisor); |
| $remainder = $dividend % $divisor; |
| $reply = new \Math\DivReply([ |
| 'quotient' => $quotient, |
| 'remainder' => $remainder, |
| ]); |
| return $reply; |
| } |
| |
| public function DivMany( |
| \Grpc\ServerCallReader $reader, |
| \Grpc\ServerCallWriter $writter, |
| \Grpc\ServerContext $context |
| ): void { |
| while ($divArgs = $reader->read()) { |
| $dividend = $divArgs->getDividend(); |
| $divisor = $divArgs->getDivisor(); |
| if ($divisor == 0) { |
| $context->setStatus(\Grpc\Status::status( |
| \Grpc\STATUS_INVALID_ARGUMENT, |
| 'Cannot divide by zero' |
| )); |
| $writter->finish(); |
| return; |
| } |
| $quotient = intdiv($dividend, $divisor); |
| $remainder = $dividend % $divisor; |
| $reply = new \Math\DivReply([ |
| 'quotient' => $quotient, |
| 'remainder' => $remainder, |
| ]); |
| $writter->write($reply); |
| } |
| $writter->finish(); |
| } |
| |
| public function Fib( |
| \Math\FibArgs $request, |
| \Grpc\ServerCallWriter $writter, |
| \Grpc\ServerContext $context |
| ): void { |
| $previous = 0; |
| $current = 1; |
| $limit = $request->getLimit(); |
| for ($i = 0; $i < $limit; $i++) { |
| $num = new \Math\Num(); |
| $num->setNum($current); |
| $writter->write($num); |
| $next = $previous + $current; |
| $previous = $current; |
| $current = $next; |
| } |
| $writter->finish(); |
| } |
| |
| /** |
| * Sum sums a stream of numbers, returning the final result once the stream |
| * is closed. |
| * @param \Grpc\ServerCallReader $reader read client request data of \Math\Num |
| * @param \Grpc\ServerContext $context server request context |
| * @return array with [ |
| * \Math\Num, // response data |
| * optional array = [], // initial metadata |
| * optional \Grpc\Status = \Grpc\Status::ok // Grpc status |
| * ] |
| */ |
| public function Sum( |
| \Grpc\ServerCallReader $reader, |
| \Grpc\ServerContext $context |
| ): ?\Math\Num { |
| $sum = 0; |
| while ($num = $reader->read()) { |
| $sum += $num->getNum(); |
| } |
| $reply = new \Math\Num(); |
| $reply->setNum($sum); |
| return $reply; |
| } |
| } |
| |
| $server = new \Grpc\RpcServer(); |
| $server->addHttp2Port('0.0.0.0:50052'); |
| $server_credentials = Grpc\ServerCredentials::createSsl( |
| null, |
| file_get_contents(dirname(__FILE__) . '/../data/server1.key'), |
| file_get_contents(dirname(__FILE__) . '/../data/server1.pem') |
| ); |
| $server->addSecureHttp2Port('0.0.0.0:50051', $server_credentials); |
| $server->handle(new MathService()); |
| $server->run(); |