Skip to content
  • P
    Projects
  • G
    Groups
  • S
    Snippets
  • Help

施宇 / icsales

  • This project
    • Loading...
  • Sign in
Go to a project
  • Project
  • Repository
  • Issues 0
  • Merge Requests 0
  • Pipelines
  • Wiki
  • Snippets
  • Settings
  • Activity
  • Graph
  • Charts
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • Files
  • Commits
  • Branches
  • Tags
  • Contributors
  • Graph
  • Compare
  • Charts
Find file
BlameHistoryPermalink
Switch branch/tag
  • icsales
  • ThinkPHP
  • Library
  • Think
  • Cache
  • Driver
  • Apachenote.class.php
  • 施宇's avatar
    init · 14f95149
    施宇 committed 6 years ago
    14f95149
Apachenote.class.php 3.56 KB
Edit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace Think\Cache\Driver;

use Think\Cache;

/**
 * Apachenote缓存驱动
 */
class Apachenote extends Cache
{

    /**
     * 架构函数
     * @param array $options 缓存参数
     * @access public
     */
    public function __construct($options = array())
    {
        if (!empty($options)) {
            $this->options = $options;
        }
        if (empty($options)) {
            $options = array(
                'host'    => '127.0.0.1',
                'port'    => 1042,
                'timeout' => 10,
            );
        }
        $this->options           = $options;
        $this->options['prefix'] = isset($options['prefix']) ? $options['prefix'] : C('DATA_CACHE_PREFIX');
        $this->options['length'] = isset($options['length']) ? $options['length'] : 0;
        $this->handler           = null;
        $this->open();
    }

    /**
     * 读取缓存
     * @access public
     * @param string $name 缓存变量名
     * @return mixed
     */
    public function get($name)
    {
        $this->open();
        $name = $this->options['prefix'] . $name;
        $s    = 'F' . pack('N', strlen($name)) . $name;
        fwrite($this->handler, $s);

        for ($data = '';!feof($this->handler);) {
            $data .= fread($this->handler, 4096);
        }
        N('cache_read', 1);
        $this->close();
        return '' === $data ? '' : unserialize($data);
    }

    /**
     * 写入缓存
     * @access public
     * @param string $name 缓存变量名
     * @param mixed $value  存储数据
     * @return boolean
     */
    public function set($name, $value)
    {
        N('cache_write', 1);
        $this->open();
        $value = serialize($value);
        $name  = $this->options['prefix'] . $name;
        $s     = 'S' . pack('NN', strlen($name), strlen($value)) . $name . $value;

        fwrite($this->handler, $s);
        $ret = fgets($this->handler);
        $this->close();
        if ("OK\n" === $ret) {
            if ($this->options['length'] > 0) {
                // 记录缓存队列
                $this->queue($name);
            }
            return true;
        }
        return false;
    }

    /**
     * 删除缓存
     * @access public
     * @param string $name 缓存变量名
     * @return boolean
     */
    public function rm($name)
    {
        $this->open();
        $name = $this->options['prefix'] . $name;
        $s    = 'D' . pack('N', strlen($name)) . $name;
        fwrite($this->handler, $s);
        $ret = fgets($this->handler);
        $this->close();
        return "OK\n" === $ret;
    }

    /**
     * 关闭缓存
     * @access private
     */
    private function close()
    {
        fclose($this->handler);
        $this->handler = false;
    }

    /**
     * 打开缓存
     * @access private
     */
    private function open()
    {
        if (!is_resource($this->handler)) {
            $this->handler = fsockopen($this->options['host'], $this->options['port'], $_, $_, $this->options['timeout']);
        }
    }

}