Thinkphp 코드
클라이언트 IP 주소 가져오기
클라이언트 IP 주소 가져오기
$type은 반환 유형 0 반환 IP 주소 1 반환을 의미합니다. IPV4 주소번호
function get_client_ip($type = 0) {
$type = $type ? 1 : 0;
static $ip = NULL;
if ($ip !== NULL) return $ip[$type];
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$arr = 폭발( ',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$pos = array_search('unknown',$arr);
if(false !== $pos) unset($ arr[$pos]);
$ip = Trim($arr[0]);
}elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR '] ;
}
// IP 주소 법적 확인
$long = ip2long($ip);
$ip = $long ? ip, $long) : 배열('0.0.0.0', 0);
return $ip[$type];
}
파일 바이트 크기 형식
바이트 형식은 B K M G T
에 설명된 크기로 바이트 수 형식을 지정합니다. byte_format($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];
}
또는
function get_size($s,$ u='B ',$p=1){
$us = array('B'=>'K','K'=>'M','M'=>' G',' G'=>'T');
return (($u!=='B')&&(!isset($us[$u]))||($s< ;1024)) ?(number_format($s,$p)." $u"):(get_size($s/1024,$us[$u],$p))
}
무지개 문자열 표시
는 무지개 문자열을 표시하는 데 사용되며 UTF8 및 중국어를 지원하며 효과는 다음과 같습니다.
function color_txt( $str ){
$len = mb_strlen($str);
$colorTxt = '';
for($i=0; $i<$len; $i++ ) {
$colorTxt .= ''.mb_substr($str,$i,1,'utf-8' ). '';
}
return $colorTxt;
}
function rand_color(){
return '#'.sprintf("%02X",mt_rand(0,255)).sprintf("%02X",mt_rand(0,255)).sprintf("%02X",mt_rand(0,255));
}
PHP에서 파일 다운로드 속도를 더 빠르게 제공
일반적으로 URL을 문서 루트 파일 아래에 있는 파일로 직접 지정하여 안내할 수 있습니다.
하지만 이렇게 하면 일부 통계, 권한 확인 등을 수행할 수 있는 방법이 없습니다. 그래서 많은 경우 PHP를 사용하여 사용자에게 전달하고 제공합니다. 파일 다운로드 포함.
$file = "/tmp/dummy.tar.gz";
header("Content -type: application/octet -stream");
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header( "Content-Length: " .filesize($file));
readfile($file);
하지만 여기에는 문제가 있습니다. 즉, 파일 이름이 중국어인 경우입니다. 그렇다면 일부 사용자는 다운로드 후 파일 이름이 깨졌을 수 있습니다.
따라서 몇 가지 수정해 보겠습니다(참조:
$file = "/tmp/中文name.tar.gz";
$filename = basename($file);
header("콘텐츠 유형: 애플리케이션/옥텟 스트림 " );
// 중국어 파일 이름 처리
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match("/MSIE/", $ua)) {
헤더( ' 콘텐츠 처리: filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
헤더( "콘텐츠 처리: 첨부 파일; filename*="utf8''" . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
header(' 콘텐츠 처리: filename="' . $filename . '"');
header("콘텐츠 길이: ".filesize($file));
readfile($ file);
지금은 훨씬 좋아 보이지만 여전히 문제가 있습니다. PHP의 readfile은 최대한 효율적이려고 노력하고 PHP를 차지하지 않습니다. 그러나 실제로 파일을 반복하여 직접 출력하려면 MMAP(지원되는 경우) 또는 고정 버퍼를 사용해야 합니다.
출력할 때 Apache인 경우. + PHP mod는 Apache의 출력 버퍼로 전송되어야 합니다. 마지막으로 Nginx + fpm의 경우 별도로 배포되면 추가 네트워크 IO도 발생합니다. >
그러면 웹서버가 PHP 계층을 거치지 않고 사용자에게 직접 파일을 보낼 수 있는 걸까요?
오늘 흥미로운 글을 봤습니다: How I PHP: X- SendFile.
Apache의 모듈 mod_xsendfile을 사용하여 Apache가 이 파일을 사용자에게 직접 보내도록 할 수 있습니다.
$file = "/tmp/中文name.tar.gz";
$filename = basename($file);
header("콘텐츠 유형: 애플리케이션/옥텟-스트림");
//중국어 파일 이름 처리
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header("Content-Disposition : filename*="utf8''" . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $ filename . '"');
}
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
// Xsendfile이 파일을 보내도록 합니다.
header("X-Sendfile: $file");
X-Sendfile 헤더는 Apache에서 처리되며, 응답 파일은 클라이언트로 직접 전송됩니다.
Lighttpd와 Nginx에도 비슷한 모듈이 있습니다. 관심이 있으시면 확인해 보세요
htaccess 파일 Hide index.php 구성
은 Apache 환경의 URL 주소에서 index.php를 숨기는 데 사용됩니다
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA ,PT,L]
PHP 코드에서 공백과 주석 제거
PHP에는 내장된 php_strip_whitespace 읽기 메서드 php 파일을 가져와 코드에서 공백과 주석을 제거하지만 공백과 주석을 제거하기 위해 내용을 직접 읽는 것은 지원하지 않으며 다음 메서드는 문자열 내용 읽기를 지원할 수 있으며 ThinkPHP는 다음과 같습니다. 프레임워크에는 이 메서드가 내장되어 있습니다.
/**
* 코드에서 공백 및 주석 제거
* @param string $content code content
* @return string
*/
function Strip_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 노트 필터링
> >>
break;
케이스 T_END_HEREDOC :
$stripStr .= "THINK;n";
for($k = $i+1; $k < $j; $k++) {
if(is_string($tokens[$k]) && $tokens[$k] == ';') {
$i = $k;
break;
> }
}
휴식;
기본값:
$last_space = false;
$stripStr .= $tokens[$i][1];
}
}
}
return $stripStr;
}
检查字符串是否是UTF 8 | 🎜> [x09x0Ax0Dx20-x7E] # ASCII
| [xC2-xDF][x80-xBF] # 지나치게 길지 않은 2바이트
| xE0[xA0-xBF][x80-xBF] # 오버롱 제외
| [xE1-xECxEExEF][x80-xBF]{2} # 직선 3바이트
| xED[x80-x9F][x80-xBF] # 서로게이트 제외
| xF0[x90-xBF][x80-xBF]{2} # 평면 1-3
| [xF1-xF3][x80-xBF]{3} # 평면 4-15
| xF4[x80-x8F][x80-xBF]{2} # 평면 16
)*$%xs', $string);
}
XSS안전관리
来源于网络,用于对字符串进行XSS안전관리过滤。
function delete_xss($val) {
// 인쇄할 수 없는 문자를 모두 제거합니다. CR(0a), LF(0b) 및 TAB(9)가 허용됩니다
// 이렇게 하면
와 같은 일부 문자 공백을 방지할 수 있습니다. // 일부 입력에서 *허용*되기 때문에 나중에 n, r, t를 사용한 분할을 처리하기 위해
$val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19])/' , '', $val);
// 바로 교체하므로 일반 문자이므로 사용자에게 필요하지 않습니다.
// 이렇게 하면
$search = 'abcdefghijklmnopqrstuvwxyz';
$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$search .= '1234567890!@# $%^&*()';
$search .= '~`";:?+/={}[]-_|'\';
for ($i = 0; $i < strlen($search); $i++) {
// ;?는 ;과 일치하며, 이는 선택 사항입니다.
// 0,7}은 무엇이든 일치합니다. 패딩 처리된 0(선택 사항이며 최대 8자까지 가능)
// @ @ 16진수 값 검색
$val = preg_replace('/([xX]0{0, 8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val) // ;
// @ @ 0{0,7}은 '0'을 0~7회 일치
$val = preg_replace('/(�{0,8}'.ord($search[$i]).';? )/', $search[$i], $val); // ;
}
// 이제 남은 공백 공격은 t, n 및 r뿐입니다
$ra1 = array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed) ', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
$ra2 = array( 'onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate ', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish ', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset ', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
$ra = array_merge($ra1, $ra2);
$found = true; // 이전 라운드에서 무언가가 교체된 한 계속 교체
while ($found == true) {
$val_before = $val;
for ($i = 0; $i < sizeof($ra); $i++) {
$pattern = '/';
for ($j = 0; $j < strlen($ra [$i]); $j++) {
if ($j > 0) {
$pattern .= '(';
$pattern .= ' ([xX]0{0,8}([9ab]);)';
$pattern .= '|';
$pattern .= '|(�{ 0,8}([9|10|13]);)';
$pattern .= ')*';
}
$pattern .= $ ra[$i][$j];
}
$pattern .= '/i';
$replacement = substr($ra[$i], 0, 2).'
$val = preg_replace($pattern, $replacement, $val); // 16진수 태그 필터링
if ($val_before == $val) {
// 대체 항목이 없으므로 루프를 종료합니다
$found = false ;
}
}
}
return $val;
}
쿠키 사용법
쿠키 방법是ThinkPHP内置的函数,于完成cookie的设置、获取和删除操작동。
设置
쿠키 ('이름','값'); //设置cookie
cookie('이름','값',3600); // 指정cookie保存时间为1작은时
高级设置
cookie('name','value',array('expire'=>3600,' 접두사'=>'생각_')); // 指定有效期和前缀
// 下面的代码와上面等效
cookie('name','value','expire=3600&prefix=think_')
获取
$value = cookie('name');
无论是否设置了前缀参数,cookie방법会自动判断。
删除
删除某个cookie值,可以用:
cookie('name',null);
쿠키를 삭제해야 하는 경우 다음을 사용할 수 있습니다.
cookie(null); // 현재 설정된 접두사의 모든 쿠키 값 삭제
cookie(null,'think_ '); // 지정된 접두사
의 모든 쿠키 값을 지웁니다. 일반적으로 BOM 정보 때문에 발생합니다. (BOM 정보를 제거하는 일괄 코드)
로컬 테스트 환경에 배포한 후에는 인증 코드를 표시해야 하는 경우 문제가 발생하지 않는 경우가 있습니다. 서버에서 인증코드를 표시해야 하는 곳이 표시되지 않나요? 같은 문제가 발생하면 아래 내용을 읽어보세요.
대부분의 문제는 BOM 헤더 정보로 인해 발생합니다. thinkphp 구성 파일은 BOM 헤더 정보를 제거해야 합니다. Baidu가 알려줄 것입니다.
제가 일반적으로 사용하는 솔루션은 모든 파일의 BOM 헤더 정보를 제거하는 새로운 코드 파일을 생성하는 것입니다. 그런 다음 실행하세요.
예: 저는 서버에 있습니다. 루트 디렉터리에 새 delBom.php 파일을 생성합니다. http://www.xxx.com/delBom.php 코드는 다음과 같습니다.
if (isset($ _GET['dir'])){ //파일 디렉터리 설정
$basedir=$_GET[ 'dir'];
}else{
$basedir = ' .'
}
$auto = 1; >checkdir($basedir);
function checkdir($basedir){
if ($dh = opendir($basedir)) {
while (($file = readdir($dh)) !== false) {
if ($file != '.' && $file != '..'){
if (!is_dir($ basedir."/".$file)) {
echo "파일 이름: $basedir/ $file ".checkBOM("$basedir/$file")."
"
}else{
$dirname = $basedir."/".$file
checkdir($dirname)
}
}
}
closedir($dh);
}
}
function checkBOM($filename) {
전역 $auto;
$contents = file_get_contents($filename);
$charset[1] = substr($contents, 0, 1); charset[2] = substr($contents, 1, 1);
$charset[ 3] = substr($contents, 2, 1)
if (ord($charset[ 1]) == 239 && ord($charset[2]) == 187 && ord($charset[ 3]) == 191) {
if ($auto == 1) {
$rest = substr($contents, 3);
rewrite ($filename , $rest)
return ("BOM 발견, 자동으로 제거됨 ._http://www.k686.com");
} else {
return ("BOM을 찾았습니다.");
}
}
else return ("BOM을 찾을 수 없음 .");
}
함수 재작성($filename, $ data) {
$filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data) ;
fclose($filenum)
?>
U 메소드 사용 예를 들어 모델이나 템플릿에서 주소 메소드를 사용할 수 있습니다. ThinkPHP에서 자동으로 URL 주소를 생성하는 데 사용됩니다. 다양한 환경 및 구성에 해당하는 URL 주소를 자동으로 생성하는 데 도움이 될 수 있습니다.
기능은 다음과 같습니다.
1. 현재 URL 패턴을 자동으로 식별합니다.
2. 현재 PATH_INFO 구분 기호를 자동으로 식별합니다.
3. 2차 도메인 이름 지원
4. 의사 정적 및 앵커 포인트 지원
5. 라우팅 주소 지원
따라서 U 방식을 사용할 때는 기본적으로 현재 사용에 주의가 필요합니다. URL 패턴과 구성 매개변수가 무엇인지, U 메소드의 통합 규칙에 따라 호출하면 URL 주소가 실제로 생성될 때 U 메소드가 자동으로 식별합니다.
다음은 몇 가지 기본 사용법입니다.
// 현재 모듈의 읽기 작업 주소, 들어오는 매개변수 ID는 5
U('read','id =5 ');
변수를 전달하려면 다음을 사용하세요.
U('read','id='.$vo['id ']);
U 메소드가 템플릿에서 호출되는 경우 일반적으로 다음과 같이 작성해야 합니다.
블로그 모듈의 인덱스 작업 주소를 생성하고 추가 매개변수를 전달합니다.
U(' blog/index','cate_id=5&type=1');
물론 배열을 사용하여 매개변수를 전달할 수도 있습니다.
U('blog/index',array ('cate_id'=>5,'type'=>1));
매개변수가 거의 없는 경우 다음을 수행할 수도 있습니다. 첫 번째 매개변수에 직접 전달하세요:
U('Blog/read?id=5')
U('Blog/cate_id=1&status=1')
지원 그룹 세대 :
U('Home/Blog/read?id=5'); // 홈 그룹 하위 블로그 모듈의 읽기 작업 주소
U('Admin/Blog/cate?cate_id=1&status =1 ');// 관리자 그룹화
은
U 메서드가 여러 개의 pseudo-static을 구성하는 경우 현재 구성된 pseudo-static 접미사를 자동으로 추가한다는 의미입니다. 첫 번째 접미사는 기본적으로 추가됩니다. 의사 정적 접미사를 지정해야 하는 경우 다음을 사용할 수도 있습니다.
U('Blog/read','id=1','xml' );
은 의사 정적 접미사 "가 포함된 URL 주소를 출력하는 것을 의미합니다. 예:
U('/news/1');
은 생성되는 URL 주소가 news/1과 같은 라우팅 주소라는 의미입니다.
도메인 이름이 포함된 URL 주소를 생성해야 하는 경우 다음을 사용할 수 있습니다.
U('Blog/read@blog.thinkphp.cn',' id=1') ;
또는
U('Blog/read@blog','id=1');
은 현재 도메인 이름의 블로그 2차 도메인 이름 주소를 사용한다는 의미입니다.
앵커 포인트 생성 지원(지원하려면 최신 Git 버전을 업데이트해야 합니다.)
U('Blog/read#review','id= 5');
생성된 URL 주소 끝에 #review 앵커가 있어 댓글 섹션으로 쉽게 이동할 수 있습니다.
이미지의 HTTP 캐시를 설정하고, JS, CSS도 설정할 수 있습니다.
Apache 환경이라면 추가하면 됩니다. .htaccess 파일에 있습니다. 다음 코드는 HTTP 캐시와 이미지의 유효 기간을 설정하고(아파치의 헤더 모듈 지원을 활성화해야 함) 웹 사이트의 이미지 리소스 요청 부담을 줄이고 액세스 속도와 귀하의 페이지 속도 값^_^.
헤더 세트 Cache-Control "max-age=604800"
위 코드는 1주일 HTTP 캐시를 사용하도록 웹사이트의 이미지를 설정합니다. js 또는 css 파일에 http 캐싱을 추가할 수도 있습니다.
문자열에 외부 링크가 있는지 확인
/**
* all_external_link는 문자열에 외부 링크가 포함되어 있는지 감지합니다.
* @param string $text text
* @param string $host domain name
* @ 외부 링크가 없으면 부울 false를 반환하고 외부 링크는 true를 반환합니다.
*/
function all_external_link ($ text = '', $host = '') {
if (empty($host)) $host = $_SERVER['HTTP_HOST'];
$reg = '/ http( ?:s?)://((?:[A-za-z0-9-]+.)+[A-za-z]{2,4})/';
preg_match_all( $reg, $text, $data);
$math = $data[1];
foreach ($math를 $value로) {
if( $value != $host) false 반환;
}
true 반환;
}
htaccess에서 도메인 이름 리디렉션 설정
은 Apache 환경에서만 사용됩니다. htaccess 파일에 다음 코드를 추가하면 www.abc.com으로 리디렉션됩니다. 물론 다른 도메인 이름으로의 리디렉션을 설정할 수도 있습니다.
RewriteEngine 켜짐
RewriteCond %{HTTP_HOST} ^abc.com$ [NC]
RewriteRule ^(. *)$ http://www.abc.com/$1 [R=301,L]
PHP는 클라이언트의 IP, 지리정보, 브라우저 정보, 로컬 실제 IP를 획득
// 클라이언트의 IP, 지리정보, 브라우저, 로컬 실제 IP를 획득하는 함수
class get_gust_info {
////방문자 브라우저 유형 가져오기
function GetBrowser(){
if(! 비어 있음 ($_SERVER['HTTP_USER_AGENT'])){
$br = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/MSIE/i',$br)) { $br = 'MSIE'; 🎜>
}elseif (preg_match('/Chrome/i',$br)) { $br = 'Chrome'; } elseif (preg_match('/Safari/ i',$br)) { $br = 'Safari'; }elseif (preg_match('/Opera/i',$br) ) { $br = '오페라'; }else { $br = '기타'; } return $br; }else{return "브라우저 정보를 가져오지 못했습니다!";} } ////방문자 브라우저 가져오기 언어 함수 GetLang(){ if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])){ $lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];$lang = substr($lang,0,5);
if(preg_match("/zh-cn/i",$lang)){
$lang = " 중국어 간체";
}elseif(preg_match("/zh/i",$lang)){
$lang = "중국어 번체";
}else{
$lang = "English";
}
return $lang; ";}
}
////게스트 운영 체제 가져오기
function GetOs(){
if(!empty($_SERVER['HTTP_USER_AGENT'])){
$OS = $_SERVER['HTTP_USER_AGENT'];
if (preg_match('/win/i',$ OS)) {
$OS = 'Windows';
}elseif (preg_match('/mac/i',$OS)) {
$OS = ' MAC';
}elseif (preg_match('/linux/i ',$OS)) {
$OS = 'Linux';
}elseif (preg_match( '/unix/i',$OS)) {
$ OS = 'Unix';
}elseif (preg_match('/bsd/i',$OS)) {
$OS = 'BSD';
}else {
$OS = '기타';
}
return $OS;
}else{return "게스트 운영 체제 정보를 가져오지 못했습니다! ";}
}
////방문자의 실제 IP를 가져옵니다.
function Getip(){
if( !empty($_SERVER["HTTP_CLIENT_IP"])){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
if(!empty($_SERVER ['HTTP_X_FORWARDED_FOR'])){ //프록시 IP 가져오기
$ips =explod(',',$_SERVER['HTTP_X_FORWARDED_FOR ']);
}
if($ip){
$ips = array_unshift($ips,$ip)
}
$count = count($ips );
for($i=0;$i<$count;$i++){
if( !preg_match("/^(10|172.16|192.168)./i" ,$ips[$i])){//LAN IP 제외
$ip = $ips[$i];
break
if($tip =="127.0.0.1"){ //로컬 실제 IP 가져오기
return $this->get_onlineip()
}else {
return $tip ;
}
}
////로컬 실제 IP 가져오기
function get_onlineip() {
$mip = file_get_contents("http://city.ip138.com/city0.asp");
if($mip){
preg_match("/[.*] /",$mip,$sip);
return preg_replace($p,"",$sip[0]);
}else{return "로컬 IP를 얻지 못했습니다! ";}
}
////IP를 기준으로 방문자의 위치 이름을 가져옵니다
function Getaddress($ip=''){
if(empty($ip)){
$ip = $this->Getip()
}
$ipadd = file_get_contents (" http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=".$ip);//Sina API 인터페이스에 따라
가져오기 if($ipadd){
$charset = iconv("gbk","utf-8",$ipadd)
preg_match_all("/[x{4e00}-x{9fa5}]+/u" ,$charset ,$ipadds);
🎜>
$gifo = new get_gust_info(); echo "귀하의 IP:". $gifo->Getip(); echo "echo "< br/>브라우저 유형: ".$gifo->GetBrowser();
echo "
브라우저 언어:".$gifo->GetLang();
echo "
운영 체제: ".$gifo-> ();
?>
URL 안전 문자열 base64 인코딩 및 디코딩
base64_encode 및 base64_decode 메소드를 직접 사용하는 경우 생성된 문자열이 URL 주소에 적합하지 않을 수 있습니다. 다음 방법으로 이 문제를 해결할 수 있습니다. URL 안전 문자열 인코딩:
function urlsafe_b64encode($string) {
$data = base64_encode($string);
$ data = str_replace(array('+','/','='),array('-','_',''),$data);
return $data;
}
URL 안전 문자열 디코딩:
function urlsafe_b64decode($string) {
$data = str_replace(array(' -',' _'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
if ($mod4 ) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
}
클라이언트 브라우저 정보 가져오기
/**
* 클라이언트 브라우저 유형 가져오기
* @param string $glue 브라우저 유형과 버전 번호 사이의 커넥터
* @return string|array 연결 전달 기호를 사용하면 브라우저 유형과 버전 번호가 연결되어 문자열이 반환됩니다. 그렇지 않으면 false가 알 수 없는 브라우저 유형입니다.
*/
function get_client_browser($glue = null) {
$browser = array();
$agent = $_SERVER['HTTP_USER_AGENT']; //클라이언트 정보 가져오기
/* 브라우저 정의 정규식 기능*/
$regex = array(
> "chrome" ',
'opera' => '/(Opera)/(d+.d+) /',
'safari' => '/Version/(d+.d+.d ) (Safari)/',
);
foreach($regex $type => $reg) {
preg_match($reg, $agent, $ data);
if(!empty($data) && is_array($data)){
$browser = $type === '사파리' ? array($data[2] , $data[1]) : array($data[1], $data[2]);
break;
}
}
return empty($browser) ? false : (is_null($glue) ? $browser : implode($glue, $browser));
}
타임 스탬프 친화적인 서식 지정 기능이 바로 지금, 몇 초 전에 표시됩니다.
In 일부 웨이보 시스템에서는 현재 시간과 얼마나 오래 전의 시간을 비교했는지 표시해야 하는 경우가 많습니다. 예: 방금, 5초 전, 5시간 전, 5일 전... 이런
/**
*
+-------------------------------------- --------- ------
*설명 친절함 표시 시간
+ ---------------------------- --------- -----
* @param int $time 형식화할 타임스탬프의 기본값은 현재 시간입니다.
+--- ---------------------------- --------- ---------------
* @return string $text 형식의 타임스탬프
+------ ----- ------------------- ----- --------
* @author yijianqing
+--------- -- ------------------------------------------------ --
*/
function mdate($time = NULL) {
$text = '';
$time = $time === NULL || $time > time() ? time() : intval($time);
$ t = time() - $time; if ($t == 0)
$text = '그냥';
elseif ( $t < 60)
$text = $t '초 전. '; // 1분 이내
elseif ($t < 60 * 60)
$text = Floor($t / 60) '1시간 이내';
elseif ($t < 60 * 60 * 24)
$text = Floor( $t / (60 * 60)) // 1일 이내
elseif ($t < 60 * 60 * 24 * 3)
$text = Floor( $time/(60*60*24)) ==1 ? '어제' . date('H:i', $time) : '어제' . date('H:i', $time) ; //어제와 그저께
elseif ($t < 60 * 60 * 24 * 30)
$text = date('m 월 d 일 H:i', $time); //한 달 이내
elseif ($t < 60 * 60 * 24 * 365)
$text = date('m 월 d 일', $time); //1년 이내
else
$text = date('Y년 m 월 d 일' , $time); //1년 전
return $text;
}
이 함수를 사용하려면 < 🎜 전경 >
{$vo.time|mdate} 시간 친화적인 디스플레이 구현 는 데이터 세트를 트리 구조로 변환 /** * 반환된 데이터 세트를 트리로 변환 * @param array $list 데이터 세트 * @param string $pk 기본 키 * @ param string $pid 상위 노드 이름 * @param string $child 하위 노드 이름 * @param 정수 $root 루트 노드 ID * @return 배열 변환된 트리 */함수 list_to_tree($list, $pk = 'id', $pid = 'pid'를 반환합니다. , $child = '_child', $root=0) { $tree = array();// 트리 만들기 if(is_array($list)) { // 기본 키를 기반으로 배열 참조 생성 [$pk]] =& $list[$key]; $ Parentid = $ Data [$ Pid]IF ($ root == $ Parentid) {
$ TREE $data[$pk]] =& $list[$key]; }else{ > >
}
}
돌아가기 $tree;
}
아바타 편집 - 아바타가 변경되지 않은 경우
현재 완료되었으며 판단은 코드 세그먼트가 업로드됩니다
/* if(!$upload->upload()) {//업로드 오류 메시지
$this->error($upload->getErrorMsg ());
}else{// 업로드가 성공하고 업로드된 파일 정보를 얻었습니다
$info = $upload ->getUploadFileInfo();
} */
변경됨:
$upload->upload();
$info = $upload->getUploadFileInfo() ;
이렇게 하면 이미지를 업로드하지 않아도 오류가 발생하지 않고, 업로드 페이지에
update() 메소드에서 다음과 같이 판단합니다.
if(is_null($info[0]["savename"])){
$data[ 'face']=$_POST['face'];
}else{
$data['face']=$info[0]["savename"]
}
병합 배열 함수
PHP의 기본 array_merge 호출 시 첫 번째 매개변수가 비어 있으면 반환 결과가 발생합니다. 비어 있습니다. 이 함수는 그에 따라 처리합니다.
함수 MergeArray($list1,$list2)
{
if(!isEmpty($list1) && !isEmpty($list2))
{
, Return array_merge($list1,$list2) ):$list1);
}
function isEmpty($data)
{
null 반환 == $data || false == $ data || "" == $data;
}
CURL을 사용하여 검색하는 Google 번역 플러그인 호출
Google 번역 인터페이스를 호출하려면 컬 지원을 활성화해야 합니다.
/*
Google 번역 기능 by QQ366958903
$text 번역할 텍스트
$tl 목표 언어
$sl 사용 using using through through out through out through out through out through out through out through out through 's ' through '' ‐‐ ‐ ‐ 아래로‐, ‐
function translate($text='',$tl='zh-CN',$sl='auto',$ie='UTF-8'){
$ch = curl_init('http://translate.google.cn/');
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,"&hl=zh-CN&sl={$sl}&ie={$ie}&tl={$tl}&text=".urlencode($text));
$html = curl_exec($ch);
preg_match('#(.*?)
return Strip_tags($doc['1'],'
');
}
/ /예: 텍스트를 영어로 번역
$text='Hello';
echotranslate($text,'en');
?>
언어 약어 대응표
'auto'=>'언어 감지',
'sq'=>' ,
'ar'=>'아랍어',
'az'=>'아제르바이잔 알파',
'ga'=> ;'아일랜드어',
'et'=>'에스토니아어',
'be'=>'벨라루스어',
'bg'= >'불가리아어',
'is'=>'아이슬란드어',
'pl'=>'폴란드어',
'fa' =>'페르시아어',
'af'=>'부울(아프리칸스어)',
'da'=>'덴마크어',
'de'=>'독일어',
'ru'=>'러시아어',
'fr'=>'프랑스어',
'tl'=>'필리핀어',
'fi'=>'핀란드어',
'ka'=>'조지아 알파',
'ht'=>'아이티 크리올 알파',
'ko'=>'한국어',
'nl'=>'네덜란드어',
'gl'=>'갈리시아어',
'ca'=>'카탈로니아어',
'cs '=>'체코어',
'hr'=>'크로아티아어',
'lv '=>'라트비아어',
' lt'=>'리투아니아어',
'ro'=>'루마니아어',
'mt'= >'몰타어',
'ms'=>'말레이어',
'mk'=>'마케도니아어',
'no'=> '노르웨이어',
'pt'=>'포르투갈어',
'ja'=>'일본어',
'sv'=>'스웨덴어 ',
'sr'=>'세르비아어',
'sk'=>'슬로바키아어',
'sl'=>'슬로베니아어',
'sw'=>'스와힐리어',
'th'=>'태국어',
'tr'=>'터키어',
'cy'=>'웨일스어',
'uk'=>'우크라이나어',
'eu'=>'스페인 Sk ALPHA',
'es'=>'스페인어',
'iw'=>'히브리어',
'el' =>'그리스어',
'hu'=>'헝가리어',
'hy'=>'아르메니아 알파',
' it'=>'이탈리아어',
'yi'=>'이디시어',
'hi'=>'힌디어',
'ur'=>'인도 우르두 알파',
'id'=>'인도네시아어',
'en'=>'영어' ,
'vi'=>'베트남어',
' zh-TW'=>'중국어(번체)',
'zh-CN' =>'중국어(간체)',
데이터베이스 백업, 전체 데이터베이스 백업 또는 일부 테이블 백업 가능
모두 모듈에 기록됨 이제 전체 데이터베이스를 백업하거나 부분 테이블 백업을 선택할 수 있습니다.
오류 수정, 361행 공백이 잘못 사용되었습니다.
class BaksqlAction 확장 CommonAction {
public $ config = ''; |
public $dir_sep = '/'; 🎜>
parent::_initialize(); header("콘텐츠 유형: text/html;charset=utf-8");> 저장됨
<옴> 'iscompress' = & gt; 0, // GZIP 압축 활성화 여부 [Unbound]'isdownload' = & gt; 0 // > ); $this-> dbName = C('DB_NAME'); $this->model = new Model(); //$sql = 'set Interactive_timeout=24*3600' //$sql = 'set Interactive_timeout= 24*3600'; 🎜> } /* - * +------------------------- -------- ---------------- * * @ 백업된 데이터 목록 * +--------------- ----------- -------- */ 함수 인덱스() { $path = $this->config['path']; $fileArr = $this->MyScandir ($path); foreach ($fileArr as $key => $value) { Time = date('Y-m-d H:i:s', filemtime($path . ' /' . $value)); $fileSize = filesize($path . '/' . $value) / 1024; | '; 🎜>
}
}
$this->할당('list', $list);
$this->display() ;
}
/* -
* +------------------------- ------- ----------------- ----
* * @ 데이터 시트 가져오기
* + -------------------------- ----------- ----------
*/
함수 tablist() {
$list = $this->model->query("{$this->dbName}에서 테이블 상태 표시"); //테이블 정보 가져오기
//echo $Backup - >getLastSql();
$this->할당('list', $list);
$this->display();
}
/* -
* +-------------------------------- - --------------------------------------
* * @ 전체 백업 데이터베이스
* +---------------------------- ---------------------
*/
기능 백올 () {
$tables = $this->getTables();
if ($this->backup($tables)) {
$this- >success ('데이터베이스 백업이 성공했습니다!', '/Public/OK');
} else {
$ this- & gt; );
}
}
/* -
* +----------------- --------- --------------- ---------
* * @ 테이블별 백업, 배치
* +------ --------- --------------- ------
*/
function backtables() {
$tab = $_REQUEST['tab'];
if ( is_array($tab))
$tables = $tab;
else
$tables[] = $tab;
if ($this- >backup($tables)) {
if (IS_ARAY ($ tab))
$ This-& GT; Success ('데이터베이스 백업 성공! ');
> ~ | ~ ~ if ($this->recover_file($_GET['file'])) { public/ok ');
} else {
$ this- & gt; 오류(' 데이터 복원 실패! ');
🎜>
} / /데이터 백업 삭제 function deletebak() { if (unlink($this->config['path'] . $this->dir_sep . $_GET['file' ])) { ~ > ------------ ---------- * * @ 백업 파일 다운로드* +--------- ------------------------ ------------- --- */ 함수 downloadBak() { $file_name = $_GET['file']; $file_dir = $this->config['path']; 사용 사용 사용 ' 's .
} Else {
$ File = FOPEN ($ file_dir. "/". ; -stream") ;
header("Accept-Ranges: bytes");
header("Accept-Length: " . filesize($file_dir . "/" . $file_name)) ;
header('Content-Transfer-Encoding: Binary');
header("Content-Disposition: attachment; filename=" . $file_name) // 브라우저에 실제 파일 이름을 제공합니다. downloading
header('Pragma: no-cache');
header('Expires: 0');
//출력 파일 콘텐츠
echo fread($file, filesize($file_dir . "/" . $file_name));
fclose($file);
🎜> }
/ * -
* +---------------------- ------- ----------------------
* * @ 파일 배열을 가져옵니다. 디렉토리
* +---------------------------- -------- ----------
* * @ $FilePath 디렉터리 경로
* * @ $Order Sort
* +---------------------- ----------- -------------------------- -----------
* * @ 지정된 디렉터리의 파일 목록을 가져와서 배열을 반환합니다
* +------------ --------- --------------- ------------
*/
개인 함수 MyScandir($FilePath = './', $Order = 0) {
$FilePath = opendir($FilePath);
while ($filename = readdir( $FilePath)) {
$fileArr[] = $filename;
$fileArr 반환 ; ********************************************* ** ****************** */
/* -
* +------------ -- ------------------------------------------------ -- ----------
* * @ 백업 파일 읽기
* +------ -- ------------------------------------------------ -- --
* * @ $fileName 파일 이름
* +------------ -- ------------------------------------------------
*/
비공개 함수 getFile($fileName) {
$this->content = '';
$fileName = $this- >trimPath($ this->config['path'] . $this->dir_sep . $fileName);
, '.');
if ($ext = = '.sql') {
$this->content = file_get_contents($fileName);
elseif ($ext == '.gz') {
🎜> $this->error('인식할 수 없는 파일 형식!'); 존재하지 않습니다!');
}
}
/* -
* +--------------- ------------------- ----- ----------
* * @ 디스크에 데이터 쓰기
* +- ------------------ -------------------------------- ----- ---
*/
개인 함수 setFile() {
$recognize = '';
$recognize = $this->dbName ;
$fileName = $this->trimPath($this->config['path'] . $this- >dir_sep . '_' . 날짜('YmdHis') . '_' . mt_rand(100000000, 999999999);
$path = $this->setPath ($fileName);
if ($path !== true) {
$ this- & gt; error ("" 백업 디렉터리 디렉터리 '$ PATH'를 생성할 수 없습니다. " ); ['isCompress'] == 0) {> ;
}
} else {
if (function_exists('gzwrite')) {
$fileName .= '. ;
gzclose($gz) ; } Else {
$ this- & gt; error ('' '파일 쓰기에 실패했습니다. 디스크 공간을 확인하시거나 권한!');
}
} else {
~ > $this->downloadFile($fileName);
} }
}
비공개 함수 TrimPath($path) {
return str_replace(array ('/', '\', '//', '\\'), $this->dir_sep, $path);
}
비공개 함수 setPath($fileName ) {
$dirs =explod($this->dir_sep, dirname($fileName));
$tmp = '';
foreach($dirs as $dir) {
$tmp .= $dir . $this->dir_sep;
if (!file_exists ($ TMP) &&! @mkdir ($ TMP, 0777))
$ TMP 반환
}
true 반환 🎜>
//테스트되지 않음 비공개 함수 downloadFile($fileName) { ob_end_clean(); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header('Content- 설명: 파일 전송'); header('Content-Type: application/octet-stream '); header('Content-Length: ' . filesize($fileName)); header('Content-Disposition: attachment; filename=' . basename($fileName)) ; readfile($fileName); } /* - * +--------------- ------------ ------------ --------- * * @ ` `문자열 * +------ ------------------------- ------------------------- ----
* * @ $str 문자열
* +- ----------- ------------- -----------
* * @ Return `$str`
* +---- ----------------- ------- -----------------
*/
개인 함수 역인용($str ) {
return "`{$str}`";
}
/* -
* +--------- ----------------------------- -------- -----
* * @ 데이터베이스의 모든 테이블 가져오기
* +--- ------ ------------------ ------ ------------
* * @ $dbName 데이터베이스 이름
* +------------ ------- ------------------------------ ------- -----
*/
비공개 함수 getTables($dbName = '') {
if (!empty($dbName )) {
$sql = '다음 테이블 표시' . $dbName;
}
$result = $this->model->query($sql);
$info = 배열();
foreach ($result as $key => $val) {
$info[$key] = current($val);
}
return $ info;
}
/* -
* +------------------------- -------------------------------------
* * @ 전달된 데이터를 지정된 길이에 따라 배열로 나눕니다.
* +--------- - ------------------------------------------------- -
* * @ $array 나눌 데이터
* * @ $byte 나눌 길이
* +--------- ---- --------------------------------- ---- ---------
* * @ 지정된 길이만큼 배열을 분할하여 분할된 배열을 반환
* +--------- -- ------------------------------------------------ -- -----------
*/
전용 함수 ChunkArrayByte($array, $byte = 5120) {
$i = 0 ;
$sum = 0;
$return = array();
foreach ($array를 $v로) {
$sum += strlen( $v);
if ($sum < $byte) {
$return[$i][] = $v;
} elseif ($ 합계 = = $바이트) {
$return[++$i][] > $ RETURN [++ $ i] [] [] = $ v
$ 나는 ++ ;
$ SUM = 0;
}
}
return $return; ----------------------- -----
* * @ 데이터 백업 {테이블, 뷰, 데이터 각각 백업}
* +--- -------------- ----------------------- ------
* * @ $tables 백업이 필요한 테이블 배열
* +--------- ----------- -------------------------- --
*/
개인 기능 백업($tables) {
if (empty($tables))
$this->error ('백업할 데이터 테이블이 없습니다! ');
$this->content = '/* 이 파일은 MySQLReback ' .date('Y-m-d H:i:s') ' * /';
에 의해 생성되었습니다. foreach ($tables as $i => $table) {
$table = $this->backquote($table); ` $ tablers = $ this-& gt; model-& gt; query (" show create table {$ table} "); // 현재 테이블의 생성문을 가져옵니다.
if (! ($tableRs[0]["Create View"]) ) {
$this->content .= "rn /* 뷰 구조 만들기 {$table} */";
$this->content .= "rn DROP VIEW IF EXISTS {$table};/* MySQLReback 분리 */ " . $tableRs[0]["Create View"] . ";/* MySQLReback 분리 */";
}
if (!empty($tableRs[0]["Create Table"])) {
} $this->content .= "rn /* 테이블 구조 생성 {$table} */";
$this->content .= "rn DROP TABLE IF EXISTS {$table};/* MySQLReback 분리 */ " . $tableRs[0][" 테이블 만들기"] ";/* MySQLReback 분리 * /";
$tableDateRow = $this->model->query("SELECT * FROM {$table}");
$valuesArr = array();
&$v) {
if ($ v == '') // TREE 반환
emph를 0으로 수정하는 경우 $ v = 'null'; // 🎜> ~ $ v = "'" . mysql_escape_string($v) . "'"; 🎜> $valuesArr[] = '(' . implode (',', $y) . ')';
sArr);
> * 데이터 삽입 { $table} */";
~ 🎜> }
}
}
if (!empty($this->content)) {
$this->setFile();
}
true 반환
}
/* -
* +---------------- ---------- -------------- ----------
* * @ 데이터 복원
* +--------- -------------- ---------- -
* * @ $fileName 파일 이름
* +---------------------------- ----------------- --------------------------------- -
*/
비공개 함수 receive_file($fileName ) {
$this->getFile($fileName); 사용 , $this->content);
foreach ($content as $i => $sql) {
sql);
if (!empty($ sql)) {
$mes = $this->model->execute($sql);
if (FALSE === $ mes) {// null 쓰기 실패 , '
$ table_change = array (' null '= & gt;' '');
~ }
복원에 문제가 발생했습니다.';
기타 > }
?>
$this->_get() 사용 예
$ this- >_get('a','b','c');
세 개의 매개변수:
a, $_GET submit 나오는 변수 이름
b. 필터 기능('trim' / 'trim,String'과 같이 쉼표로 구분된 여러 항목); >
c, 기본값;
지정된 오류 코드와 오류 페이지를 반환하는 간단한 함수
httpstatus( '404' );
은 클라이언트에 404 오류를 보내고 오류 페이지를 사용자 정의할 수 있습니다.
common.php에 함수를 넣으면 자동으로 로드되어 마음대로 호출할 수 있습니다.
/**
* 오류 코드를 반환하고 오류 페이지를 항목 파일 디렉터리 ./Public/httpsstatus(404.html, 403.html, 503.html 등) 아래에 배치합니다.
* @ param $string 에러 코드
* @param $msg NOT FOUND 등의 에러 메시지는 생략 가능
*/
function httpstatus($ string="404 ",$msg=""){
header("http/1.1 {$string} {$msg}");
include './Public/httpstatus/ '.$string .'.html';
종료;
}