国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Table of Contents
最完整PHP常用工具類大全,
Home php教程 php手冊 最完整PHP常用工具類大全,

最完整PHP常用工具類大全,

Jun 13, 2016 am 08:50 AM
php assistant Encyclopedia whole Common tool most kind

最完整PHP常用工具類大全,

<?php
/**
 * 助手類
 * @author www.shouce.ren
 */
class Helper
{
	/**
	 * 判斷當(dāng)前服務(wù)器系統(tǒng)
	 * @return string
	 */
	public static function getOS(){
		if(PATH_SEPARATOR == ':'){
			return 'Linux';
		}else{
			return 'Windows';
		}
	}
	/**
	 * 當(dāng)前微妙數(shù)
	 * @return number
	 */
	public static function microtime_float() {
		list ( $usec, $sec ) = explode ( " ", microtime () );
		return (( float ) $usec + ( float ) $sec);
	}

	/**
	 * 切割utf-8格式的字符串(一個漢字或者字符占一個字節(jié))
	 *
	 * @author zhao jinhan
	 * @version v1.0.0
	 *
	 */
	public static function truncate_utf8_string($string, $length, $etc = '...') {
		$result = '';
		$string = html_entity_decode ( trim ( strip_tags ( $string ) ), ENT_QUOTES, 'UTF-8' );
		$strlen = strlen ( $string );
		for($i = 0; (($i < $strlen) && ($length > 0)); $i ++) {
			if ($number = strpos ( str_pad ( decbin ( ord ( substr ( $string, $i, 1 ) ) ), 8, '0', STR_PAD_LEFT ), '0' )) {
				if ($length < 1.0) {
					break;
				}
				$result .= substr ( $string, $i, $number );
				$length -= 1.0;
				$i += $number - 1;
			} else {
				$result .= substr ( $string, $i, 1 );
				$length -= 0.5;
			}
		}
		$result = htmlspecialchars ( $result, ENT_QUOTES, 'UTF-8' );
		if ($i < $strlen) {
			$result .= $etc;
		}
		return $result;
	}

	/**
	 * 遍歷文件夾
	 * @param string $dir
	 * @param boolean $all  true表示遞歸遍歷
	 * @return array
	 */
	public static function scanfDir($dir='', $all = false, &$ret = array()){
		if ( false !== ($handle = opendir ( $dir ))) {
			while ( false !== ($file = readdir ( $handle )) ) {
				if (!in_array($file, array('.', '..', '.git', '.gitignore', '.svn', '.htaccess', '.buildpath','.project'))) {
					$cur_path = $dir . '/' . $file;
					if (is_dir ( $cur_path )) {
						$ret['dirs'][] =$cur_path;
						$all && self::scanfDir( $cur_path, $all, $ret);
					} else {
						$ret ['files'] [] = $cur_path;
					}
				}
			}
			closedir ( $handle );
		}
		return $ret;
	}

	/**
	 * 郵件發(fā)送
	 * @param string $toemail
	 * @param string $subject
	 * @param string $message
	 * @return boolean
	 */
	public static function sendMail($toemail = '', $subject = '', $message = '') {
		$mailer = Yii::createComponent ( 'application.extensions.mailer.EMailer' );

		//郵件配置
		$mailer->SetLanguage('zh_cn');
		$mailer->Host = Yii::app()->params['emailHost']; //發(fā)送郵件服務(wù)器
		$mailer->Port = Yii::app()->params['emailPort']; //郵件端口
		$mailer->Timeout = Yii::app()->params['emailTimeout'];//郵件發(fā)送超時時間
		$mailer->ContentType = 'text/html';//設(shè)置html格式
		$mailer->SMTPAuth = true;
		$mailer->Username = Yii::app()->params['emailUserName'];
		$mailer->Password = Yii::app()->params['emailPassword'];
		$mailer->IsSMTP ();
		$mailer->From = $mailer->Username; // 發(fā)件人郵箱
		$mailer->FromName = Yii::app()->params['emailFormName']; // 發(fā)件人姓名
		$mailer->AddReplyTo ( $mailer->Username );
		$mailer->CharSet = 'UTF-8';

		// 添加郵件日志
		$modelMail = new MailLog ();
		$modelMail->accept = $toemail;
		$modelMail->subject = $subject;
		$modelMail->message = $message;
		$modelMail->send_status = 'waiting';
		$modelMail->save ();
		// 發(fā)送郵件
		$mailer->AddAddress ( $toemail );
		$mailer->Subject = $subject;
		$mailer->Body = $message;

		if ($mailer->Send () === true) {
			$modelMail->times = $modelMail->times + 1;
			$modelMail->send_status = 'success';
			$modelMail->save ();
			return true;
		} else {
			$error = $mailer->ErrorInfo;
			$modelMail->times = $modelMail->times + 1;
			$modelMail->send_status = 'failed';
			$modelMail->error = $error;
			$modelMail->save ();
			return false;
		}
	}

	/**
	 * 判斷字符串是utf-8 還是gb2312
	 * @param unknown $str
	 * @param string $default
	 * @return string
	 */
	public static function utf8_gb2312($str, $default = 'gb2312')
	{
	    $str = preg_replace("/[\x01-\x7F]+/", "", $str);
	    if (empty($str)) return $default;

	    $preg =  array(
	        "gb2312" => "/^([\xA1-\xF7][\xA0-\xFE])+$/", //正則判斷是否是gb2312
	        "utf-8" => "/^[\x{4E00}-\x{9FA5}]+$/u",      //正則判斷是否是漢字(utf8編碼的條件了),這個范圍實際上已經(jīng)包含了繁體中文字了
	    );

	    if ($default == 'gb2312') {
	        $option = 'utf-8';
	    } else {
	        $option = 'gb2312';
	    }

	    if (!preg_match($preg[$default], $str)) {
	        return $option;
	    }
	    $str = @iconv($default, $option, $str);

	    //不能轉(zhuǎn)成 $option, 說明原來的不是 $default
	    if (empty($str)) {
	        return $option;
	    }
	    return $default;
	}
	/**
	 * utf-8和gb2312自動轉(zhuǎn)化
	 * @param unknown $string
	 * @param string $outEncoding
	 * @return unknown|string
	 */
	public static function safeEncoding($string,$outEncoding = 'UTF-8')
	{
		$encoding = "UTF-8";
		for($i = 0; $i < strlen ( $string ); $i ++) {
			if (ord ( $string {$i} ) < 128)
				continue;

			if ((ord ( $string {$i} ) & 224) == 224) {
				// 第一個字節(jié)判斷通過
				$char = $string {++ $i};
				if ((ord ( $char ) & 128) == 128) {
					// 第二個字節(jié)判斷通過
					$char = $string {++ $i};
					if ((ord ( $char ) & 128) == 128) {
						$encoding = "UTF-8";
						break;
					}
				}
			}
			if ((ord ( $string {$i} ) & 192) == 192) {
				// 第一個字節(jié)判斷通過
				$char = $string {++ $i};
				if ((ord ( $char ) & 128) == 128) {
					// 第二個字節(jié)判斷通過
					$encoding = "GB2312";
					break;
				}
			}
		}

		if (strtoupper ( $encoding ) == strtoupper ( $outEncoding ))
			return $string;
		else
			return @iconv ( $encoding, $outEncoding, $string );
	}
	/**
	 * 返回二維數(shù)組中某個鍵名的所有值
	 * @param input $array
	 * @param string $key
	 * @return array
	 */
	public static function array_key_values($array =array(), $key='')
	{
		$ret = array();
		foreach((array)$array as $k=>$v){
			$ret[$k] = $v[$key];
		}
		return $ret;
	}


	/**
	 * 判斷 文件/目錄 是否可寫(取代系統(tǒng)自帶的 is_writeable 函數(shù))
	 * @param string $file 文件/目錄
	 * @return boolean
	 */
	public static function is_writeable($file) {
		if (is_dir($file)){
			$dir = $file;
			if ($fp = @fopen("$dir/test.txt", 'w')) {
				@fclose($fp);
				@unlink("$dir/test.txt");
				$writeable = 1;
			} else {
				$writeable = 0;
			}
		} else {
			if ($fp = @fopen($file, 'a+')) {
				@fclose($fp);
				$writeable = 1;
			} else {
				$writeable = 0;
			}
		}

		return $writeable;
	}
	/**
	 * 格式化單位
	 */
	static public function byteFormat( $size, $dec = 2 ) {
		$a = array ( "B" , "KB" , "MB" , "GB" , "TB" , "PB" );
		$pos = 0;
		while ( $size >= 1024 ) {
			$size /= 1024;
			$pos ++;
		}
		return round( $size, $dec ) . " " . $a[$pos];
	}

	/**
	 * 下拉框,單選按鈕 自動選擇
	 *
	 * @param $string 輸入字符
	 * @param $param  條件
	 * @param $type   類型
	 * selected checked
	 * @return string
	 */
	static public function selected( $string, $param = 1, $type = 'select' ) {

		$true = false;
		if ( is_array( $param ) ) {
			$true = in_array( $string, $param );
		}elseif ( $string == $param ) {
			$true = true;
		}
		$return='';
		if ( $true )
			$return = $type == 'select' ? 'selected="selected"' : 'checked="checked"';

		echo $return;
	}

	/**
	 * 下載遠程圖片
	 * @param string $url 圖片的絕對url
	 * @param string $filepath 文件的完整路徑(例如/www/images/test) ,此函數(shù)會自動根據(jù)圖片url和http頭信息確定圖片的后綴名
	 * @param string $filename 要保存的文件名(不含擴展名)
	 * @return mixed 下載成功返回一個描述圖片信息的數(shù)組,下載失敗則返回false
	 */
	static public function downloadImage($url, $filepath, $filename) {
		//服務(wù)器返回的頭信息
		$responseHeaders = array();
		//原始圖片名
		$originalfilename = '';
		//圖片的后綴名
		$ext = '';
		$ch = curl_init($url);
		//設(shè)置curl_exec返回的值包含Http頭
		curl_setopt($ch, CURLOPT_HEADER, 1);
		//設(shè)置curl_exec返回的值包含Http內(nèi)容
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		//設(shè)置抓取跳轉(zhuǎn)(http 301,302)后的頁面
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		//設(shè)置最多的HTTP重定向的數(shù)量
		curl_setopt($ch, CURLOPT_MAXREDIRS, 3);

		//服務(wù)器返回的數(shù)據(jù)(包括http頭信息和內(nèi)容)
		$html = curl_exec($ch);
		//獲取此次抓取的相關(guān)信息
		$httpinfo = curl_getinfo($ch);
		curl_close($ch);
		if ($html !== false) {
			//分離response的header和body,由于服務(wù)器可能使用了302跳轉(zhuǎn),所以此處需要將字符串分離為 2+跳轉(zhuǎn)次數(shù) 個子串
			$httpArr = explode("\r\n\r\n", $html, 2 + $httpinfo['redirect_count']);
			//倒數(shù)第二段是服務(wù)器最后一次response的http頭
			$header = $httpArr[count($httpArr) - 2];
			//倒數(shù)第一段是服務(wù)器最后一次response的內(nèi)容
			$body = $httpArr[count($httpArr) - 1];
			$header.="\r\n";

			//獲取最后一次response的header信息
			preg_match_all('/([a-z0-9-_]+):\s*([^\r\n]+)\r\n/i', $header, $matches);
			if (!empty($matches) && count($matches) == 3 && !empty($matches[1]) && !empty($matches[1])) {
				for ($i = 0; $i < count($matches[1]); $i++) {
					if (array_key_exists($i, $matches[2])) {
						$responseHeaders[$matches[1][$i]] = $matches[2][$i];
					}
				}
			}
			//獲取圖片后綴名
			if (0 < preg_match('{(?:[^\/\\\\]+)\.(jpg|jpeg|gif|png|bmp)$}i', $url, $matches)) {
				$originalfilename = $matches[0];
				$ext = $matches[1];
			} else {
				if (array_key_exists('Content-Type', $responseHeaders)) {
					if (0 < preg_match('{image/(\w+)}i', $responseHeaders['Content-Type'], $extmatches)) {
						$ext = $extmatches[1];
					}
				}
			}
			//保存文件
			if (!empty($ext)) {
				//如果目錄不存在,則先要創(chuàng)建目錄
				if(!is_dir($filepath)){
					mkdir($filepath, 0777, true);
				}

				$filepath .= '/'.$filename.".$ext";
				$local_file = fopen($filepath, 'w');
				if (false !== $local_file) {
					if (false !== fwrite($local_file, $body)) {
						fclose($local_file);
						$sizeinfo = getimagesize($filepath);
						return array('filepath' => realpath($filepath), 'width' => $sizeinfo[0], 'height' => $sizeinfo[1], 'orginalfilename' => $originalfilename, 'filename' => pathinfo($filepath, PATHINFO_BASENAME));
					}
				}
			}
		}
		return false;
	}


	/**
	 * 查找ip是否在某個段位里面
	 * @param string $ip 要查詢的ip
	 * @param $arrIP     禁止的ip
	 * @return boolean
	 */
	public static function ipAccess($ip='0.0.0.0', $arrIP = array()){
		$access = true;
		$ip && $arr_cur_ip = explode('.', $ip);
		foreach((array)$arrIP as $key=> $value){
			if($value == '*.*.*.*'){
				$access = false; //禁止所有
				break;
			}
			$tmp_arr = explode('.', $value);
			if(($arr_cur_ip[0] == $tmp_arr[0]) && ($arr_cur_ip[1] == $tmp_arr[1])) {
				//前兩段相同
				if(($arr_cur_ip[2] == $tmp_arr[2]) || ($tmp_arr[2] == '*')){
					//第三段為* 或者相同
					if(($arr_cur_ip[3] == $tmp_arr[3]) || ($tmp_arr[3] == '*')){
						//第四段為* 或者相同
						$access = false; //在禁止ip列,則禁止訪問
						break;
					}
				}
			}
		}
		return $access;
	}

	/**
	 * @param string $string 原文或者密文
	 * @param string $operation 操作(ENCODE | DECODE), 默認為 DECODE
	 * @param string $key 密鑰
	 * @param int $expiry 密文有效期, 加密時候有效, 單位 秒,0 為永久有效
	 * @return string 處理后的 原文或者 經(jīng)過 base64_encode 處理后的密文
	 *
	 * @example
	 *
	 * $a = authcode('abc', 'ENCODE', 'key');
	 * $b = authcode($a, 'DECODE', 'key');  // $b(abc)
	 *
	 * $a = authcode('abc', 'ENCODE', 'key', 3600);
	 * $b = authcode('abc', 'DECODE', 'key'); // 在一個小時內(nèi),$b(abc),否則 $b 為空
	 */
	public static function authcode($string, $operation = 'DECODE', $key = '', $expiry = 3600) {

		$ckey_length = 4;
		// 隨機密鑰長度 取值 0-32;
		// 加入隨機密鑰,可以令密文無任何規(guī)律,即便是原文和密鑰完全相同,加密結(jié)果也會每次不同,增大破解難度。
		// 取值越大,密文變動規(guī)律越大,密文變化 = 16 的 $ckey_length 次方
		// 當(dāng)此值為 0 時,則不產(chǎn)生隨機密鑰


		$key = md5 ( $key ? $key : 'key' ); //這里可以填寫默認key值
		$keya = md5 ( substr ( $key, 0, 16 ) );
		$keyb = md5 ( substr ( $key, 16, 16 ) );
		$keyc = $ckey_length ? ($operation == 'DECODE' ? substr ( $string, 0, $ckey_length ) : substr ( md5 ( microtime () ), - $ckey_length )) : '';

		$cryptkey = $keya . md5 ( $keya . $keyc );
		$key_length = strlen ( $cryptkey );

		$string = $operation == 'DECODE' ? base64_decode ( substr ( $string, $ckey_length ) ) : sprintf ( '%010d', $expiry ? $expiry + time () : 0 ) . substr ( md5 ( $string . $keyb ), 0, 16 ) . $string;
		$string_length = strlen ( $string );

		$result = '';
		$box = range ( 0, 255 );

		$rndkey = array ();
		for($i = 0; $i <= 255; $i ++) {
			$rndkey [$i] = ord ( $cryptkey [$i % $key_length] );
		}

		for($j = $i = 0; $i < 256; $i ++) {
			$j = ($j + $box [$i] + $rndkey [$i]) % 256;
			$tmp = $box [$i];
			$box [$i] = $box [$j];
			$box [$j] = $tmp;
		}

		for($a = $j = $i = 0; $i < $string_length; $i ++) {
			$a = ($a + 1) % 256;
			$j = ($j + $box [$a]) % 256;
			$tmp = $box [$a];
			$box [$a] = $box [$j];
			$box [$j] = $tmp;
			$result .= chr ( ord ( $string [$i] ) ^ ($box [($box [$a] + $box [$j]) % 256]) );
		}

		if ($operation == 'DECODE') {
			if ((substr ( $result, 0, 10 ) == 0 || substr ( $result, 0, 10 ) - time () > 0) && substr ( $result, 10, 16 ) == substr ( md5 ( substr ( $result, 26 ) . $keyb ), 0, 16 )) {
				return substr ( $result, 26 );
			} else {
				return '';
			}
		} else {
			return $keyc . str_replace ( '=', '', base64_encode ( $result ) );
		}

	}

	public static function gbkToUtf8($str){
		return iconv("GBK", "UTF-8", $str);
	}

	/**
	 * 取得輸入目錄所包含的所有目錄和文件
	 * 以關(guān)聯(lián)數(shù)組形式返回
	 * author: flynetcn
	 */
	static public function deepScanDir($dir)
	{
		$fileArr = array();
		$dirArr = array();
		$dir = rtrim($dir, '//');
		if(is_dir($dir)){
			$dirHandle = opendir($dir);
			while(false !== ($fileName = readdir($dirHandle))){
				$subFile = $dir . DIRECTORY_SEPARATOR . $fileName;
				if(is_file($subFile)){
					$fileArr[] = $subFile;
				} elseif (is_dir($subFile) && str_replace('.', '', $fileName)!=''){
					$dirArr[] = $subFile;
					$arr = self::deepScanDir($subFile);
					$dirArr = array_merge($dirArr, $arr['dir']);
					$fileArr = array_merge($fileArr, $arr['file']);
				}
			}
			closedir($dirHandle);
		}
		return array('dir'=>$dirArr, 'file'=>$fileArr);
	}


	/**
	 * 取得輸入目錄所包含的所有文件
	 * 以數(shù)組形式返回
	 * author: flynetcn
	 */
	static public function get_dir_files($dir)
	{
		if (is_file($dir)) {
			return array($dir);
		}
		$files = array();
		if (is_dir($dir) && ($dir_p = opendir($dir))) {
			$ds = DIRECTORY_SEPARATOR;
			while (($filename = readdir($dir_p)) !== false) {
				if ($filename=='.' || $filename=='..') { continue; }
				$filetype = filetype($dir.$ds.$filename);
				if ($filetype == 'dir') {
					$files = array_merge($files, self::get_dir_files($dir.$ds.$filename));
				} elseif ($filetype == 'file') {
					$files[] = $dir.$ds.$filename;
				}
			}
			closedir($dir_p);
		}
		return $files;
	}

	/**
	 * 刪除文件夾及其文件夾下所有文件
	 */
	public static function deldir($dir) {
		//先刪除目錄下的文件:
		$dh=opendir($dir);
		while ($file=readdir($dh)) {
			if($file!="." && $file!="..") {
				$fullpath=$dir."/".$file;
				if(!is_dir($fullpath)) {
					unlink($fullpath);
				} else {
					self::deldir($fullpath);
				}
			}
		}

		closedir($dh);
		//刪除當(dāng)前文件夾:
		if(rmdir($dir)) {
			return true;
		} else {
			return false;
		}
	}

		/**
		 * js 彈窗并且跳轉(zhuǎn)
		 * @param string $_info
		 * @param string $_url
		 * @return js
		 */
		static public function alertLocation($_info, $_url) {
			echo "<script type='text/javascript'>alert('$_info');location.href='$_url';</script>";
			exit();
		}

		/**
		 * js 彈窗返回
		 * @param string $_info
		 * @return js
		 */
		static public function alertBack($_info) {
			echo "<script type='text/javascript'>alert('$_info');history.back();</script>";
			exit();
		}

		/**
		 * 頁面跳轉(zhuǎn)
		 * @param string $url
		 * @return js
		 */
		static public function headerUrl($url) {
			echo "<script type='text/javascript'>location.href='{$url}';</script>";
			exit();
		}

		/**
		 * 彈窗關(guān)閉
		 * @param string $_info
		 * @return js
		 */
		static public function alertClose($_info) {
			echo "<script type='text/javascript'>alert('$_info');close();</script>";
			exit();
		}

		/**
		 * 彈窗
		 * @param string $_info
		 * @return js
		 */
		static public function alert($_info) {
			echo "<script type='text/javascript'>alert('$_info');</script>";
			exit();
		}

		/**
		 * 系統(tǒng)基本參數(shù)上傳圖片專用
		 * @param string $_path
		 * @return null
		 */
		static public function sysUploadImg($_path) {
			echo '<script type="text/javascript">document.getElementById("logo").value="'.$_path.'";</script>';
			echo '<script type="text/javascript">document.getElementById("pic").src="'.$_path.'";</script>';
			echo '<script type="text/javascript">$("#loginpop1").hide();</script>';
			echo '<script type="text/javascript">$("#bgloginpop2").hide();</script>';
		}

		/**
		 * html過濾
		 * @param array|object $_date
		 * @return string
		 */
		static public function htmlString($_date) {
			if (is_array($_date)) {
				foreach ($_date as $_key=>$_value) {
					$_string[$_key] = self::htmlString($_value);  //遞歸
				}
			} elseif (is_object($_date)) {
				foreach ($_date as $_key=>$_value) {
					$_string->$_key = self::htmlString($_value);  //遞歸
				}
			} else {
				$_string = htmlspecialchars($_date);
			}
			return $_string;
		}

		/**
		 * 數(shù)據(jù)庫輸入過濾
		 * @param string $_data
		 * @return string
		 */
		static public function mysqlString($_data) {
			$_data = trim($_data);
			return !GPC ? addcslashes($_data) : $_data;
		}

		/**
		 * 清理session
		 */
		static public function unSession() {
			if (session_start()) {
				session_destroy();
			}
		}

		/**
		 * 驗證是否為空
		 * @param string $str
		 * @param string $name
		 * @return bool (true or false)
		 */
		static function validateEmpty($str, $name) {
			if (empty($str)) {
				self::alertBack('警告:' .$name . '不能為空!');
			}
		}

		/**
		 * 驗證是否相同
		 * @param string $str1
		 * @param string $str2
		 * @param string $alert
		 * @return JS
		 */
		static function validateAll($str1, $str2, $alert) {
			if ($str1 != $str2) self::alertBack('警告:' .$alert);
		}

		/**
		 * 驗證ID
		 * @param Number $id
		 * @return JS
		 */
		static function validateId($id) {
			if (empty($id) || !is_numeric($id)) self::alertBack('警告:參數(shù)錯誤!');
		}

		/**
		 * 格式化字符串
		 * @param string $str
		 * @return string
		 */
		static public function formatStr($str) {
			$arr = array(' ', '	', '&', '@', '#', '%',  '\'', '"', '\\', '/', '.', ',', '$', '^', '*', '(', ')', '[', ']', '{', '}', '|', '~', '`', '?', '!', ';', ':', '-', '_', '+', '=');
			foreach ($arr as $v) {
				$str = str_replace($v, '', $str);
			}
			return $str;
		}

		/**
		 * 格式化時間
		 * @param int $time 時間戳
		 * @return string
		 */
		static public function formatDate($time='default') {
			$date = $time == 'default' ? date('Y-m-d H:i:s', time()) : date('Y-m-d H:i:s', $time);
			return $date;
		}

		/**
		 * 獲得真實IP地址
		 * @return string
		 */
		static public function realIp() {
			static $realip = NULL;
			if ($realip !== NULL) return $realip;
			if (isset($_SERVER)) {
				if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
					$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
					foreach ($arr AS $ip) {
						$ip = trim($ip);
						if ($ip != 'unknown') {
							$realip = $ip;
							break;
						}
					}
				} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
					$realip = $_SERVER['HTTP_CLIENT_IP'];
				} else {
					if (isset($_SERVER['REMOTE_ADDR'])) {
						$realip = $_SERVER['REMOTE_ADDR'];
					} else {
						$realip = '0.0.0.0';
					}
				}
			} else {
				if (getenv('HTTP_X_FORWARDED_FOR')) {
					$realip = getenv('HTTP_X_FORWARDED_FOR');
				} elseif (getenv('HTTP_CLIENT_IP')) {
					$realip = getenv('HTTP_CLIENT_IP');
				} else {
					$realip = getenv('REMOTE_ADDR');
				}
			}
			preg_match('/[\d\.]{7,15}/', $realip, $onlineip);
			$realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';
			return $realip;
		}

		/**
		 * 加載 Smarty 模板
		 * @param string $html
		 * @return null;
		 */
		static public function display() {
			global $tpl;$html = null;
			$htmlArr = explode('/', $_SERVER[SCRIPT_NAME]);
			$html = str_ireplace('.php', '.html', $htmlArr[count($htmlArr)-1]);
			$dir = dirname($_SERVER[SCRIPT_NAME]);
			$firstStr = substr($dir, 0, 1);
			$endStr = substr($dir, strlen($dir)-1, 1);
			if ($firstStr == '/' || $firstStr == '\\') $dir = substr($dir, 1);
			if ($endStr != '/' || $endStr != '\\') $dir = $dir . '/';
			$tpl->display($dir.$html);
		}

		/**
		 * 創(chuàng)建目錄
		 * @param string $dir
		 */
		static public function createDir($dir) {
			if (!is_dir($dir)) {
				mkdir($dir, 0777);
			}
		}

		/**
		 * 創(chuàng)建文件(默認為空)
		 * @param unknown_type $filename
		 */
		static public function createFile($filename) {
			if (!is_file($filename)) touch($filename);
		}

		/**
		 * 正確獲取變量
		 * @param string $param
		 * @param string $type
		 * @return string
		 */
		static public function getData($param, $type='post') {
			$type = strtolower($type);
			if ($type=='post') {
				return self::mysqlString(trim($_POST[$param]));
			} elseif ($type=='get') {
				return self::mysqlString(trim($_GET[$param]));
			}
		}

		/**
		 * 刪除文件
		 * @param string $filename
		 */
		static public function delFile($filename) {
			if (file_exists($filename)) unlink($filename);
		}

		/**
		 * 刪除目錄
		 * @param string $path
		 */
		static public function delDir($path) {
			if (is_dir($path)) rmdir($path);
		}

		/**
		 * 刪除目錄及地下的全部文件
		 * @param string $dir
		 * @return bool
		 */
		static public function delDirOfAll($dir) {
			//先刪除目錄下的文件:
			if (is_dir($dir)) {
				$dh=opendir($dir);
				while (!!$file=readdir($dh)) {
					if($file!="." && $file!="..") {
						$fullpath=$dir."/".$file;
						if(!is_dir($fullpath)) {
							unlink($fullpath);
						} else {
							self::delDirOfAll($fullpath);
						}
					}
				}
				closedir($dh);
				//刪除當(dāng)前文件夾:
				if(rmdir($dir)) {
					return true;
				} else {
					return false;
				}
			}
		}

		/**
		 * 驗證登陸
		 */
		static public function validateLogin() {
			if (empty($_SESSION['admin']['user'])) header('Location:/admin/');
		}

		/**
		 * 給已經(jīng)存在的圖片添加水印
		 * @param string $file_path
		 * @return bool
		 */
		static public function addMark($file_path) {
			if (file_exists($file_path) && file_exists(MARK)) {
				//求出上傳圖片的名稱后綴
				$ext_name = strtolower(substr($file_path, strrpos($file_path, '.'), strlen($file_path)));
				//$new_name='jzy_' . time() . rand(1000,9999) . $ext_name ;
				$store_path = ROOT_PATH . UPDIR;
				//求上傳圖片高寬
				$imginfo = getimagesize($file_path);
				$width = $imginfo[0];
				$height = $imginfo[1];
				//添加圖片水印
				switch($ext_name) {
					case '.gif':
						$dst_im = imagecreatefromgif($file_path);
						break;
					case '.jpg':
						$dst_im = imagecreatefromjpeg($file_path);
						break;
					case '.png':
						$dst_im = imagecreatefrompng($file_path);
						break;
				}
				$src_im = imagecreatefrompng(MARK);
				//求水印圖片高寬
				$src_imginfo = getimagesize(MARK);
				$src_width = $src_imginfo[0];
				$src_height = $src_imginfo[1];
				//求出水印圖片的實際生成位置
				$src_x = $width - $src_width - 10;
				$src_y = $height - $src_height - 10;
				//新建一個真彩色圖像
				$nimage = imagecreatetruecolor($width, $height);
				//拷貝上傳圖片到真彩圖像
				imagecopy($nimage, $dst_im, 0, 0, 0, 0, $width, $height);
				//按坐標位置拷貝水印圖片到真彩圖像上
				imagecopy($nimage, $src_im, $src_x, $src_y, 0, 0, $src_width, $src_height);
				//分情況輸出生成后的水印圖片
				switch($ext_name) {
					case '.gif':
						imagegif($nimage, $file_path);
						break;
					case '.jpg':
						imagejpeg($nimage, $file_path);
						break;
					case '.png':
						imagepng($nimage, $file_path);
						break;
				}
				//釋放資源
				imagedestroy($dst_im);
				imagedestroy($src_im);
				unset($imginfo);
				unset($src_imginfo);
				//移動生成后的圖片
				@move_uploaded_file($file_path, ROOT_PATH.UPDIR . $file_path);
			}
		}

		/**
		 *  中文截取2,單字節(jié)截取模式
		 * @access public
		 * @param string $str  需要截取的字符串
		 * @param int $slen  截取的長度
		 * @param int $startdd  開始標記處
		 * @return string
		 */
		static public function cn_substr($str, $slen, $startdd=0){
			$cfg_soft_lang = PAGECHARSET;
			if($cfg_soft_lang=='utf-8') {
				return self::cn_substr_utf8($str, $slen, $startdd);
			}
			$restr = '';
			$c = '';
			$str_len = strlen($str);
			if($str_len < $startdd+1) {
				return '';
			}
			if($str_len < $startdd + $slen || $slen==0) {
				$slen = $str_len - $startdd;
			}
			$enddd = $startdd + $slen - 1;
			for($i=0;$i<$str_len;$i++) {
				if($startdd==0) {
					$restr .= $c;
				} elseif($i > $startdd) {
					$restr .= $c;
				}
				if(ord($str[$i])>0x80) {
					if($str_len>$i+1) {
						$c = $str[$i].$str[$i+1];
					}
					$i++;
				} else {
					$c = $str[$i];
				}
				if($i >= $enddd) {
					if(strlen($restr)+strlen($c)>$slen) {
						break;
					} else {
						$restr .= $c;
						break;
					}
				}
			}
			return $restr;
		}

		/**
		 *  utf-8中文截取,單字節(jié)截取模式
		 *
		 * @access public
		 * @param string $str 需要截取的字符串
		 * @param int $slen 截取的長度
		 * @param int $startdd 開始標記處
		 * @return string
		 */
		static public function cn_substr_utf8($str, $length, $start=0) {
			if(strlen($str) < $start+1) {
				return '';
			}
			preg_match_all("/./su", $str, $ar);
			$str = '';
			$tstr = '';
			//為了兼容mysql4.1以下版本,與數(shù)據(jù)庫varchar一致,這里使用按字節(jié)截取
			for($i=0; isset($ar[0][$i]); $i++) {
				if(strlen($tstr) < $start) {
					$tstr .= $ar[0][$i];
				} else {
					if(strlen($str) < $length + strlen($ar[0][$i]) ) {
						$str .= $ar[0][$i];
					} else {
						break;
					}
				}
			}
			return $str;
		}

		/**
		 * 刪除圖片,根據(jù)圖片ID
		 * @param int $image_id
		 */
		static function delPicByImageId($image_id) {
			$db_name = PREFIX . 'images i';
			$m = new Model();
			$data = $m->getOne($db_name, "i.id={$image_id}", "i.path as p, i.big_img as b, i.small_img as s");
			foreach ($data as $v) {
				@self::delFile(ROOT_PATH . $v['p']);
				@self::delFile(ROOT_PATH . $v['b']);
				@self::delFile(ROOT_PATH . $v['s']);
			}
			$m->del(PREFIX . 'images', "id={$image_id}");
			unset($m);
		}

		/**
		 * 圖片等比例縮放
		 * @param resource $im    新建圖片資源(imagecreatefromjpeg/imagecreatefrompng/imagecreatefromgif)
		 * @param int $maxwidth   生成圖像寬
		 * @param int $maxheight  生成圖像高
		 * @param string $name    生成圖像名稱
		 * @param string $filetype文件類型(.jpg/.gif/.png)
		 */
		static public function resizeImage($im, $maxwidth, $maxheight, $name, $filetype) {
			$pic_width = imagesx($im);
			$pic_height = imagesy($im);
			if(($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight)) {
				if($maxwidth && $pic_width>$maxwidth) {
					$widthratio = $maxwidth/$pic_width;
					$resizewidth_tag = true;
				}
				if($maxheight && $pic_height>$maxheight) {
					$heightratio = $maxheight/$pic_height;
					$resizeheight_tag = true;
				}
				if($resizewidth_tag && $resizeheight_tag) {
					if($widthratio<$heightratio)
						$ratio = $widthratio;
					else
						$ratio = $heightratio;
				}
				if($resizewidth_tag && !$resizeheight_tag)
					$ratio = $widthratio;
				if($resizeheight_tag && !$resizewidth_tag)
					$ratio = $heightratio;
				$newwidth = $pic_width * $ratio;
				$newheight = $pic_height * $ratio;
				if(function_exists("imagecopyresampled")) {
					$newim = imagecreatetruecolor($newwidth,$newheight);
					imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
				} else {
					$newim = imagecreate($newwidth,$newheight);
					imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
				}
				$name = $name.$filetype;
				imagejpeg($newim,$name);
				imagedestroy($newim);
			} else {
				$name = $name.$filetype;
				imagejpeg($im,$name);
			}
		}

		/**
		 * 下載文件
		 * @param string $file_path 絕對路徑
		 */
		static public function downFile($file_path) {
			//判斷文件是否存在
			$file_path = iconv('utf-8', 'gb2312', $file_path); //對可能出現(xiàn)的中文名稱進行轉(zhuǎn)碼
			if (!file_exists($file_path)) {
				exit('文件不存在!');
			}
			$file_name = basename($file_path); //獲取文件名稱
			$file_size = filesize($file_path); //獲取文件大小
			$fp = fopen($file_path, 'r'); //以只讀的方式打開文件
			header("Content-type: application/octet-stream");
			header("Accept-Ranges: bytes");
			header("Accept-Length: {$file_size}");
			header("Content-Disposition: attachment;filename={$file_name}");
			$buffer = 1024;
			$file_count = 0;
			//判斷文件是否結(jié)束
			while (!feof($fp) && ($file_size-$file_count>0)) {
				$file_data = fread($fp, $buffer);
				$file_count += $buffer;
				echo $file_data;
			}
			fclose($fp); //關(guān)閉文件
		}
	}

下載地址 http://www.shouce.ren/post/view/id/1700

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

PHP Tutorial
1502
276
PHP calls AI intelligent voice assistant PHP voice interaction system construction PHP calls AI intelligent voice assistant PHP voice interaction system construction Jul 25, 2025 pm 08:45 PM

User voice input is captured and sent to the PHP backend through the MediaRecorder API of the front-end JavaScript; 2. PHP saves the audio as a temporary file and calls STTAPI (such as Google or Baidu voice recognition) to convert it into text; 3. PHP sends the text to an AI service (such as OpenAIGPT) to obtain intelligent reply; 4. PHP then calls TTSAPI (such as Baidu or Google voice synthesis) to convert the reply to a voice file; 5. PHP streams the voice file back to the front-end to play, completing interaction. The entire process is dominated by PHP to ensure seamless connection between all links.

How to use PHP to build social sharing functions PHP sharing interface integration practice How to use PHP to build social sharing functions PHP sharing interface integration practice Jul 25, 2025 pm 08:51 PM

The core method of building social sharing functions in PHP is to dynamically generate sharing links that meet the requirements of each platform. 1. First get the current page or specified URL and article information; 2. Use urlencode to encode the parameters; 3. Splice and generate sharing links according to the protocols of each platform; 4. Display links on the front end for users to click and share; 5. Dynamically generate OG tags on the page to optimize sharing content display; 6. Be sure to escape user input to prevent XSS attacks. This method does not require complex authentication, has low maintenance costs, and is suitable for most content sharing needs.

How to use PHP combined with AI to achieve text error correction PHP syntax detection and optimization How to use PHP combined with AI to achieve text error correction PHP syntax detection and optimization Jul 25, 2025 pm 08:57 PM

To realize text error correction and syntax optimization with AI, you need to follow the following steps: 1. Select a suitable AI model or API, such as Baidu, Tencent API or open source NLP library; 2. Call the API through PHP's curl or Guzzle and process the return results; 3. Display error correction information in the application and allow users to choose whether to adopt it; 4. Use php-l and PHP_CodeSniffer for syntax detection and code optimization; 5. Continuously collect feedback and update the model or rules to improve the effect. When choosing AIAPI, focus on evaluating accuracy, response speed, price and support for PHP. Code optimization should follow PSR specifications, use cache reasonably, avoid circular queries, review code regularly, and use X

PHP creates a blog comment system to monetize PHP comment review and anti-brush strategy PHP creates a blog comment system to monetize PHP comment review and anti-brush strategy Jul 25, 2025 pm 08:27 PM

1. Maximizing the commercial value of the comment system requires combining native advertising precise delivery, user paid value-added services (such as uploading pictures, top-up comments), influence incentive mechanism based on comment quality, and compliance anonymous data insight monetization; 2. The audit strategy should adopt a combination of pre-audit dynamic keyword filtering and user reporting mechanisms, supplemented by comment quality rating to achieve content hierarchical exposure; 3. Anti-brushing requires the construction of multi-layer defense: reCAPTCHAv3 sensorless verification, Honeypot honeypot field recognition robot, IP and timestamp frequency limit prevents watering, and content pattern recognition marks suspicious comments, and continuously iterate to deal with attacks.

How to use PHP to combine AI to generate image. PHP automatically generates art works How to use PHP to combine AI to generate image. PHP automatically generates art works Jul 25, 2025 pm 07:21 PM

PHP does not directly perform AI image processing, but integrates through APIs, because it is good at web development rather than computing-intensive tasks. API integration can achieve professional division of labor, reduce costs, and improve efficiency; 2. Integrating key technologies include using Guzzle or cURL to send HTTP requests, JSON data encoding and decoding, API key security authentication, asynchronous queue processing time-consuming tasks, robust error handling and retry mechanism, image storage and display; 3. Common challenges include API cost out of control, uncontrollable generation results, poor user experience, security risks and difficult data management. The response strategies are setting user quotas and caches, providing propt guidance and multi-picture selection, asynchronous notifications and progress prompts, key environment variable storage and content audit, and cloud storage.

PHP realizes commodity inventory management and monetization PHP inventory synchronization and alarm mechanism PHP realizes commodity inventory management and monetization PHP inventory synchronization and alarm mechanism Jul 25, 2025 pm 08:30 PM

PHP ensures inventory deduction atomicity through database transactions and FORUPDATE row locks to prevent high concurrent overselling; 2. Multi-platform inventory consistency depends on centralized management and event-driven synchronization, combining API/Webhook notifications and message queues to ensure reliable data transmission; 3. The alarm mechanism should set low inventory, zero/negative inventory, unsalable sales, replenishment cycles and abnormal fluctuations strategies in different scenarios, and select DingTalk, SMS or Email Responsible Persons according to the urgency, and the alarm information must be complete and clear to achieve business adaptation and rapid response.

Beyond the LAMP Stack: PHP's Role in Modern Enterprise Architecture Beyond the LAMP Stack: PHP's Role in Modern Enterprise Architecture Jul 27, 2025 am 04:31 AM

PHPisstillrelevantinmodernenterpriseenvironments.1.ModernPHP(7.xand8.x)offersperformancegains,stricttyping,JITcompilation,andmodernsyntax,makingitsuitableforlarge-scaleapplications.2.PHPintegrateseffectivelyinhybridarchitectures,servingasanAPIgateway

PHP integrated AI speech recognition and translator PHP meeting record automatic generation solution PHP integrated AI speech recognition and translator PHP meeting record automatic generation solution Jul 25, 2025 pm 07:06 PM

Select the appropriate AI voice recognition service and integrate PHPSDK; 2. Use PHP to call ffmpeg to convert recordings into API-required formats (such as wav); 3. Upload files to cloud storage and call API asynchronous recognition; 4. Analyze JSON results and organize text using NLP technology; 5. Generate Word or Markdown documents to complete the automation of meeting records. The entire process needs to ensure data encryption, access control and compliance to ensure privacy and security.

See all articles