diff --git a/library/think/app.php b/library/think/app.php index 1459f9f4..7f698e59 100644 --- a/library/think/app.php +++ b/library/think/app.php @@ -122,7 +122,9 @@ class App // 操作不存在 if (method_exists($instance, '_empty')) { $method = new \ReflectionMethod($instance, '_empty'); - $method->invokeArgs($instance, [$action, '']); + $data = $method->invokeArgs($instance, [$action, '']); + // 返回数据 + Response::returnData($data, $config['default_return_type'], $config['response_exit']); } else { throw new Exception('method [ ' . (new \ReflectionClass($instance))->getName() . '->' . $action . ' ] not exists ', 10002); } @@ -275,10 +277,10 @@ class App $depr = $config['pathinfo_depr']; // 还原劫持后真实pathinfo $path_info = - (defined('BIND_MODULE') ? BIND_MODULE . $depr : '') . - (defined('BIND_CONTROLLER') ? BIND_CONTROLLER . $depr : '') . - (defined('BIND_ACTION') ? BIND_ACTION . $depr : '') . - __INFO__; + (defined('BIND_MODULE') ? BIND_MODULE . $depr : '') . + (defined('BIND_CONTROLLER') ? BIND_CONTROLLER . $depr : '') . + (defined('BIND_ACTION') ? BIND_ACTION . $depr : '') . + __INFO__; // 路由检测 if (!empty($config['url_route_on'])) { diff --git a/library/think/url.php b/library/think/url.php index b8adefbe..818694cb 100644 --- a/library/think/url.php +++ b/library/think/url.php @@ -93,7 +93,7 @@ class Url $suffix = substr($suffix, 0, $pos); } } - return 0 === strpos($suffix,'.') ? $suffix : (empty($suffix)? $suffix: '.'.$suffix); + return (empty($suffix) || 0 === strpos($suffix, '.')) ? $suffix : '.' . $suffix; } // 根据路由名称和参数生成URL地址 diff --git a/library/traits/model/adv.php b/library/traits/model/adv.php index a15e4e75..045f3174 100644 --- a/library/traits/model/adv.php +++ b/library/traits/model/adv.php @@ -11,6 +11,7 @@ namespace traits\model; +use think\Cache; use think\Lang; use think\Loader; @@ -69,26 +70,58 @@ trait Adv } /** - * 字段值增长 + * 字段值(延迟)增长 * @access public * @param string $field 字段名 * @param integer $step 增长值 + * @param integer $lazyTime 延时时间(s) * @return boolean */ - public function setInc($field, $step = 1) + public function setInc($field, $step = 1, $lazyTime = 0) { + $condition = $this->options['where']; + if (empty($condition)) { + // 没有条件不做任何更新 + return false; + } + if ($lazyTime > 0) { + // 延迟写入 + $guid = md5($this->name . '_' . $field . '_' . serialize($condition)); + $step = $this->lazyWrite($guid, $step, $lazyTime); + if (empty($step)) { + return true; // 等待下次写入 + } elseif ($step < 0) { + $step = '-' . $step; + } + } return $this->setField($field, ['exp', $field . '+' . $step]); } /** - * 字段值减少 + * 字段值(延迟)减少 * @access public * @param string $field 字段名 * @param integer $step 减少值 + * @param integer $lazyTime 延时时间(s) * @return boolean */ - public function setDec($field, $step = 1) + public function setDec($field, $step = 1, $lazyTime = 0) { + $condition = $this->options['where']; + if (empty($condition)) { + // 没有条件不做任何更新 + return false; + } + if ($lazyTime > 0) { + // 延迟写入 + $guid = md5($this->name . '_' . $field . '_' . serialize($condition)); + $step = $this->lazyWrite($guid, -$step, $lazyTime); + if (empty($step)) { + return true; // 等待下次写入 + } elseif ($step > 0) { + $step = '-' . $step; + } + } return $this->setField($field, ['exp', $field . '-' . $step]); } @@ -104,6 +137,15 @@ trait Adv $options['field'] = $field; $options = $this->_parseOptions($options); $field = trim($field); + // 判断查询缓存 + if (isset($options['cache'])) { + $cache = $options['cache']; + $key = is_string($cache['key']) ? $cache['key'] : md5($sepa . serialize($options)); + $data = Cache::get($key); + if (false !== $data) { + return $data; + } + } if (strpos($field, ',')) { // 多字段 if (!isset($options['limit'])) { @@ -111,19 +153,26 @@ trait Adv } $resultSet = $this->db->select($options); if (!empty($resultSet)) { - $field = array_keys($resultSet[0]); - $key = array_shift($field); - $key2 = array_shift($field); - $cols = []; - $count = count(explode(',', $field)); + if (is_string($resultSet)) { + return $resultSet; + } + $_field = explode(',', $field); + $field = array_keys($resultSet[0]); + $key1 = array_shift($field); + $key2 = array_shift($field); + $cols = array(); + $count = count($_field); foreach ($resultSet as $result) { - $name = $result[$key]; + $name = $result[$key1]; if (2 == $count) { $cols[$name] = $result[$key2]; } else { - $cols[$name] = is_string($sepa) ? implode($sepa, $result) : $result; + $cols[$name] = is_string($sepa) ? implode($sepa, array_slice($result, 1)) : $result; } } + if (isset($cache)) { + Cache::set($key, $cols, $cache['expire']); + } return $cols; } } else { @@ -135,72 +184,28 @@ trait Adv } $result = $this->db->select($options); if (!empty($result)) { + if (is_string($result)) { + return $result; + } if (true !== $sepa && 1 == $options['limit']) { - return reset($result[0]); + $data = reset($result[0]); + if (isset($cache)) { + Cache::set($key, $data, $cache['expire']); + } + return $data; } foreach ($result as $val) { $array[] = $val[$field]; } + if (isset($cache)) { + Cache::set($key, $array, $cache['expire']); + } return $array; } } return null; } - /** - * 字段值延迟增长 - * @access public - * @param string $field 字段名 - * @param integer $step 增长值 - * @param integer $lazyTime 延时时间(s) - * @return boolean - */ - public function setLazyInc($field, $step = 1, $lazyTime = 0) - { - $condition = $this->options['where']; - if (empty($condition)) { - // 没有条件不做任何更新 - return false; - } - if ($lazyTime > 0) { - // 延迟写入 - $guid = md5($this->name . '_' . $field . '_' . serialize($condition)); - $step = $this->lazyWrite($guid, $step, $lazyTime); - if (false === $step) { - // 等待下次写入 - return true; - } - } - return $this->setField($field, ['exp', $field . '+' . $step]); - } - - /** - * 字段值延迟减少 - * @access public - * @param string $field 字段名 - * @param integer $step 减少值 - * @param integer $lazyTime 延时时间(s) - * @return boolean - */ - public function setLazyDec($field, $step = 1, $lazyTime = 0) - { - $condition = $this->options['where']; - if (empty($condition)) { - // 没有条件不做任何更新 - return false; - } - if ($lazyTime > 0) { - // 延迟写入 - $guid = md5($this->name . '_' . $field . '_' . serialize($condition)); - $step = $this->lazyWrite($guid, $step, $lazyTime); - if (false === $step) { - // 等待下次写入 - return true; - } - } - return $this->setField($field, ['exp', $field . '-' . $step]); - } - /** * 延时更新检查 返回false表示需要延时 * 否则返回实际写入的数值 @@ -212,23 +217,23 @@ trait Adv */ protected function lazyWrite($guid, $step, $lazyTime) { - if (false !== ($value = F($guid))) { + if (false !== ($value = Cache::get($guid))) { // 存在缓存写入数据 - if (time() > S($guid . '_time') + $lazyTime) { + if (NOW_TIME > Cache::get($guid . '_time') + $lazyTime) { // 延时更新时间到了,删除缓存数据 并实际写入数据库 - S($guid, null); - S($guid . '_time', null); + Cache::rm($guid); + Cache::rm($guid . '_time'); return $value + $step; } else { // 追加数据到缓存 - S($guid, $value + $step); + Cache::set($guid, $value + $step); return false; } } else { // 没有缓存数据 - S($guid, $step); + Cache::set($guid, $step); // 计时开始 - S($guid . '_time', time()); + Cache::set($guid . '_time', NOW_TIME); return false; } }