Object-proxy是一个简单的远程对象代理。
用法
use ObjectProxy\ObjectProxy;use ObjectProxy\ObjectProxyService;$objectName = \SomeClass::class;// 要实例化的对象名称$costructArgs = [];// 构造函数的参数$proxyObject = ew ObjectProxy($objectName, $costructArgs);// $proxyObject是SomeClass对象的代理。$virtualReturObject = $proxyObject->someObjectMethod();// 这个 $virtualReturObject 可以序列化后给到远程服务器。$retur = ew ObjectProxyService($virtualReturObject);// 实例一个对象代理服务类处理操作代理对象$result = $retur->getResult();if ($result istaceof \Exceptio) { echo $result->getMessage(); // 调用发生异常,显示错误消息。} else { var_dump($result); // SomeClass::someObjectMethod的返回结果。}示例
通过Swoole做一个PDO对象代理。
bi/swoole_cliet.phpuse Swoole\Cliet;use ObjectProxy\ObjectProxy;use ObjectProxy\Trasporter;require __DIR__.'/../src/Loader.php';for ($i = 0;$i <= 20000;++$i) { $pdo = ew ObjectProxy(\PDO::class, array('mysql:host=127.0.0.1;dbame=test', 'user', 'password', [\PDO::ATTR_PERSISTENT => true])); $stat = $pdo->prepare('SELECT * FROM test WHERE id = ?'); $id = 2; $stat->execute([$id]); $virtualObject = $stat->fetch(); $cliet = ew Cliet(SWOOLE_SOCK_TCP); $cliet->coect('127.0.0.1', 9509); $cliet->sed(Trasporter::ecode($virtualObject)); $data = $cliet->recv(); $cliet->close(); $r = Trasporter::decode($data); if ($r istaceof \Exceptio) { echo 'Bad: '.$i.' '.$r->getMessage()."\"; } else { echo 'OK: '.$i.':'.$r['id']."\"; }}bi/swoole_server.phpuse Swoole\Server;use ObjectProxy\Trasporter;use ObjectProxy\ObjectProxyService;require __DIR__.'/../src/Loader.php';class SwooleObjectProxyServer{ public fuctio ru() { echo 'Server: start.Swoole versio is ['.SWOOLE_VERSION."]\"; $serv = ew Server('127.0.0.1', 9509); $serv->set(array( 'worker_um' => 20, //worker process um 'task_worker_um' => 10, //Object Pool Size //'backlog' => 128, //liste backlog //'ope_tcp_keepalive' => 1, //'log_file' => '/tmp/swoole.log', //swoole error log )); $serv->o('WorkerStart', array($this, 'oStart')); $serv->o('Receive', array($this, 'oReceive')); $serv->o('Close', array($this, 'oClose')); $serv->o('Task', array($this, 'oTask')); $serv->o('Fiish', array($this, 'oFiish')); $serv->o('WorkerStop', array($this, 'oShutdow')); $serv->start(); } public fuctio oTask($serv, $task_id, $from_id, $data) { $service = ew ObjectProxyService(Trasporter::decode($data)); $serv->fiish(Trasporter::ecode($service->getResult())); } public fuctio oReceive($serv, $fd, $from_id, $data) { $result = $serv->taskwait($data); $serv->sed($fd, $result); echo "oReceive\"; } public fuctio oClose($serv, $fd, $from_id) { echo "oClose\"; } public fuctio oStart($serv) { } public fuctio oFiish($serv, $data) { } public fuctio oShutdow($serv) { }}$serv = ew SwooleObjectProxyServer();$serv->ru();
评论