diff --git a/src/Render.php b/src/Render.php index 2ab2d72..d423eb5 100644 --- a/src/Render.php +++ b/src/Render.php @@ -8,7 +8,6 @@ use EasySwoole\Component\Process\AbstractProcess; use EasySwoole\Component\Singleton; -use Swoole\Process; class Render { @@ -69,7 +68,11 @@ protected function generateProcessList():array { $array = []; for ($i = 1;$i <= $this->config->getWorkerNum();$i++){ - $array[$i] = new RenderProcess("Render.{$this->config->getSocketPrefix()}Worker.{$i}",$this->config,false,2,true); + $config = new RenderProcessConfig(); + $config->setProcessName('"Render.{$this->config->getSocketPrefix()}Worker.{$i}"'); + $config->setSocketFile($this->config->getTempDir()."/Render.{$this->config->getSocketPrefix()}Worker.{$i}.sock"); + $config->setRender($this->config->getRender()); + $array[$i] = new RenderProcess($config); $this->worker[$i] = $array[$i]; } return $array; diff --git a/src/RenderProcess.php b/src/RenderProcess.php index 2d3d595..a2fd527 100644 --- a/src/RenderProcess.php +++ b/src/RenderProcess.php @@ -4,70 +4,50 @@ namespace EasySwoole\Template; -use EasySwoole\Component\Process\AbstractProcess; +use EasySwoole\Component\Process\Socket\AbstractUnixProcess; use Swoole\Coroutine\Socket; +use Swoole\Process; -class RenderProcess extends AbstractProcess +class RenderProcess extends AbstractUnixProcess { - public function run($arg) + function onAccept(Socket $socket) { - /** @var Config $arg */ - $sockFile = $arg->getTempDir()."/{$this->getProcessName()}.sock"; - if (file_exists($sockFile)) - { - unlink($sockFile); - } - $socketServer = new Socket(AF_UNIX,SOCK_STREAM,0); - $socketServer->bind($sockFile); - if(!$socketServer->listen(2048)){ - trigger_error('listen '.$sockFile. ' fail'); + /** @var RenderInterface $render */ + $render = $this->getConfig()->getRender(); + $header = $socket->recvAll(4,1); + if(strlen($header) != 4){ + $socket->close(); return; } - while (1){ - $conn = $socketServer->accept(-1); - if($conn){ - $header = $conn->recvAll(4,1); - if(strlen($header) != 4){ - $conn->close(); - return; - } - $allLength = Protocol::packDataLength($header); - $data = $conn->recvAll($allLength,1); - if(strlen($data) == $allLength){ - $data = unserialize($data); - try{ - $reply = $arg->getRender()->render($data['template'],$data['data'],$data['options']); - }catch (\Throwable $throwable){ - $reply = $arg->getRender()->onException($throwable); - }finally{ - $arg->getRender()->afterRender($reply,$data['template'],$data['data'],$data['options']); - } - $conn->sendAll(Protocol::pack(serialize($reply))); - $conn->close(); - }else{ - $conn->close(); - return; - } - }else{ - \co::sleep(0.001); + $allLength = Protocol::packDataLength($header); + $data = $socket->recvAll($allLength,1); + if(strlen($data) == $allLength){ + $data = unserialize($data); + try{ + $reply = $render->render($data['template'],$data['data'],$data['options']); + }catch (\Throwable $throwable){ + $reply = $render->onException($throwable); + }finally{ + $render->afterRender($reply,$data['template'],$data['data'],$data['options']); } + $socket->sendAll(Protocol::pack(serialize($reply))); + $socket->close(); + }else{ + $socket->close(); + return; } } - public function onShutDown() + protected function onException(\Throwable $throwable,...$arg) { - // TODO: Implement onShutDown() method. + trigger_error("{$throwable->getMessage()} at file:{$throwable->getFile()} line:{$throwable->getLine()}"); } - public function onReceive(string $str) + protected function onPipeReadable(Process $process) { - if($str == 'shutdown'){ - $this->getProcess()->exit(0); + $msg = $process->read(); + if($msg == 'shutdown'){ + $process->exit(0); } } - - public function onException(\Throwable $throwable) - { - trigger_error("{$throwable->getMessage()} at file:{$throwable->getFile()} line:{$throwable->getLine()}"); - } } \ No newline at end of file diff --git a/src/RenderProcessConfig.php b/src/RenderProcessConfig.php new file mode 100644 index 0000000..64e736e --- /dev/null +++ b/src/RenderProcessConfig.php @@ -0,0 +1,22 @@ +render; + } + + public function setRender(RenderInterface $render): void + { + $this->render = $render; + } +} \ No newline at end of file