Files
EasySoft-ZenTaoPMS/framework/zand/router.class.php
T
2023-07-11 07:28:39 +00:00

432 lines
10 KiB
PHP

<?php
declare(strict_types=1);
use Nyholm\Psr7\Factory\Psr17Factory;
use Spiral\Goridge\RPC\RPC;
use Spiral\RoadRunner\Http\PSR7Worker;
use Spiral\RoadRunner\Jobs\Consumer;
use Spiral\RoadRunner\Jobs\Jobs;
use Spiral\RoadRunner\Jobs\Task\ReceivedTaskInterface;
use Spiral\RoadRunner\Worker;
include "vendor/autoload.php";
include 'response.class.php';
/**
* The zand router class file of ZenTaoPHP framework.
*
* The author disclaims copyright to this source code. In place of
* a legal notice, here is a blessing:
*
* May you do good and not evil.
* May you find forgiveness for yourself and forgive others.
* May you share freely, never taking more than you give.
*/
/**
* router类。
* The router class.
*
* @package framework
*/
include dirname(__DIR__) . '/router.class.php';
class zandRouter extends router
{
/**
* 全局变量的快照
* Snaps for global variables.
*
* @static
* @var array
* @access public
*/
static $snaps = array();
/**
* 构造方法, 设置路径,类,超级变量等。注意:
* 1.应该使用createApp()方法实例化router类;
* 2.如果$appRoot为空,框架会根据$appName计算应用路径。
*
* The construct function.
* Prepare all the paths, classes, super objects and so on.
* Notice:
* 1. You should use the createApp() method to get an instance of the router.
* 2. If the $appRoot is empty, the framework will compute the appRoot according the $appName
*
* @param string $appName the name of the app
* @param string $appRoot the root path of the app
* @access public
* @return void
*/
public function __construct(string $appName = 'demo', string $appRoot = '')
{
$_SERVER['HTTP_USER_AGENT'] = '';
$_SERVER['SCRIPT_NAME'] = '/index.php';
$_SERVER['SCRIPT_FILENAME'] = dirname(__DIR__, 2) . '/www/index.php';
$this->worker = new zandWorker();
$this->consumer = new Consumer();
parent::__construct($appName, $appRoot);
/* Snap. */
global $filter;
self::$snaps['config'] = clone $this->config;
self::$snaps['lang'] = clone $this->lang;
self::$snaps['filter'] = clone $filter;
}
/**
* 初始化全局变量和客户端信息。
* Init global variables and client.
*
* @access public
* @return void
*/
public function initRequest(): void
{
global $config, $lang, $filter, $loadedTargets;
$config = clone self::$snaps['config'];
$lang = clone self::$snaps['lang'];
$filter = clone self::$snaps['filter'];
$loadedTargets = array();
$this->config = $config;
$this->lang = $lang;
$this->moduleName = NULL;
$this->methodName = NULL;
$this->rawModule = NULL;
$this->rawMethod = NULL;
$this->params = NULL;
$this->user = NULL;
self::$loadedConfigs = array();
self::$loadedLangs = array();
$this->setClient();
}
/**
* 关闭请求会话
* Close request.
*
* @access public
* @return void
*/
public function closeRequest()
{
$obLevel = ob_get_level();
for($i = 0; $i < $obLevel; $i++) ob_end_clean();
session_write_close();
}
/**
* 开启session。
* Start session.
*
* @access public
* @return void
*/
public function startSession(): void
{
$sessionName = $this->config->sessionVar;
if(!defined('SESSION_STARTED'))
{
global $config;
$driver = $config->db->driver;
if(!class_exists($driver))
{
$classFile = $this->coreLibRoot . 'dao' . DS . $driver . '.class.php';
include($classFile);
}
$dao = new $driver();
$ztSessionHandler = new zandSession($dao);
session_set_save_handler(
$ztSessionHandler->open(...),
$ztSessionHandler->close(...),
$ztSessionHandler->read(...),
$ztSessionHandler->write(...),
$ztSessionHandler->destroy(...),
$ztSessionHandler->gc(...)
);
session_name($sessionName);
session_set_cookie_params(0, $this->config->webRoot, '', $this->config->cookieSecure, true);
define('SESSION_STARTED', true);
}
else
{
$this->sessionID = isset($_COOKIE[$sessionName]) ? $_COOKIE[$sessionName] : session_create_id();
session_id($this->sessionID);
session_start();
$this->worker->response->setCookie($sessionName, $this->sessionID, 0);
}
}
}
/**
* 消息队列的消息类型。
* Message in queue.
*
* @package zand
*/
class zandMessage
{
public $id;
public $type;
public $command;
}
/**
* 消息队列。
* Message queue.
*
* @package zand
*/
class zandQueue
{
private $mq;
public function __construct($queueName)
{
$jobs = new Jobs(RPC::create('tcp://127.0.0.1:6001'));
$this->mq = $jobs->connect('crons');
}
public function push($message)
{
$task = $this->mq->create(zandMessage::class, $message);
$this->mq->dispatch($task);
}
}
/**
* HTTP worker.
*
* @package zand
*/
class zandWorker
{
/**
* RoadRunner PSR7 worker.
*
* @var object
* @access private
*/
private $psr7;
/**
* response.
*
* @var object
* @access public
*/
public $response;
/**
* Constructor.
*
* @access public
* @return void
*/
public function __construct()
{
$worker = Worker::create();
$factory = new Psr17Factory();
$this->psr7 = new PSR7Worker($worker, $factory, $factory, $factory);
$this->response = new zandResponse();
}
/**
* Wait request to run.
*
* @access public
* @return void
*/
public function waitRequest()
{
$request = $this->psr7->waitRequest();
$this->initGlobal($request);
$this->response = new zandResponse();
}
/**
* Init global variables.
*
* @param object $request
* @access public
* @return void
*/
public function initGlobal($request)
{
$_SERVER = $request->getServerParams();
$_SERVER['REQUEST_TIME'] = time();
$_SERVER['REQUEST_TIME_FLOAT'] = microtime(true);
$_SERVER['SERVER_PROTOCOL'] = $request->getUri()->getScheme();
$_SERVER['REQUEST_METHOD'] = $request->getMethod();
$_SERVER['SERVER_NAME'] = $request->getUri()->getHost();
$_SERVER['SERVER_PORT'] = $request->getUri()->getPort();
$_SERVER['REQUEST_URI'] = $request->getUri()->getPath();
$_SERVER['SCRIPT_NAME'] = '/index.php';
$_SERVER['PHP_SELF'] = 'index.php';
$_SERVER['PATH_TRANSLATED'] = 'index.php';
$_SERVER['HTTP_HOST'] = $_SERVER['SERVER_NAME'] . (in_array($_SERVER['SERVER_PORT'], array(80, 443)) ? '' : ':' . $_SERVER['SERVER_PORT']);
$query = $request->getUri()->getQuery();
if(!empty($query))
{
$_SERVER['REQUEST_URI'] .= '?' . $query;
$_SERVER['QUERY_STRING'] = $query;
}
$_GET = $request->getQueryParams();
$_POST = $request->getParsedBody();
$_COOKIE = $request->getCookieParams();
$_FILE = $request->getUploadedFiles();
}
/**
* Send response.
*
* @param string $body
* @access public
* @return void
*/
public function respond(string $body)
{
$this->response->setBody($body);
$this->psr7->respond($this->response);
}
/**
* Send error.
*
* @param Exception $e
* @access public
* @return void
*/
public function error(Exception $e)
{
$this->psr7->getWorker()->error((string)$e);
}
}
/**
* MySQL实现的Session管理.
* Session handler implements by MySQL.
*
* @package zand
*/
class zandSession
{
/**
* DAO for database.
*
* @var object
* @access private
*/
private $dao;
/**
* Constructor.
*
* @param object $dao
* @access public
* @return void
*/
public function __construct($dao)
{
$this->dao = $dao;
}
/**
* Open session.
*
* @param string $savePath
* @param string $sessionName
* @access public
* @return bool
*/
public function open($savePath, $sessionName)
{
$this->savePath = $savePath;
$this->sessionName = $sessionName;
return true;
}
/**
* Close session.
*
* @access public
* @return bool
*/
public function close()
{
return true;
}
/**
* Read session.
*
* @param string $id
* @access public
* @return string
*/
public function read($id)
{
$result = $this->dao->select('data')->from(TABLE_SESSION)->where('id')->eq($id)->fetch();
return $result ? $result->data : '';
}
/**
* Write session.
*
* @param string $id
* @param string $data
* @access public
* @return bool
*/
public function write($id, $data)
{
$data = array('id' => $id, 'data' => $data, 'timestamp' => time());
$this->dao->replace(TABLE_SESSION)->data($data)->exec();
return true;
}
/**
* Destroy session.
*
* @param string $id
* @access public
* @return bool
*/
public function destroy($id)
{
$this->dao->delete()->from(TABLE_SESSION)->where('id')->eq($id)->exec();
return true;
}
/**
* GC for session.
*
* @param int $maxlifetime
* @access public
* @return bool
*/
public function gc($maxlifetime)
{
$this->dao->delete()->from(TABLE_SESSION)->where('timestamp')->lt(time() - intval($maxlifetime))->exec();
return true;
}
}