成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP 常用類分享(記錄)

seal_de / 1322人閱讀

摘要:加密解密類由于開(kāi)始廢棄傳統(tǒng)的加密函數(shù)而改用,因此該類支持的版本為簡(jiǎn)易加解密類通用秘鑰所有可用的加密類型可參考構(gòu)造函數(shù)加密類型。

加密解密類

由于 PHP7.1 開(kāi)始廢棄傳統(tǒng)的加密函數(shù) mcrypt_encrypt 而改用 openssl_encrypt,因此該類支持的 PHP 版本為: (PHP 5 >= 5.3.0, PHP 7)

METHOD = $method;
        }
    }

    /**
        * 加密字符串
        *
        * @param String 待加密數(shù)據(jù)
        * @param string 加密秘鑰,若為空,則使用通用秘鑰
        * @return void
        */
    public function encrypt($input, $key = "") {
        if (empty($key)) $key = $this->KEY;
        $data = openssl_encrypt($input, $this->METHOD, $key, OPENSSL_RAW_DATA);
        $data = base64_encode($data);

        return $data;
    }

    /**
        * 解密字符串
        *
        * @param String 待解密字符串
        * @param string 解密秘鑰,若為空,則使用通用秘鑰
        * @return void
        */
    public function decrypt($input, $key = "") {
        if (empty($key)) $key = $this->KEY;
        $data = openssl_decrypt(base64_decode($input), $this->METHOD, $key, OPENSSL_RAW_DATA);

        return $data;
    }
}
發(fā)送郵件類

先下載 PHPMailer,解壓后,將其放置你的項(xiàng)目中,并修改類中的引入路徑。

_init();
        $this->_baseURL = $_SERVER["REQUEST_SCHEME"] . "://" . $_SERVER["HTTP_HOST"];
    }

    private function _init() {
        if ($this->_email == null) {
            $mail = new PHPMailer(true);
            try {
                $mail->SMTPDebug = 0;
                $mail->isSMTP();
                $mail->Host = get_global_config("mail.Host");
                $mail->SMTPAuth = true;
                $mail->Username = get_global_config("mail.Username");
                $mail->Password = get_global_config("mail.Password");
                $mail->SMTPSecure = get_global_config("mail.SMTPSecure");
                $mail->Port = get_global_config("mail.Port");
                $mail->setFrom(get_global_config("mail.Username"), get_global_config("mail.Fromname"));
                $this->_email = $mail;
                return true;
            } catch (Exception $e) {
                // return null;
                return false;
            }
        }
        return true;
    }

    public function sendEmail($toEmail, $toUsername, $subject, $body) {
        if (!$this->_email) return false;
        try {
            $this->_email->addAddress($toEmail, $toUsername);
            $this->_email->isHTML(true);
            $this->_email->Subject = $subject;
            $this->_email->Body    = $body;
            // 當(dāng)郵件不支持 HTML 時(shí)顯示的郵件內(nèi)容
            $this->_email->AltBody = $body;
        
            $this->_email->send();
            // echo "Message has been sent";
            return true;
        } catch (Exception $e) {
            return false;
            // echo "Message could not be sent.";
            // echo "Mailer Error: " . $this->_email->ErrorInfo;
        }
    }
}
模擬鎖

使用 Redis 模擬進(jìn)程鎖,參考至 discuz 的進(jìn)程鎖源碼。

cache = Roc::redis();
        $this->cache->select(Roc::get("redis.db"));
    }

    /**
     * 是否被鎖
     *
     * @param string 鎖名
     * @param integer 上鎖時(shí)間
     * @return boolean
     */
    public function islocked($process, $ttl = 0) {
        $ttl = $ttl < 1 ? 600 : intval($ttl);
        return $this->_status("get", $process) || $this->_find($process, $ttl);
    }

    /**
     * 解鎖
     *
     * @param string 鎖名
     * @return void
     */
    public function unlock($process) {
        $this->_status("rm", $process);
        $this->_cmd("rm", $process);
    }

    private function _status($action, $process) {
        static $plist = array();
        switch ($action) {
            case "set" : $plist[$process] = true; break;
            case "get" : return !empty($plist[$process]); break;
            case "rm" : $plist[$process] = null; break;
            case "clear" : $plist = array(); break;
        }
        return true;
    }

    private function _find($name, $ttl) {

        if(!$this->_cmd("get", $name)) {
            $this->_cmd("set", $name, $ttl);
            $ret = false;
        } else {
            $ret = true;
        }
        // $this->_status("set", $name);
        return $ret;
    }

    private function _cmd($cmd, $name, $ttl = 0) {
        return $this->_process_cmd_memory($cmd, $name, $ttl);
        // static $allowmem;
        // if($allowmem === null) {
        //     $allowmem = Roc::get("redis.db");
        // }
        // if($allowmem) {
        //     return self::_process_cmd_memory($cmd, $name, $ttl);
        // } else {
        //     return false;
        //     // return self::_process_cmd_db($cmd, $name, $ttl);
        // }
    }

    private function _process_cmd_memory($cmd, $name, $ttl = 0) {
        $ret = "";
        $name = "process_lock_".$name;
        switch ($cmd) {
            case "set" :
                $ret = $this->cache->setex($name, time(), $ttl);
                // $ret = memory("set", "process_lock_".$name, time(), $ttl);
                break;
            case "get" :
                $ret = $this->cache->get($name);
                // $ret = memory("get", "process_lock_".$name);
                break;
            case "rm" :
                $ret = $this->cache->delete($name);
                // $ret = memory("rm", "process_lock_".$name);
        }
        echo $cmd . ":";
        var_dump($ret);
        return $ret;
    }

    private function _process_cmd_db($cmd, $name, $ttl = 0) {
        $ret = "";
        switch ($cmd) {
            case "set":
                $ret = C::t("common_process")->insert(array("processid" => $name, "expiry" => time() + $ttl), FALSE, true);
                break;
            case "get":
                $ret = C::t("common_process")->fetch($name);
                if(empty($ret) || $ret["expiry"] < time()) {
                    $ret = false;
                } else {
                    $ret = true;
                }
                break;
            case "rm":
                $ret = C::t("common_process")->delete_process($name, time());
                break;
        }
        return $ret;
    }
}
Redis

一個(gè)簡(jiǎn)易的 Redis 操作類,支持在查找不到緩存時(shí),進(jìn)行相對(duì)應(yīng)的回調(diào)操作。

cache = new Redis();
    }

    // ============= String 操作
    /**
     * 設(shè)置緩存
     *
     * @param String 緩存key值
     * @param String/Object 緩存數(shù)據(jù),可為字符串可為數(shù)組。
     * @param Int 過(guò)期時(shí)間
     * @return Boolean
     */
    public function set($key, $value, $ttl = null) {
        if (is_array($value)) $value = serialize($value);
        if ($ttl !== null && $ttl > 0)
            return $this->cache->setex($this->_key($key), $ttl, $value);
        else
            return $this->cache->set($this->_key($key), $value);
    }

    /**
     * 獲取緩存數(shù)據(jù)
     *
     * @param String 值
     * @param Data 默認(rèn)值,設(shè)置后,如果緩存沒(méi)有數(shù)據(jù)則返回默認(rèn)值
     * @return Data
     */
    public function get($key, $callback = false) {
        $res = $this->cache->get($this->_key($key));
        if ($res === false && $callback === true) {
            $method_name = "_$key";
            if (method_exists($this, $method_name)) {
                return $this->$method_name();
            } else {
                return false;
            }
            
        }
        // 如果反序列化成功,則返回反序列化的數(shù)據(jù)。
        // @防止報(bào) warning。
        if (@unserialize($res) !== false) return unserialize($res);
        return $res;
    }

    /**
     * 刪除緩存
     *
     * @param String 需要?jiǎng)h除的鍵名
     * @return true or false
     */
    public function rm($key) {
        return $this->cache->delete($this->_key($key));
    }

    public function inc($key, $step = 1) {
        return $this->cache->incr($this->_key($key), $step);
    }

    public function dec($key, $step = 1) {
        return $this->cache->decr($this->_key($key), $step);
    }

    private function _key($key) {
        return $this->prefix . $key;
    }

    public function getMultiple($keys) {
        $_keys = [];
        foreach ($keys as $key) $_keys[] = $this->_key($key);
        return $this->cache->getMultiple($_keys);
    }

    // ============== Hash 操作
    public function hset($hash, $key, $value) {
        return $this->cache->hSet($hash, $key, $value);
    }

    public function hget($hash, $key) {
        return $this->cache->hGet($hash, $key);
    }

    public function hgetall($hash) {
        return $this->cache->hGetAll($hash);
    }

    public function hvals($hash) {
        return $this->cache->hVals($hash);
    }

    public function hkeys($hash) {
        return $this->cache->hKeys($hash);
    }


    // ================ 通用回調(diào)
    // Your callback code here.
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26208.html

相關(guān)文章

  • Laravel核心解讀--異常處理

    摘要:請(qǐng)求未通過(guò)的驗(yàn)證時(shí)會(huì)拋出此異常。異常處理是非常重要但又容易讓開(kāi)發(fā)者忽略的功能,這篇文章簡(jiǎn)單解釋了內(nèi)部異常處理的機(jī)制以及擴(kuò)展異常處理的方式方法。 異常處理是編程中十分重要但也最容易被人忽視的語(yǔ)言特性,它為開(kāi)發(fā)者提供了處理程序運(yùn)行時(shí)錯(cuò)誤的機(jī)制,對(duì)于程序設(shè)計(jì)來(lái)說(shuō)正確的異常處理能夠防止泄露程序自身細(xì)節(jié)給用戶,給開(kāi)發(fā)者提供完整的錯(cuò)誤回溯堆棧,同時(shí)也能提高程序的健壯性。 這篇文章我們來(lái)簡(jiǎn)單梳理一下...

    includecmath 評(píng)論0 收藏0
  • PHP小知識(shí)點(diǎn)

    摘要:那些瑣碎的知識(shí)點(diǎn)作者記錄的的很奇特很難記的知識(shí)點(diǎn)。易錯(cuò)知識(shí)點(diǎn)整理注意和的區(qū)別中和都是輸出的作用,但是兩者之間還是有細(xì)微的差別。今天手頭不忙,總結(jié)一下,分享過(guò)程中掌握的知識(shí)點(diǎn)。 深入理解 PHP 之:Nginx 與 FPM 的工作機(jī)制 這篇文章從 Nginx 與 FPM 的工作機(jī)制出發(fā),探討配置背后的原理,讓我們真正理解 Nginx 與 PHP 是如何協(xié)同工作的。 PHP 那些瑣碎的知識(shí)...

    hover_lew 評(píng)論0 收藏0
  • PHP后端組織項(xiàng)目結(jié)構(gòu)的思考

    摘要:介紹下一個(gè)新項(xiàng)目,后端該如何從零去搭建。我們先假設(shè)這個(gè)項(xiàng)目由兩部組成提供給站點(diǎn)使用的提供給運(yùn)營(yíng)人員使用的管理后臺(tái)。因此通過(guò)回顧,我們得出我們的后端項(xiàng)目需要一個(gè)的層次,來(lái)存放業(yè)務(wù)邏輯。 這是 后端開(kāi)發(fā)者從零做一個(gè)移動(dòng)應(yīng)用 的后端部分第二篇。介紹下一個(gè)新項(xiàng)目,后端該如何從零去搭建。我們先假設(shè)這個(gè)項(xiàng)目由兩部組成 提供給wap站點(diǎn)、app使用的api; 提供給運(yùn)營(yíng)人員使用的管理后臺(tái)。 整個(gè)...

    cikenerd 評(píng)論0 收藏0
  • PHP筆試面試題精選(一)

    摘要:,跨站腳本攻擊。實(shí)際發(fā)的請(qǐng)求就是,用于表示這是一個(gè)請(qǐng)求。,用于告知服務(wù)器根據(jù)這個(gè)參數(shù)獲取回調(diào)函數(shù)的名稱,通常約定就叫。,回調(diào)函數(shù)的名稱,也是前面參數(shù)的值,可省略,會(huì)自動(dòng)生成。 本次課程主要圍繞 PHP 面試和筆試中經(jīng)常會(huì)出現(xiàn)的一些知識(shí)點(diǎn),但是面試官會(huì)在筆試題基礎(chǔ)上深入擴(kuò)展,那么你知道如何更好的回答讓面試官滿意嗎?題目收集自騰訊,迅雷,美圖等公司的筆試面試題,以及本人面試經(jīng)歷中印象中的知...

    JohnLui 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.40 - 2018,來(lái)學(xué)習(xí)一門(mén)新的編程語(yǔ)言吧!

    摘要:入門(mén),第一個(gè)這是一門(mén)很新的語(yǔ)言,年前后正式公布,算起來(lái)是比較年輕的編程語(yǔ)言了,更重要的是它是面向程序員的函數(shù)式編程語(yǔ)言,它的代碼運(yùn)行在之上。它通過(guò)編輯類工具,帶來(lái)了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語(yǔ)言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺(jué)已經(jīng)到來(lái)了,總結(jié)過(guò)去的 2017,相信小伙們一定有很多收獲...

    caspar 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<