RpcWorker.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. require_once WORKERMAN_ROOT_DIR . 'man/Core/SocketWorker.php';
  3. require_once WORKERMAN_ROOT_DIR . 'applications/Common/Protocols/RpcProtocol.php';
  4. /**
  5. *
  6. * RpcWorker,Rpc服务的入口文件
  7. * 根据客户端传递参数调用 applications/Rpc/Services/目录下的文件的类的方法
  8. *
  9. * @author walkor <worker-man@qq.com>
  10. */
  11. class RpcWorker extends Man\Core\SocketWorker
  12. {
  13. /**
  14. * 确定数据是否接收完整
  15. * @see Man\Core.SocketWorker::dealInput()
  16. */
  17. public function dealInput($recv_str)
  18. {
  19. return RpcProtocol::dealInput($recv_str);
  20. }
  21. /**
  22. * 数据接收完整后处理业务逻辑
  23. * @see Man\Core.SocketWorker::dealProcess()
  24. */
  25. public function dealProcess($recv_str)
  26. {
  27. /**
  28. * data的数据格式为
  29. * ['class'=>xx, 'method'=>xx, 'param_array'=>array(xx)]
  30. * @var array
  31. */
  32. $data = RpcProtocol::decode($recv_str);
  33. // 判断数据是否正确
  34. if(empty($data['class']) || empty($data['method']) || !isset($data['param_array']))
  35. {
  36. // 发送数据给客户端,请求包错误
  37. return $this->sendToClient(RpcProtocol::encode(array('code'=>400, 'msg'=>'bad request', 'data'=>null)));
  38. }
  39. // 获得要调用的类、方法、及参数
  40. $class = $data['class'];
  41. $method = $data['method'];
  42. $param_array = $data['param_array'];
  43. // 判断类对应文件是否载入
  44. if(!class_exists($class))
  45. {
  46. $include_file = WORKERMAN_ROOT_DIR . "applications/Rpc/Services/$class.php";
  47. if(!is_file($include_file))
  48. {
  49. // 发送数据给客户端 类不存在
  50. return $this->sendToClient(RpcProtocol::encode(array('code'=>404, 'msg'=>'class not found', 'data'=>null)));
  51. }
  52. require_once $include_file;
  53. }
  54. // 调用类的方法
  55. try
  56. {
  57. $ret = call_user_func_array(array($class, $method), $param_array);
  58. // 发送数据给客户端,调用成功,data下标对应的元素即为调用结果
  59. return $this->sendToClient(RpcProtocol::encode(array('code'=>0, 'msg'=>'ok', 'data'=>$ret)));
  60. }
  61. // 有异常
  62. catch(Exception $e)
  63. {
  64. // 发送数据给客户端,发生异常,调用失败
  65. return $this->sendToClient(RpcProtocol::encode(array('code'=>500, 'msg'=>$e->getMessage(), 'data'=>$e)));
  66. }
  67. }
  68. }