PHP常用函數(shù)整理

以下是我的常用php函數(shù)固棚,下載文件
鏈接:http://pan.baidu.com/s/1slHlcz7 密碼:0w0a

/**
 * Created by PhpStorm.
 * User: shenjinqiang
 * Date: 20170705
 * Version:v1.3
 * 增加了JSON文件的快速操作類
 * 用戶注銷session
 */
function delDirFiles($dirName, $scanSubDir = false, $ext = '', $delFilemtimeBefore = '')
{
    if (file_exists($dirName) && $handle = opendir($dirName)) {
        while (false !== ($item = readdir($handle))) {
            if ($item != "." && $item != "..") {
                $n_file = $dirName . '/' . $item;
                //echo $n_file . ':';
                if (file_exists($n_file) && is_dir($n_file)) {
                    if ($scanSubDir) {
                        delFile($n_file, true);
                    }
                } else {
                    if ($n_file === rtrim($n_file, $ext)) {
                        if ($delFilemtimeBefore) {
                            $filemtime = filemtime($n_file);
                            //echo $filemtime . '<br>';
                            if ($filemtime !== false) {
                                if ($filemtime < $delFilemtimeBefore) {
                                    unlink($n_file);
                                }
                            }
                        } else {
                            unlink($n_file);
                        }
                    }
                }
            }
        }
        closedir($handle);
    }
}

/**
 * 獲取目錄下的文件名
 * @param $dirName
 * @return array
 */
function getDirList($dirName)
{
    $ret = array();
    if (file_exists($dirName) && $file_list = scandir($dirName)) {
        foreach ($file_list as $item) {
            if ($item != "." && $item != "..") {
                $ret[] = $item;
            }
        }
    }
    return $ret;
}


/** 遞歸獲取目錄下的文件
 * @param string $path
 * @return array
 */
function getDirListLoop($path = './')
{
    $path = rtrim($path, '/') . '/';
    $file = new FilesystemIterator($path);
    $ret = array();
    foreach ($file as $fileinfo) {
        $ret[] = $path . $fileinfo->getFilename();
        if ($fileinfo->isDir()) {
            $subdir_arr = getDirListLoop($path . $fileinfo->getFilename() . '/');
            $ret = array_merge($ret, $subdir_arr);
        }
    }

    return $ret;
}

/*
* 功能:循環(huán)檢測并創(chuàng)建文件夾
* 參數(shù):$path 文件夾路徑 路徑仿吞,請勿包含文件名济蝉,否則文件名也會被創(chuàng)建為目錄
* 返回:
*/
function createDirLoop($path)
{
    if (!file_exists($path)) {
        createDirLoop(dirname($path));
        mkdir($path, 0666);
    }
}

function getErrorString($msg)
{
    echo("<b style='color: red;'> ERROR: </b> $msg <br>");
}

/* * 獲取GET參數(shù)
 * @param $a
 * @return null
 */

function getGet($a)
{
    if (isset($_GET[$a])) {

        return $_GET[$a];
    } else {
        return null;
    }
}

/* * 獲取POST參數(shù)
 * @param $a
 * @return null
 */

function getPost($a)
{
    if (isset($_POST[$a])) {
        return $_POST[$a];
    } else {
        return null;
    }
}

//獲取隨機數(shù)字
function getRandomNum($len = 4)
{
    $n = "";
    for ($i = 0; $i < $len; $i++) {
        $n .= rand(1, 9);
    }
    return $n;
}

//curl請求post
function request_post($url, $post_data = array())
{
    $options = array(
        'http' => array(
            'method' => 'POST',
            'header' => "Content-type: application/x-www-form-urlencoded ",
            'content' => http_build_query($post_data),
        ),
    );

    $result = file_get_contents($url, false, stream_context_create($options));
    return $result;
}

//請求get
function request_get($url)
{
    $html = file_get_contents($url);
    return $html;
}

/* * 獲取GET或POST參數(shù)
 * @param $a
 * @return null
 */

function getRequest($a)
{
    if (isset($_GET[$a])) {
        return $_GET[$a];
    } else if (isset($_POST[$a])) {
        return $_POST[$a];
    } else {
        return null;
    }
}

function getCookie($a)
{
    if (isset($_COOKIE[$a])) {
        return $_COOKIE[$a];
    } else {
        return null;
    }
}

/**
 *  設(shè)置Cookie
 * @param type $key 鍵名
 * @param type $val 指
 * @param type $minute 保留時間驮肉,分鐘
 */
function setCookie_m($key, $val, $minute = null)
{
    if ($minute) {
        setcookie($key, $val, time() + 60 * $minute, '/');
    } else {
        setcookie($key, $val, null, '/');
    }
}

/* * 獲取Session
 * @param $a
 * @return string| null
 */

function getSession($a)
{
    if (!isset($_SESSION)) {
        @session_start();
    }

    if (isset($_SESSION[$a])) {
        return $_SESSION[$a];
    } else {
        return null;
    }
}

/* * 設(shè)置Session
 * @param $a Session的名稱
 * @param $v
 * @return null
 */

function setSession($a, $v)
{
    if (!isset($_SESSION)) {
        @session_start();
    }

    $_SESSION[$a] = $v;
}

/**
 * 注銷當(dāng)前用戶的session
 */
function logoutSession()
{
    if (!isset($_SESSION)) {
        @session_start();
    }
    session_destroy();
}

/* * 獲取GUID
 * @param string $sp 分隔符
 * @return string
 */

function getGuid($sp = "")
{
    @list($usec, $sec) = explode(" ", microtime());
    $currentTimeMillis = $sec . substr($usec, 2, 3);

    $tmp = rand(0, 1) ? '-' : '';
    $nextLong = $tmp . rand(1000, 9999) . rand(1000, 9999) . rand(1000, 9999) . rand(100, 999) . rand(100, 999);
    $getHostID = 'www.jxsbox.com/271833059@qq.com/*';
    $valueBeforeMD5 = $getHostID . ':' . $currentTimeMillis . ':' . $nextLong;
    $valueAfterMD5 = md5($valueBeforeMD5);
    $raw = strtoupper($valueAfterMD5);

    return substr($raw, 0, 8) . $sp . substr($raw, 8, 4) . $sp . substr($raw, 12, 4) . $sp . substr($raw, 16, 4) . $sp . substr($raw, 20);
}

function base62($x)
{
    $show = '';
    while ($x > 0) {
        $s = $x % 62;
        if ($s > 35) {
            $s = chr($s + 61);
        } elseif ($s > 9 && $s <= 35) {
            $s = chr($s + 55);
        }
        $show = $s . $show;
        $x = floor($x / 62);
    }
    if (!$show)
        $show = "0";
    return $show;
}

function getCuid()
{
    @list($usec, $sec) = explode(" ", microtime());
    //$sec = substr($sec, 0, 6);
    $sec_a = substr($sec, 2, 3) + rand(100, 999);
    $sec_b = substr($sec, 5, 5) + rand(100, 999);
    $str_sec = base62($sec_a) . base62($sec_b);
    $str_usec = base62(($usec + rand(1, 9)) * 1000000);
    $left = $str_sec . $str_usec . base62(rand(1000, 9999));

    if (strlen($left) < 12) {
        $left .= base62(rand(0, 9));
    }

    return strtoupper($left);
}

/** 統(tǒng)一消息反饋
 * @param int $r 結(jié)果狀態(tài)譬嚣,一般為0或1
 * @param string $msg 傳遞消息
 * @param null|string $a 第一個參數(shù)
 * @param null|string $b 第二個參數(shù)
 * @param null|string $c 第三個參數(shù)
 * @param null|string $d 第四個參數(shù)
 * @return string Json字符串
 */
function getMsg($r, $msg = "", $a = "", $b = "", $c = "", $d = "")
{
    $_msg = array();
    $_msg['msg'] = $msg;
    $_msg['r'] = $r;
    $_msg['a'] = $a;
    $_msg['b'] = $b;
    $_msg['c'] = $c;
    $_msg['d'] = $d;
    return json_encode($_msg);
}

function getOkMsg($msg = "", $a = "", $b = "", $c = "", $d = "")
{
    $_msg = array();
    $_msg['r'] = 1;
    $_msg['msg'] = $msg;
    $_msg['a'] = $a;
    $_msg['b'] = $b;
    $_msg['c'] = $c;
    $_msg['d'] = $d;
    return json_encode($_msg);
}

function getErrMsg($msg = "", $a = "", $b = "", $c = "", $d = "")
{
    $_msg = array();
    $_msg['r'] = 0;
    $_msg['msg'] = $msg;
    $_msg['a'] = $a;
    $_msg['b'] = $b;
    $_msg['c'] = $c;
    $_msg['d'] = $d;
    return json_encode($_msg);
}

function getNeedLoginMsg($msg = "")
{
    $_msg = array();
    $_msg['r'] = -100;
    $_msg['msg'] = $msg;
    return json_encode($_msg);
}

/**
 * 檢查是否為手機號碼
 * @param $usj
 * @return bool
 */
function checkIsnumber($sj)
{
    //判斷是否為手機號碼
    if (!preg_match("/1[3578]{1}\d{9}$/", $sj)) {
        return false;
    }
    return true;
}

/**
 * 開啟輸出緩存顿天,用flush_outbuff輸出到瀏覽器
 */
function start_outbuff()
{
    if (extension_loaded('zlib')) {
        ob_start('ob_gzhandler');
    }
}

/**
 * 輸出緩存到瀏覽器
 */
function flush_outbuff()
{
    if (extension_loaded('zlib')) {
        ob_end_flush();
    }
}

/* * 加載模型
 * @param $modname 模型名稱蜻韭,不是文件名稱
 * @return bool|null
 */

function loadmod($modname)
{
    //判斷模型文件是否存在如果存在則加載數(shù)據(jù)庫操作模型,模型文件以mod_開頭
    if (file_exists("./mods/m_$modname.php")) {
        //加載模型文件
        include("./mods/m_$modname.php");
        return true;
    } else {
        getErrorString("in 'mods' folder not find file <b>'m_$modname.php'</b>,function loadmod('$modname');");
        return false;
    }
}

/* * 加載文件
 * @param $filename
 * @return bool
 */

function loadfile($filename)
{
    //判斷文件是否存在如果存在
    if (file_exists($filename)) {
        //加載文件
        include($filename);
        return true;
    } else {
        getErrorString("not find file <b>'$filename'</b>,function loadfile('$filename');");
        return false;
    }
}

$readini_arr = null;
$filename_ini = "";

/** 打開配置文件
 * @param $filename
 * @param $onlyget 只獲取
 * @return array|null 打開成功返回所有配置的數(shù)組形式
 */
function ini_open($filename, $onlyget = false)
{
    global $filename_ini;
    global $readini_arr;
    if (!$readini_arr) {
        $readini_arr = array();
    }
    if ($filename_ini != "") {
        //ini操作函數(shù)已經(jīng)打開了傻铣,此函數(shù)同時只能處理一個文件
        getErrorString("ini_file is opened,function ini_open()");
        return null;
    }

    $filename_ini = $filename;
    if (file_exists($filename)) {
        $readini_arr = parse_ini_file($filename, true);
    } else {
        $readini_arr = array();
    }

    if ($onlyget) {
        $filename_ini = "";
    }

    return $readini_arr;
}

/* * 寫ini配置項
 * @param $section
 * @param $key
 * @param $value
 */

function ini_set_key($section, $key, $value)
{
    global $readini_arr;
    $readini_arr[$section][$key] = $value;
}

function ini_set_array($arr)
{
    global $readini_arr;

    foreach ($arr as $section => $key) {
        //print_r($section);
        //print_r($key);
        foreach ($key as $key2 => $value2) {
            $readini_arr[$section][$key2] = $value2;
        }
    }
}

/** 寫出ini配置文件
 * @return bool
 */
function ini_flush()
{
    global $filename_ini;
    global $readini_arr;
    $content = "";
    foreach ($readini_arr as $key => $elem) {
        $content .= "[" . $key . ']' . "\n";
        foreach ($elem as $key2 => $elem2) {
            $content .= $key2 . ' = "' . $elem2 . '"' . "\n";
        }
    }

    if (!$handle = fopen($filename_ini, 'w')) {
        return false;
    }
    if (!fwrite($handle, $content)) {
        return false;
    }
    fclose($handle);
    $filename_ini = "";
    return true;
}

/** 獲取毫秒級別的時間戳
 * @return string
 */
function getMillisecond()
{
    list($t1, $t2) = explode(' ', microtime());
    return sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000) . "";
}

/** 獲取微秒時間戳
 * @return string
 */
function getMicrosecond()
{
    list($t1, $t2) = explode(' ', microtime());
    return sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000000) . "";
}

$filename_json = null;
$readini_arr_json = "";


//$ddd = new DB_JSON("a.json");
//echo print_r($ddd->getValue("a/b/g/"));
//$ddd->setValue("root/a/1", 100);
//$ddd->setValue("root/a/2", 200);
//$ddd->setValue("root/a/3", 300);
//$ddd->setValue("root/a/4", 400);
//$ddd->setValue("root/b/1", 100);
//$ddd->setValue("root/b/2", 200);
//$ddd->arrayPushValue("root/a/v",3);
//$ddd->arrayPushValue("root/a/v",5);
//$ddd->arrayPushValue("root/a/v",9);
//$ddd->arrayPushValue("root/a/v",1);
//$ddd->arrayPushValue("root/a/v",2);
//$ddd->save();

/**
 * Class DB_JSON 操作JSON文件的類
 */
class DB_JSON
{

    private $_filename, $readini_arr_json, $_md5, $readOnly;

    public static function getKeys($arr)
    {
        return array_keys($arr);
    }

    function __construct($filename, $readOnly = false)
    {
        $this->_filename = $filename;
        $this->readOnly = $readOnly;
        if ($filename && file_exists($filename)) {
            //如果不是只讀章贞,則需等待,否則直接讀取
            if (!$this->readOnly) {
                //讀取文件
                //判斷是否鎖定
                while ($this->checkIsLock()) {
                    usleep(300);
                }
            }

            $cont = file_get_contents($filename);

            if (trim($cont)) {
                $this->readini_arr_json = json_decode($cont, true);
            } else {
                $this->readini_arr_json = array();
            }
        } else {
            if (!$this->readOnly) {
                if ($filename) {
                    file_put_contents($filename, "");
                }
            }
            $this->readini_arr_json = array();
        }

        if ($filename) {
            //不是只讀才需要鎖定文件
            if (!$this->readOnly) {
                $this->_md5 = md5_file($filename);
                file_put_contents($this->getLockFile(), getMillisecond());
            }
        }
    }

    //獲取鎖定的文件路徑
    function getLockFile()
    {
        return $this->_filename . '.lock.0';
    }

    function checkIsLock()
    {
        $lockfile = $this->getLockFile();
        if (file_exists($lockfile)) {
            $k = file_get_contents($lockfile);
            if (!$k) {
                //未鎖定
                return false;
            }
            if ((getMillisecond() - $k) >= 20000) {
                //超時設(shè)置為20秒非洲,大于就算未鎖定
                return false;
            } else {
                //鎖定
                return true;
            }
        } else {
            return false;
        }
    }

    /**
     * @param $key  支持層級操作如 root/a/b
     * @param $value
     * @return bool
     */
    function setValue($key, $value)
    {
        $key = trim($key);
        $key = trim($key, "/");
        $path = explode("/", $key);
        for ($i = 0; $i < count($path); $i++) {
            $path[$i] = trim($path[$i]);
        }
        //$this->readini_arr_json[$key] = $value;
        if (!array_key_exists($path[0], $this->readini_arr_json)) {
            $this->readini_arr_json[$path[0]] = array();
        }
        $ret_val = &$this->readini_arr_json[$path[0]];

        for ($i = 1; $i < count($path); $i++) {
            $node = $path[$i];
            if (is_array($ret_val)) {
                if (array_key_exists($node, $ret_val)) {
                    $ret_val = &$ret_val[$node];
                } else {
                    $ret_val[$node] = array();
                    $ret_val = &$ret_val[$node];
                }
            } else {
                return false;
            }
        }
        $ret_val = $value;
    }

    function arrayPushKeyValue($key, $arrayKey, $value)
    {
        $temp = $this->getValue($key, array());
        $temp[$arrayKey] = $value;
        $this->setValue($key, $temp);
        return $temp;
    }

    function arrayPopKey($key, $arrayKey)
    {
        $temp = $this->getValue($key, array());
        unset($temp[$arrayKey]);
        $this->setValue($key, $temp);
        return $temp;
    }

    function arrayPopVal($key, $value)
    {
        $temp = $this->getValue($key, array());
        while (($i = array_search($value, $temp)) !== false) {
            array_splice($temp, $i, 1);
        }
        $this->setValue($key, $temp);
        return $temp;
    }

    /**
     * @param $key
     * @param $value
     * @param bool $distinct 是否去除重復(fù)鸭限,默認為false
     * @return array|mixed|string
     */
    function arrayPushValue($key, $value, $distinct = false)
    {
        $temp = $this->getValue($key, array());
        if ($distinct && !in_array($value, $temp)) {
            $temp[] = $value;
            $this->setValue($key, $temp);
        } else {
            $temp[] = $value;
            $this->setValue($key, $temp);
        }
        return $temp;
    }

    function removeKey($key)
    {
        $key = trim($key);
        $key = trim($key, "/");
        $path = explode("/", $key);
        for ($i = 0; $i < count($path); $i++) {
            $path[$i] = trim($path[$i]);
        }
        $ret_val = &$this->readini_arr_json[$path[0]];
        for ($i = 1; $i < count($path); $i++) {
            $node = $path[$i];
            if ($i == count($path) - 1) {
                unset($ret_val[$node]);
                return true;
            } else if (is_array($ret_val)) {
                if (array_key_exists($node, $ret_val)) {
                    $ret_val = &$ret_val[$node];
                } else {
                    return false;
                }
            } else {
                return false;
            }
        }
        unset($this->readini_arr_json[$path[0]]);
        return true;
    }

    function getValue($key, $defaultValue = "")
    {
        $key = trim($key);
        $key = trim($key, "/");
        $path = explode("/", $key);
        for ($i = 0; $i < count($path); $i++) {
            $path[$i] = trim($path[$i]);
        }
        $ret_val = $defaultValue;
        if (array_key_exists($path[0], $this->readini_arr_json)) {
            $ret_val = $this->readini_arr_json[$path[0]];
            for ($i = 1; $i < count($path); $i++) {
                $node = $path[$i];
                if (is_array($ret_val) && array_key_exists($node, $ret_val)) {
                    $ret_val = $ret_val[$node];
                } else {
                    if (is_array($ret_val)) {
                        return $defaultValue;
                    } else {
                        if ($i == count($path) - 1) {
                            $ret_val = $ret_val[$node];
                        } else {
                            return $defaultValue;
                        }
                    }
                }
            }
        }
        return $ret_val;
    }

    function overWrite($arr)
    {
        $this->readini_arr_json = $arr;
    }

    function getRaw()
    {
        return $this->readini_arr_json;
    }

    function save()
    {
        if ($this->readOnly) {
            //開啟只讀模式不能保存
            return false;
        } else if ($this->_filename) {
            $newMd5 = md5_file($this->_filename);
            if ($newMd5 == $this->_md5) {
                $content = json_encode($this->readini_arr_json);
                if (!$handle = fopen($this->_filename, 'w+')) {
                    return false;
                }
                if (!fwrite($handle, $content)) {
                    return false;
                }
                fclose($handle);
                //更新本次的操作
                $this->_md5 = md5_file($this->_filename);
                return true;
            } else {
                //中間可能操作超時蜕径,被其他的進程或線程修改了文件,所以不能進行保存
                return false;
            }
        } else {
            //沒有文件名败京,無法進行保存
            return false;
        }
    }

    //解除鎖定
    function close()
    {
        if ($this->readOnly) {
            //開啟只讀模式不需要關(guān)閉兜喻,也不允許關(guān)閉
            return;
        }

        if ($this->_filename && file_exists($this->_filename)) {
            $newMd5 = md5_file($this->_filename);
            if ($newMd5 == $this->_md5) {
                @file_put_contents($this->getLockFile(), '');
                $this->_filename = "";
            }
        }
    }

    function __destruct()
    {
        $this->close();
    }

}

function tofloat($num)
{
    $dotPos = strrpos($num, '.');
    $commaPos = strrpos($num, ',');
    $sep = (($dotPos > $commaPos) && $dotPos) ? $dotPos :
        ((($commaPos > $dotPos) && $commaPos) ? $commaPos : false);

    if (!$sep) {
        return floatval(preg_replace("/[^0-9]/", "", $num));
    }

    return floatval(
        preg_replace("/[^0-9]/", "", substr($num, 0, $sep)) . '.' .
        preg_replace("/[^0-9]/", "", substr($num, $sep + 1, strlen($num)))
    );
}

/** 獲得當(dāng)前時間,格式為2015-02-02 14:01:05
 * @param string $sp1 第一個分隔符喧枷,分割年-月-日虹统,默認-
 * @param string $sp2 第二個分隔符,分割日期與時間隧甚,默認為空格
 * @param string $sp3 第三個分隔符车荔,時間間的分割,默認:
 * @return string 返回當(dāng)前的時間
 */
function getNow($sp1 = "-", $sp2 = " ", $sp3 = ":")
{
    return date("Y" . $sp1 . "m" . $sp1 . "d" . $sp2 . "H" . $sp3 . "i" . $sp3 . "s");
}

/**
 * 獲取表示sqlite當(dāng)前時間的字符串
 * @param string $xg 修改戚扳,可以為+int second  -int minute
 * @return string
 */
function getNow_SQLITE($xg = '')
{
    if ($xg) {
        return "DATETIME('now','localtime'," . $xg . ")";
    } else {
        return "DATETIME('now','localtime')";
    }
}

//
// Function: 獲取遠程圖片并把它保存到本地
//
//
//   確定您有把文件寫入本地服務(wù)器的權(quán)限
//
//
// 變量說明:
// $url 是遠程圖片的完整URL地址忧便,不能為空。
// $filename 是可選變量: 如果為空帽借,本地文件名將基于時間和日期
// 自動生成.
function getImage($url, $save_filename = "")
{
    if ($url == "")
        return false;
    if ($save_filename == "") {
        $save_filename = date("dMYHis");
    }
    $img = file_get_contents($url);
    $size = strlen($img);
    $fp2 = @fopen($save_filename, "w+");
    fwrite($fp2, $img);
    fclose($fp2);
    return true;
}

function saveBase64Image($imgBase64, $filename = "")
{
    $base64_image_content = $imgBase64;
    //匹配出圖片的格式
    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)) {
        $type = strtolower($result[2]);
        $exts = "jpg,jpeg,png,gif,bmp";
        if (stripos($exts, $type) === false) {
            return false;
        }
        if (!$filename) {
            $new_file = UploadDir . "/image/" . date("Ymd") . "/";
            if (!file_exists($new_file)) {
                mkdir($new_file, 0777);
            }
            $new_file = $new_file . getCuid() . ".{$type}";
        } else {
            $new_file = $filename;
        }
        if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content))) !== false) {
            return SystemDir . $new_file;
        } else {
            return false;
        }
    }
    return false;
}

function keywordInArray($array = array(), $keyword = array(), $fanwei = array())
{
    if (!$keyword || !$array) {
        return false;
    }
    if ($fanwei) {
        foreach ($fanwei as $f) {
            foreach ($keyword as $ky) {
                foreach ($array as $k => $v) {
                    if ($k == $f && false !== stripos($v, $ky)) {
                        return true;
                    }
                }
            }
        }
    } else {
        foreach ($keyword as $ky) {
            foreach ($array as $k => $v) {
                if (stripos($v, $ky)) {
                    return true;
                }
            }
        }
    }
    return false;
}

function dateFormat($format, $date)
{
    return date($format, strtotime($date));
}

function ifnull($val, $default)
{
    if (!$val) {
        return $default;
    }
    return $val;
}

/**
 * 微信獲取用戶信息
 * @param $appid AppID
 * @param $appsecret  AppSecret
 * @return string  返回用戶信息或錯誤信息
 */
function getWxUserinfo($appid, $appsecret)
{
    $code = getRequest("code");
    $state = getRequest("state");

    //echo $code;
    $ret_arr = array();
    if (!$code || empty($code)) {
        $ret_arr['err'] = "授權(quán)失敗";
        return $ret_arr;
    }
    $access_token = getAccessToken($appid, $appsecret, $code);
    //file_put_contents("./temp/access_token.txt", json_encode($access_token));
    //echo $access_token;
    if (isset($access_token->errcode)) {
        $ret_arr['errcode'] = $access_token->errcode;
        $ret_arr['err'] = $access_token->errmsg;
        return $ret_arr;
    }

    $user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token->access_token . '&openid=' . $access_token->openid . '&lang=zh_CN';

//轉(zhuǎn)成對象
    $user_info = json_decode(file_get_contents($user_info_url), true);


//    echo $access_token;
    if (isset($user_info->errcode)) {
        $ret_arr['errcode'] = $user_info->errcode;
        $ret_arr['err'] = '用戶信息獲取錯誤:' . $user_info->errmsg;
        return $ret_arr;
    }
    //file_put_contents("./temp/user_info.txt", json_encode($user_info));
    return $user_info;
}

function getAccessToken($appid, $appsecret, $code)
{
    $token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $appid . '&secret=' . $appsecret . '&code=' . $code . '&grant_type=authorization_code';
    $token = json_decode(file_get_contents($token_url));
    // echo $token;
    if (isset($token->errcode)) {
        $ret_arr['errcode'] = $token->errcode;
        $ret_arr['err'] = $token->errmsg;
        return $ret_arr;
    }
    $access_token_url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=' . $appid . '&grant_type=refresh_token&refresh_token=' . $token->refresh_token;
    //轉(zhuǎn)成對象
    $acc = file_get_contents($access_token_url);
    $access_token = json_decode($acc);
    return $access_token;
}

function getHeaderXls($filename = '')
{
    if (!$filename) {
        $filename = "表格-" . getNow('', '', '');
    }
    header("Content-Type: application/vnd.ms-excel; charset=UTF-8");
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header("Content-Transfer-Encoding: binary ");
    header("Content-Disposition:attachment;filename=$filename.xls");
}

function echo_XLS_Content($filename = '', $tables_string = "")
{
    getHeaderXls($filename);
    $html_header = '<!doctype html><html lang="zh"><head><meta charset="UTF-8"><title></title></head><body>';
    echo $html_header . $tables_string . "<body></html>";
}


/*
 時間到時間描述
 time 是時間戳
 */
function date2info($time = NULL)
{
    $text = '';
    $time = $time === NULL || $time > time() ? time() : intval($time);
    $t = time() - $time; //時間差 (秒)
    $y = date('Y', $time) - date('Y', time());//是否跨年
    switch ($t) {
        case $t == 0:
            $text = '剛剛';
            break;
        case $t < 60:
            $text = $t . '秒前'; // 一分鐘內(nèi)
            break;
        case $t < 60 * 60:
            $text = floor($t / 60) . '分鐘前'; //一小時內(nèi)
            break;
        case $t < 60 * 60 * 24:
            $text = floor($t / (60 * 60)) . '小時前'; // 一天內(nèi)
            break;
        case $t < 60 * 60 * 24 * 3:
            $text = floor($t / (60 * 60 * 24)) == 1 ? '昨天 ' . date('H:i', $time) : '前天 ' . date('H:i', $time); //昨天和前天
            break;
        case $t < 60 * 60 * 24 * 30:
            $text = date('m月d日 H:i', $time); //一個月內(nèi)
            break;
        case $t < 60 * 60 * 24 * 365 && $y == 0:
            $text = date('m月d日', $time); //一年內(nèi)
            break;
        default:
            $text = date('Y-m-d H:i', $time); //一年以前
            break;
    }
    return $text;
}


/**
 * 高效取出兩個數(shù)組的差集 ,比原生的array_diff快N倍
 * warning: 函數(shù)體內(nèi) $array_2 會被鍵值對調(diào)珠增,如果有重復(fù)的元素將不能使用這個函數(shù)
 */
function array_diff_fast($array_1, $array_2)
{
    $array_2 = array_flip($array_2);
    foreach ($array_1 as $key => $item) {
        if (isset($array_2[$item])) {
            unset($array_1[$key]);
        }
    }

    return $array_1;
}

/**
 * 為url自動添加上http://
 * @param string $url
 * @return string $url
 */
function add_http($url)
{
    if (!preg_match("/^(http|https):/i", trim($url))) $url = 'http://' . $url;

    return $url;
}

function add_https($url)
{
    if (!preg_match("/^(http|https):/i", trim($url))) $url = 'https://' . $url;

    return $url;
}

/**
 * 輸出指定數(shù)量的換行標簽
 * @param int $num
 */
function br($num = 1)
{
    return str_repeat("<br />", $num);
}

/**
 * 獲取Unix時間戳浮點數(shù)
 * 參數(shù)為空返回當(dāng)前Unix時間戳浮點數(shù)
 * 參數(shù)為 start 或 s :標記程序開始時間浮點數(shù);返回空
 * 參數(shù)為 end 或 e :返回程序執(zhí)行所消耗的時間
 * @return 單位:秒
 * eg:
 * current_microtime('start');
 * sleep(3);
 * echo current_microtime('end');
 */
function current_microtime($type = '')
{

    $current_time = microtime(true);

    if ('' == $type) return $current_time;

    static $_start_time;

    switch ($type) {
        case 'start':
        case 's':
            $_start_time = $current_time;
            break;

        case 'end':
        case 'e':
            if (empty($_start_time)) return 'not found start position.';
            $use_time = $current_time - $_start_time;
            unset($_start_time);
            return $use_time;
            break;

        default:
            return $current_time;
            break;
    }

}

/**
 * 有些服務(wù)器禁止使用file_get_contents()函數(shù)砍艾,代替file_get_contents函數(shù)的curl
 * @param string $url
 * @param array $options
 */

function curl_get_contents($url, $options = array(), $get_code = FALSE)
{
    $ch = curl_init();

    $default_options = array(
        'CURLOPT_URL' => $url,
        'CURLOPT_CUSTOMREQUEST' => 'POST',
        'CURLOPT_RETURNTRANSFER' => 1,
        'CURLOPT_TIMEOUT' => 3,
    );

    $options = $options ? array_merge($default_options, $options) : $default_options;


    foreach ($options as $option => $value) {
        curl_setopt($ch, constant($option), $value);
    }

    $rt = curl_exec($ch);

    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    return $get_code ? $httpCode : $rt;

}

/**
 * curl 獲取HTTP 狀態(tài)碼
 * @param string $url
 * @param array $options
 */
function curl_get_http_code($url, $options = array())
{
    return curl_get_contents($url, $options, true);
}

/**
 * 使用虛假IP蒂教,發(fā)起CURL請求
 * @param string $url
 * @param string $ip
 * @param array $options
 */
function curl_fake_ip($url, $ip = '', $options = array())
{

    $ip = $ip ?: make_ip();

    $client_ip = 'CLIENT-IP:' . $ip;
    $x_forwarded_for = 'X-FORWARDED-FOR:' . $ip;

    $http_header = array($client_ip, $x_forwarded_for);

    if ($options && array_key_exists('CURLOPT_HTTPHEADER', $options))
        $http_header = array_merge($http_header, $options['CURLOPT_HTTPHEADER']);

    $request_data = array('CURLOPT_HTTPHEADER' => $http_header);

    $options = $options ? array_merge($options, $request_data) : $request_data;

    return curl_get_contents($url, $options);

}

/**
 * 隨機生產(chǎn)一個有效的IP地址
 */
function make_ip()
{
    return rand(1, 255) . '.' . rand(0, 255) . '.' . rand(0, 255) . '.' . rand(0, 255);
}


/**
 * 友好的輸入變量 dump [+ die]
 * @param mixed $var
 * @param bool $die
 */

function dd($var, $die = false)
{
    echo '<pre>';

    var_dump($var);

    echo '</pre>';

    if (!$die) die;
}

/**
 * 文件下載
 * @param string $file
 */
function download_file($file)
{


    $file = parse_document_root($file);

    if ((isset($file)) && (file_exists($file))) {
        header("Content-length: " . filesize($file));
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . basename($file) . '"');
        return readfile("$file");
    } else {
        return "File Not Found!";
    }
}


/**
 * 獲取當(dāng)前頂級域名
 */
function top_domain()
{
    $host = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'] . ($_SERVER['SERVER_PORT'] == '80' ? '' : ':' . $_SERVER['SERVER_PORT']));

    $host = strtolower($host);
    if (strpos($host, '/') !== false) {
        $parse = @parse_url($host);
        $host = $parse['host'];
    }
    $topleveldomaindb = array('com', 'edu', 'gov', 'int', 'mil', 'net', 'org', 'biz', 'info', 'pro', 'name', 'museum', 'coop', 'aero', 'xxx', 'idv', 'mobi', 'cc', 'me', 'asia', 'mobi', 'tech', 'wang');
    $str = '';
    foreach ($topleveldomaindb as $v) {
        $str .= ($str ? '|' : '') . $v;
    }
    $matchstr = "[^\.]+\.(?:(" . $str . ")|\w{2}|((" . $str . ")\.\w{2}))$";
    if (preg_match("/" . $matchstr . "/ies", $host, $matchs)) {
        $domain = $matchs['0'];
    } else {
        $domain = $host;
    }
    return $domain;
}


/**
 * 把HTMl代碼轉(zhuǎn)換為實體,支持多維數(shù)組遞歸轉(zhuǎn)換
 *
 * @param  mixed $value
 * @return string
 */
function e($value)
{
    return is_array($value) ? array_map('e', $value) : htmlentities($value, ENT_QUOTES, 'UTF-8', false);
}


/**
 * 檢測是否是Ajax提交
 *
 * @return void
 */
function is_ajax_request()
{
    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
}

/**
 * 判斷是否SSL協(xié)議
 * @return boolean
 */
function is_ssl()
{
    if (isset($_SERVER['HTTPS']) && ('1' == $_SERVER['HTTPS'] || 'on' == strtolower($_SERVER['HTTPS']))) {
        return true;
    } elseif (isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'])) {
        return true;
    }
    return false;
}

/**
 * 檢測是否是本地IP
 */
function is_local_ip()
{
    $serverIP = $_SERVER['SERVER_ADDR'];
    if ($serverIP == '127.0.0.1') return true;
    if (strpos($serverIP, '10.60') !== false) return false;
    return !filter_var($serverIP, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE);
}

/**
 * 檢測是否是郵箱地址
 */
function is_email($str)
{
    return (!preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
}


/**
 * 檢測是否是UTF8字符集
 */
function is_utf8($string)
{
    $c = 0;
    $b = 0;
    $bits = 0;
    $len = strlen($string);

    for ($i = 0; $i < $len; $i++) {
        $c = ord($string[$i]);

        if ($c > 128) {
            if (($c >= 254)) return false;
            elseif ($c >= 252) $bits = 6;
            elseif ($c >= 248) $bits = 5;
            elseif ($c >= 240) $bits = 4;
            elseif ($c >= 224) $bits = 3;
            elseif ($c >= 192) $bits = 2;
            else return false;

            if (($i + $bits) > $len) return false;

            while ($bits > 1) {
                $i++;
                $b = ord($string[$i]);
                if ($b < 128 || $b > 191) return false;
                $bits--;
            }
        }
    }
    return true;
}


/*
* 列出目錄下的所有匹配文件
* @param string $dir
* @param string $pattern
* @return array $files
*/
function ls($dir, $pattern = '')
{
    $files = array();
    $dir = realpath($dir);
    if (is_dir($dir)) $files = glob($dir . DIRECTORY_SEPARATOR . '*' . $pattern);
    return empty($files) ? array() : $files;
}

/**
 * 記錄調(diào)試信息到文件
 * @param mixed $msg ,支持直接傳入數(shù)組
 * @param string $filename ; @default = debug_時間年月日.txt
 * @param string $path ; @default = "."; 根目錄請傳參: “/”
 */
function log_record($msg = '', $filename = '', $path = '.')
{
    static $debug_log_record_number = 0;
    $debug_log_record_number++;

    @$msg = is_array($msg) || is_object($msg) ? var_export($msg, true) : $msg;

    $function_call_info = debug_backtrace();
    $function_call_info = array_shift($function_call_info);


    $delimit = str_repeat('-', 30) . PHP_EOL;

    $message = '[ #' . $debug_log_record_number . ' ]' . PHP_EOL;
    $message .= $delimit;
    $message .= '[DATE] ' . date('Y-m-d H:i:s') . PHP_EOL;
    $message .= '[URI] ' . $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . PHP_EOL;
    $message .= '[REMOTE_ADDR] ' . $_SERVER['REMOTE_ADDR'] . PHP_EOL;
    $message .= '[POSITION] ' . $function_call_info['file'] . ':' . $function_call_info['line'] . PHP_EOL;
    $message .= '[MESSAGE] ' . $msg . PHP_EOL;
    $message .= $delimit . PHP_EOL;

    $filename = $filename ? rtrim($filename, '.txt') . '.txt' : 'debug_' . date('Ymd') . '.txt';

    if ($path == '/') $path = $_SERVER['DOCUMENT_ROOT'];


    return file_put_contents(rtrim($path, '/') . '/' . $filename, $message, FILE_APPEND);
}


/**
 * 遞歸創(chuàng)建目錄
 * @example  mkdirs('/a/b/c/d');
 */
function mkdirs($dir, $mode = 0777)
{
    if (substr($dir, 0, 1) == '/') $dir = $_SERVER['DOCUMENT_ROOT'] . $dir;

    if (is_dir($dir) || @mkdir($dir, $mode)) return TRUE;
    if (!mkdirs(dirname($dir), $mode)) return FALSE;

    return @mkdir($dir, $mode);
}


/**
 * 偽造404頁面
 */
function not_found()
{
    send_http_status(404);

    exit('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL ' . $_SERVER["SCRIPT_NAME"] . ' was not found on this server.</p></body></html>');
}

/**
 * 把“/”解析為根目錄
 * @param string $path
 * @return string $path
 */
function parse_document_root($path)
{
    return substr($path, 0, 1) == '/' ? $_SERVER['DOCUMENT_ROOT'] . $path : $path;
}


/**
 * 生產(chǎn)一個唯一的訂單號
 * @param string $prefix
 * @return string $order_no
 */
function build_order_no($prefix = '')
{
    return $prefix . date('YmdHi') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}


/**
 * 生產(chǎn)一個可指定長度的隨機字符串
 * @param number $length zh - max:1000
 * @param string $type {1:0-9 ; a:a-z ; A:A-Z ; default:mixed}
 * @return string
 */
function build_random($length = 16, $type = "mix")
{

    switch ($type) {
        case '1':
        case 'num':
            $pool = '0123456789';
            break;
        case 'a':
        case 'lower':
            $pool = 'abcdefghijklmnopqrstuvwxyz';
            break;
        case 'A':
        case 'upper':
            $pool = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
            break;
        case 'zh':
        case 'cn':
            $pool = simple_chinese(true);
            return join("", array_rand(array_flip($pool), ($length > 1000) ? 1000 : $length));
            break;
        case 'mix':
        default:
            $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            break;
    }

    return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);

}

/**
 * 獲取中文
 * return string or array/string $chinese
 */
function simple_chinese($type = false)
{
    $pool = '們以我到他會作時要動國產(chǎn)的一是工就年階義發(fā)成部民可出能方進在了不和有大這主中人上為來分生對于學(xué)下級地個用同行面說種過命度革而多子后自社加小機也經(jīng)力線本電高量長黨得實家定深法表著水理化爭現(xiàn)所二起政三好十戰(zhàn)無農(nóng)使性前等反體合斗路圖把結(jié)第里正新開論之物從當(dāng)兩些還天資事隊批點育重其思與間內(nèi)去因件日利相由壓員氣業(yè)代全組數(shù)果期導(dǎo)平各基或月毛然如應(yīng)形想制心樣干都向變關(guān)問比展那它最及外沒看治提五解系林者米群頭意只明四道馬認次文通但條較克又公孔領(lǐng)軍流入接席位情運器并飛原油放立題質(zhì)指建區(qū)驗活眾很教決特此常石強極土少已根共直團統(tǒng)式轉(zhuǎn)別造切九你取西持總料連任志觀調(diào)七么山程百報更見必真保熱委手改管處己將修支識病象幾先老光專什六型具示復(fù)安帶每東增則完風(fēng)回南廣勞輪科北打積車計給節(jié)做務(wù)被整聯(lián)步類集號列溫裝即毫知軸研單色堅據(jù)速防史拉世設(shè)達爾場織歷花受求傳口斷況采精金界品判參層止邊清至萬確究書術(shù)狀廠須離再目海交權(quán)且兒青才證低越際八試規(guī)斯近注辦布門鐵需走議縣兵固除般引齒千勝細影濟白格效置推空配刀葉率述今選養(yǎng)德話查差半敵始片施響收華覺備名紅續(xù)均藥標記難存測士身緊液派準斤角降維板許破述技消底床田勢端感往神便賀村構(gòu)照容非搞亞磨族火段算適講按值美態(tài)黃易彪服早班麥削信排臺聲該擊素張密害侯草何樹肥繼右屬市嚴徑螺檢左頁抗蘇顯苦英快稱壞移約巴材省黑武培著河帝僅針怎植京助升王眼她抓含苗副雜普談圍食射源例致酸舊卻充足短劃劑宣環(huán)落首尺波承粉踐府魚隨考刻靠夠滿夫失包住促枝局菌桿周護巖師舉曲春元超負砂封換太模貧減陽揚江析畝木言球朝醫(yī)校古呢稻宋聽唯輸滑站另衛(wèi)字鼓剛寫劉微略范供阿塊某功套友限項余倒卷創(chuàng)律雨讓骨遠幫初皮播優(yōu)占死毒圈偉季訓(xùn)控激找叫云互跟裂糧粒母練塞鋼頂策雙留誤礎(chǔ)吸阻故寸盾晚絲女散焊功株親院冷徹彈錯散商視藝滅版烈零室輕血倍缺厘泵察絕富城沖噴壤簡否柱李望盤磁雄似困鞏益洲脫投送奴側(cè)潤蓋揮距觸星松送獲興獨官混紀依未突架寬冬章濕偏紋吃執(zhí)閥礦寨責(zé)熟穩(wěn)奪硬價努翻奇甲預(yù)職評讀背協(xié)損棉侵灰雖矛厚羅泥辟告卵箱掌氧恩愛停曾溶營終綱孟錢待盡俄縮沙退陳討奮械載胞幼哪剝迫旋征槽倒握擔(dān)仍呀鮮吧卡粗介鉆逐弱腳怕鹽末陰豐霧冠丙街萊貝輻腸付吉滲瑞驚頓擠秒懸姆爛森糖圣凹陶詞遲蠶億矩康遵牧遭幅園腔訂香肉弟屋敏恢忘編印蜂急拿擴傷飛露核緣游振操央伍域甚迅輝異序免紙夜鄉(xiāng)久隸缸夾念蘭映溝乙嗎儒殺汽磷艱晶插埃燃歡鐵補咱芽永瓦傾陣碳演威附牙芽永瓦斜灌歐獻順豬洋腐請透司危括脈宜笑若尾束壯暴企菜穗楚漢愈綠拖牛份染既秋遍鍛玉夏療尖殖井費州訪吹榮銅沿替滾客召旱悟刺腦措貫藏敢令隙爐殼硫煤迎鑄粘探臨薄旬善福縱擇禮愿伏殘雷延煙句純漸耕跑澤慢栽魯赤繁境潮橫掉錐希池敗船假亮謂托伙哲懷割擺貢呈勁財儀沉煉麻罪祖息車穿貨銷齊鼠抽畫飼龍庫守筑房歌寒喜哥洗蝕廢納腹乎錄鏡婦惡脂莊擦險贊鐘搖典柄辯竹谷賣亂虛橋奧伯趕垂途額壁網(wǎng)截野遺靜謀弄掛課鎮(zhèn)妄盛耐援扎慮鍵歸符慶聚繞摩忙舞遇索顧膠羊湖釘仁音跡碎伸燈避泛亡答勇頻皇柳哈揭甘諾概憲濃島襲誰洪謝炮澆斑訊懂靈蛋閉孩釋乳巨徒私銀伊景坦累勻霉杜樂勒隔彎績招紹胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗堿殊崗?fù)谑先袆《押蘸尚睾馇谀て邱v案刊秧緩?fù)挂奂舸ㄑ╂湞O啦臉戶洛孢勃盟買楊宗焦賽旗濾硅炭股坐蒸凝竟陷槍黎救冒暗洞犯筒您宋弧爆謬涂味津臂障褐陸啊健尊豆拔莫抵桑坡縫警挑污冰柬嘴啥飯塑寄趙喊墊丹渡耳刨虎筆稀昆浪薩茶滴淺擁穴覆倫娘噸浸袖珠雌媽紫戲塔錘震歲貌潔剖牢鋒疑霸閃埔猛訴刷狠忽災(zāi)鬧喬唐漏聞沈熔氯荒莖男凡搶像漿旁玻亦忠唱蒙予紛捕鎖尤乘烏智淡允叛畜俘摸銹掃畢璃寶芯爺鑒秘凈蔣鈣肩騰枯拋軌堂拌爸循誘祝勵肯酒繩窮塘燥泡袋朗喂鋁軟渠顆慣貿(mào)糞綜墻趨彼屆墨礙啟逆卸航衣孫齡嶺騙休借';

    if ($type) {
        preg_match_all("/./su", $pool, $array);

        return $array[0];
    }

    return $pool;
}


/**
 * 去除BOM
 */
function remove_utf8_bom($string)
{
    if (substr($string, 0, 3) == pack('CCC', 239, 187, 191)) return substr($string, 3);

    return $string;
}

/**
 * 去除JS的代碼
 */
function remove_script($string)
{
    return preg_replace("'<script(.*?)<\/script>'is", "", $string);
}


/**
 * URL重定向
 * @param string $url 重定向的URL地址
 * @param integer $time 重定向的等待時間(秒)
 * @param string $msg 重定向前的提示信息
 * @return void
 */
function redirect($url, $time = 0, $msg = '')
{
    //多行URL地址支持
    $url = str_replace(array("\n", "\r"), '', $url);
    if (empty($msg))
        $msg = "Automatically jump to {$url} after {$time} seconds.";
    if (!headers_sent()) {
        // redirect
        if (0 === $time) {
            header('Location: ' . $url);
        } else {
            header("refresh:{$time};url={$url}");
            echo($msg);
        }
        exit();
    } else {
        $str = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
        if ($time != 0)
            $str .= $msg;
        exit($str);
    }
}

/**
 * 發(fā)送HTTP狀態(tài)
 * @param integer $code 狀態(tài)碼
 * @return void
 */
function send_http_status($code)
{
    $_status = array(
        200 => 'OK',
        301 => 'Moved Permanently',
        302 => 'Moved Temporarily ',
        400 => 'Bad Request',
        403 => 'Forbidden',
        404 => 'Not Found',
        500 => 'Internal Server Error',
        503 => 'Service Unavailable',
    );
    if (isset($_status[$code])) {
        header('HTTP/1.1 ' . $code . ' ' . $_status[$code]);
        // 確保FastCGI模式下正常
        header('Status:' . $code . ' ' . $_status[$code]);
    }
}


/**
 * 退出,清空session
 */
function session_logout()
{
    session_destroy();
    unset($_SESSION);
}

/**
 * 增強版 截取字符串脆荷,支持多語言凝垛,例如中文
 * @param string $string
 * @param int $offset 非負,從0計數(shù)
 * @param int $length 截取長度
 * @param string $append 結(jié)尾拼接字符蜓谋,如“...”
 * @return string $string
 * @example str_slice($chinese , 0, 5 ,'...');
 */
function str_slice($string, $offset = 0, $length = '')
{
    if ('' == $length) {
        $length = $offset;
        $offset = 0;
    }
    if (function_exists('mb_substr')) return mb_substr($string, $offset, $length, 'utf-8');

    preg_match_all("/./su", $string, $data);

    return join("", array_slice($data[0], $offset, $length));
}


/**
 * 讓 str_replace() 只替換一次
 * @param $needle 將要被替換的內(nèi)容
 * @param $replace 替換后的內(nèi)容
 * @param $haystack 需要處理的內(nèi)容
 */
function str_replace_once($needle, $replace, $haystack)
{

    $pos = strpos($haystack, $needle);

    if ($pos === false) return $haystack;

    return substr_replace($haystack, $replace, $pos, strlen($needle));
}


/**
 * 去除代碼中的空白和注釋
 * @param string $content 代碼內(nèi)容
 * @return string
 */
function strip_php_whitespace($content)
{
    $stripStr = '';
    //分析php源碼
    $tokens = token_get_all($content);
    $last_space = false;
    for ($i = 0, $j = count($tokens); $i < $j; $i++) {
        if (is_string($tokens[$i])) {
            $last_space = false;
            $stripStr .= $tokens[$i];
        } else {
            switch ($tokens[$i][0]) {
                //過濾各種PHP注釋
                case T_COMMENT:
                case T_DOC_COMMENT:
                    break;
                //過濾空格
                case T_WHITESPACE:
                    if (!$last_space) {
                        $stripStr .= ' ';
                        $last_space = true;
                    }
                    break;
                case T_START_HEREDOC:
                    $stripStr .= "<<<HEREDOC\n";
                    break;
                case T_END_HEREDOC:
                    $stripStr .= "HEREDOC;\n";
                    for ($k = $i + 1; $k < $j; $k++) {
                        if (is_string($tokens[$k]) && $tokens[$k] == ';') {
                            $i = $k;
                            break;
                        } else if ($tokens[$k][0] == T_CLOSE_TAG) {
                            break;
                        }
                    }
                    break;
                default:
                    $last_space = false;
                    $stripStr .= $tokens[$i][1];
            }
        }
    }
    return $stripStr;
}


/**
 * 刪除php源碼中的注釋
 * @param string $content
 * @return No Comment content
 */
function strip_php_comment($content)
{
    $stripStr = '';
    //分析php源碼
    $tokens = token_get_all($content);

    for ($i = 0, $j = count($tokens); $i < $j; $i++) {
        if (is_string($tokens[$i])) {

            $stripStr .= $tokens[$i];
        } else {
            switch ($tokens[$i][0]) {
                //過濾各種PHP注釋
                case T_COMMENT:
                case T_DOC_COMMENT:
                    break;

                default:
                    $stripStr .= $tokens[$i][1];
            }
        }
    }
    return $stripStr;
}

/* 去除html空格與換行 */
function strip_html_whitespace($content)
{
    $find = array("~>\s+<~", "~>(\s+\n|\r)~");
    $replace = array('><', '>');

    return preg_replace($find, $replace, $content);
}


/**
 * XML編碼
 * @param mixed $data 數(shù)據(jù)
 * @param string $encoding 數(shù)據(jù)編碼
 * @param string $root 根節(jié)點名
 * @return string
 */
function xml_encode($data, $encoding = 'utf-8', $root = 'root')
{
    $xml = '<?xml version="1.0" encoding="' . $encoding . '"?>';
    $xml .= '<' . $root . '>';
    $xml .= data_to_xml($data);
    $xml .= '</' . $root . '>';
    return $xml;
}

/**
 * 數(shù)據(jù)XML編碼
 * @param mixed $data 數(shù)據(jù)
 * @return string
 */
function data_to_xml($data)
{
    $xml = '';
    foreach ($data as $key => $val) {
        is_numeric($key) && $key = "item id=\"$key\"";
        $xml .= "<$key>";
        $xml .= (is_array($val) || is_object($val)) ? data_to_xml($val) : $val;
        list($key,) = explode(' ', $key);
        $xml .= "</$key>";
    }
    return $xml;
}


/**
 * 把駝峰命名法轉(zhuǎn)換成下劃線拼接命名法
 * @param string $str
 * @return string
 */
function camecase_to_underline($str)
{
    $temp_array = array();
    for ($i = 0; $i < strlen($str); $i++) {
        $ascii_code = ord($str[$i]);
        if ($ascii_code >= 65 && $ascii_code <= 90) {
            if ($i == 0) {
                $temp_array[] = chr($ascii_code + 32);
            } else {
                $temp_array[] = '_' . chr($ascii_code + 32);
            }
        } else {
            $temp_array[] = $str[$i];
        }
    }
    return implode('', $temp_array);

}

/**
 * 把下劃線拼接命名法轉(zhuǎn)換成駝峰命名法
 * @param string $str
 * @param boolean $ucfirst
 * @return string
 */
function underline_to_camecase($str, $ucfirst = true)
{
    $str = explode('_', $str);

    foreach ($str as $key => $val)
        $str[$key] = ucfirst($val);

    if (!$ucfirst)
        $str[0] = strtolower($str[0]);

    return implode('', $str);
}

/**
 * 獲取內(nèi)存使用情況
 * @return string
 */
function memory_usage()
{
    return (!function_exists('memory_get_usage')) ? '0' : round(memory_get_usage() / 1024 / 1024, 2) . 'MB';

}


/**
 * 字節(jié)格式化 把字節(jié)數(shù)格式為 B K M G T 描述的大小
 * @return string
 */
function byte_format($size, $dec = 2)
{
    $unit = array("B", "KB", "MB", "GB", "TB", "PB");
    $pos = 0;
    while ($size >= 1024) {
        $size /= 1024;
        $pos++;
    }
    return round($size, $dec) . " " . $unit[$pos];
}


/**
 * 檢測是否是一個匿名函數(shù)
 * @param mixed $var
 * @return boolean
 */
function is_closure($var)
{
    return $var instanceof Closure;
}

/**
 * Return the default value of the given value.
 *
 * @param  mixed $value
 * @return mixed
 */
function value($value)
{
    return $value instanceof Closure ? $value() : $value;
}

/**
 * 備案號外鏈,工業(yè)和信息化部(工信部)網(wǎng)站地址
 */
function icp_link()
{
    return 'http://www.miitbeian.gov.cn';
}


function get_errPage($title, $body)
{
    $html = <<<HTML
<!doctype html><html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>$title</title></head>
<body style="text-align: center;color: #e7041a;font-size: 1rem;">$body</body><html>
HTML;
    return $html;
}

function get_useWXPage()
{
    $html = <<<HTML
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><meta name="viewport"
          content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
    <title>請在微信中打開</title>
</head>
<body style="background-color: #e1e0de">
<div style="text-align: center">
    ![](???)
</div>
</body>
</html>
HTML;
    return $html;
}


/*將$content存儲到磁盤梦皮,并返回md5,下次可以通過該md5提取存儲的內(nèi)容*/
function setDataToShort($content)
{
    $u = md5($content);
    $u = strtolower($u);

    $left2 = substr($u, 0, 2);
    if (!file_exists("./short/{$left2}/{$u}")) {
        @mkdir("./short/{$left2}", 0777);
        file_put_contents("./short/{$left2}/{$u}", $content);
    }
    return $u;
}

/**根據(jù)short獲取內(nèi)容
 * @param $md5_cc
 * @return bool|string
 */
function getDataByShort($md5_cc)
{
    $u = strtolower($md5_cc);
    $left2 = substr($u, 0, 2);
    $info = "";
    if (file_exists("./short/{$left2}/{$u}")) {
        $info = file_get_contents("./short/{$left2}/{$u}");
    }
    return $info;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桃焕,一起剝皮案震驚了整個濱河市剑肯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌观堂,老刑警劉巖让网,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異师痕,居然都是意外死亡寂祥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門七兜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人福扬,你說我怎么就攤上這事腕铸∠” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵狠裹,是天一觀的道長虽界。 經(jīng)常有香客問我,道長涛菠,這世上最難降的妖魔是什么莉御? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮俗冻,結(jié)果婚禮上礁叔,老公的妹妹穿的比我還像新娘。我一直安慰自己迄薄,他們只是感情好琅关,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讥蔽,像睡著了一般涣易。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冶伞,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天新症,我揣著相機與錄音,去河邊找鬼响禽。 笑死徒爹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的金抡。 我是一名探鬼主播瀑焦,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梗肝!你這毒婦竟也來了榛瓮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤巫击,失蹤者是張志新(化名)和其女友劉穎禀晓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坝锰,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡粹懒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了顷级。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凫乖。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帽芽,到底是詐尸還是另有隱情删掀,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布导街,位于F島的核電站披泪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搬瑰。R本人自食惡果不足惜款票,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泽论。 院中可真熱鬧艾少,春花似錦、人聲如沸佩厚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抄瓦。三九已至潮瓶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钙姊,已是汗流浹背毯辅。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留煞额,地道東北人思恐。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像膊毁,于是被迫代替她去往敵國和親胀莹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 學(xué)習(xí)路線圖引言: 黑馬程序員作為一個平臺婚温,歷經(jīng)十年描焰,免費公布了十幾萬小時真實課堂視頻提供給IT自學(xué)者。但通過反饋栅螟,...
    rosekissyou閱讀 5,523評論 8 216
  • 這是一些學(xué)習(xí)資源,里面有Android的,iOS的,PHP的,大數(shù)據(jù)的,Java的,web前端的,C++,Pyth...
    青青青青閱讀 3,333評論 2 24
  • 知識點 知識點匯總鏈接:http://pan.baidu.com/s/1dFFq1mp 密碼:hdvc 程序員英語...
    月老下次記de給我打死結(jié)閱讀 4,539評論 3 46
  • 關(guān)聯(lián)的荆秦,整體的,動態(tài)的
    把軟件價格打下來閱讀 226評論 0 0
  • 朋友是個熱心腸力图,我該這么形容他的步绸。 生活中他并沒有像很多人想象中那般,為了事業(yè)拼盡全力吃媒,更沒有為了愛情不顧一切...
    榮門飛雁閱讀 217評論 0 0