2015. 4. 1. 13:07

금일 작업중 Fatal error: Call to undefined function mime_content_type() in ~ 라는 오류가 발생하였습니다.

현재 작업 환경은 윈도우, XAMPP를 사용하고 있는데요.

파일 첨부와 관련한 작업을 하던중 파일의 정보를 확인하려던 차에 상기 오류가 발생한 것입니다

 

위 오류의 해결방법은 의외로 간단합니다.

php.ini파일의 extension=~ 이라는 부분을 수정/추가하면 됩니다.

그러나 동작하는 플랫폼에 따라 조금 다릅니다.

 

1. window

extension=php_fileinfo.dll 을 추가합니다.

참고로 제가 사용하고 있는 XAMPP에서는 저부분이 주석처리되어 있어서

주석을 해제만 하였습니다.

 

2. Linux등

extension=fileinfo.so 를 추가합니다.

 

php.ini을 수정하였기 때문에 물론 Apache를 재실행하여야 합니다.

 

 

그리고  mime_content_type는 deprecated 되었습니다. ㅡㅡ;

 

 

 

함수의 상세 설명페이지 의 일부분인데요 deprecated되었다고 나오며

Fileinfo function들을 이용하라고 합니다.

 

 

 

물론 fileinfo function들도 위에서 언급했던  php_fileinfo.dll 이나 fileinfo.so가 php.ini에 추가되어 있어야 합니다.

 

fileinfo 관련 함수를 사용한 예입니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

//파일을 저장
$file_name = $_FILES['strFile']['name'];	
if(!move_uploaded_file($_FILES['strFile']['tmp_name'], "./data/files/".$file_name)){
	echo"파일을 복사하는데 실패 했습니다.";
	exit;
}
		
$finfo = finfo_open(FILEINFO_MIME_TYPE);
	
if (!$finfo) {
   echo "fileinfo database failed";
   exit;
}

$filename = "./data/files/".$file_name;
echo finfo_file($finfo, $filename);

finfo_close($finfo);

 

Posted by 작은0악마
2015. 3. 30. 11:36

게시판이나 온라인 상담등에서 로그인을 하지 않은 사용자에게 글쓰기를 허용할 경우

시간이 흘러서 사이트가 알려지면 스팸성 글들이 많이 올라오게 되는 경우가 많습니다.

$HTTP_REFERER를 확인하여 처리하기도 했었는데요.

요즘은 $HTTP_REFERER를 확인하여도 스팸성 글들이 올라오기도 합니다.

 

그래서 스팸글 자동등록을 방지하는 오픈소스를 소개해 드립니다.

Securimage라는 오픈소스인데요 PHP를 사용하여 captcha images 와 audio를 만들어주는 소스입니다.

소스와 설명등은 해당 홈페이지 https://www.phpcaptcha.org/에서 확인하실 수 있습니다.

 

 

현재 3.5.2 버젼까지 배포되고 있습니다.

여기서 Demo를 보실 수도 있고 다운받으실 수도 있습니다.

 

다음은 다운로드 페이지 입니다.

 

 

다운로드 페이지를 보시면 기부금에 대한 얘기가 나옵니다.

기부금으로 3(미국)달러를 요구하였습니다.

그러나 꼭 기부를 해야 하는 것은 아니며 유용하였다면 기부를 해주면 쌩큐~ 라는것 같네요

 

해당소스를 다운받아 서버에 올렸습니다.

그리고 아래의 두가지 방법으로 각각 테스트하였습니다.

 

1. 코드를 직접 삽입하는 방법

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

CAPTCHA Image   Reload Image
Enter Code*:

 

2. 클래스를 이용하는 방법

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

// show captcha HTML using Securimage::getCaptchaHtml()
require_once './securimage/securimage.php';
$options = array();
$options['input_name'] = 'ct_captcha'; // change name of input element for form post

if (!empty($_SESSION['ctform']['captcha_error'])) {
 // error html to show in captcha output
 $options['error_html'] = $_SESSION['ctform']['captcha_error'];
}

echo Securimage::getCaptchaHtml($options);

위 두 경우 모두 파일이나 이미지등의 경로는 상황에 맞게 변경해 주셔야합니다.

 

아래는 위 코드중 2번째 방법을 써서 적용해본 이미지입니다.

 

 

실제 음성이 들리는 것까지 확인하였으며 익스11과 크롬에서 동작 테스트를 완료하였습니다.

 

* 추가 (클래스 이용시)

1. "Type the text: " 문자 변경 : 이미지를 불러오는 부분에서 옵션을 추가

   예 ) $options['input_text'] = '원하는 문구';

 

2. DB입력부분에서 값 확인

 

$captcha = $_POST['ct_captcha'];
			
require_once './securimage/securimage.php';
$securimage = new Securimage();

if ($securimage->check($captcha) == false) {
 echo"error";			
}else{
 echo "OK";
}
Posted by 작은0악마
2015. 3. 20. 11:25

최근 홈페이지의 보안도 이슈가 되고 있는데요.

취약점을 찾고 해킹을 하기 위해 SQL Injection이나 XSS등의 공격을 하기도 합니다.

이에 대응하는 공개된 많은 자료들이 있으며 잘 알려진 공개 보드에도 적용이 되어있습니다.

 

또한 인터넷침해대응센터에서는 홈페이지 보안 강화도구 캐슬을 무료로 배포하고 있습니다.

 

 

 

다운로드를 클릭하면 새 팝업이 뜨면서 이메일을 입력해 달라고 합니다.

이메일을 입력하면 해당 소스와 매뉴얼이 첨부파일로 도착합니다.

 

지원해주는 언어는 다음과 같습니다.

1. PHP

2. ASP

3. ASP.net

4. JSP

5. SPRING Framework

 

 

설치 방법은 의외로 간단합니다.

 

1.압축을 풀고 서버에 맞는 소스를 찾아서 FTP로 전송

2. 해당 폴더 및 하위 폴더의 권한을 707로 변경

3. 브라우저에서 해당폴더에 접근(어드민 설정등 install이 시작)

4. 로그인 후 설정을 필요에 맞게 수정

5. 홈페이지 소스에서 공통적으로 불러오는 코드에 캐슬 관련 코드 삽입(2줄)

 

 

다운로드를 바로 연결하지 않고 메일로 보내주기 때문에

어떤 이유가 있는것인지 몰라서

실제 설치한 화면과 메뉴얼등의 이미지와 코드등은 첨부하지 않았습니다.

 

 

2015-03-23 추가

* 적용한 사이트에서 문제가 좀 발생하였습니다.

POST등으로 넘어온 변수의 값이 날라가는 현상이 보여지네요

좀 더 확인한 후 포스팅하겠습니다.

 

** 추가 2

소스가 제작된지 좀 오래되어서 preg_replace와 같은 deprecate된 함수들이 있어서 알림문구등이 발생!!

Posted by 작은0악마
2015. 2. 25. 16:50

요즘 반응형 웹들이 많이 나오고 있습니다만 여러가지 상황에 따라서

반응형이 아닌 별도의 모바일 웹을 만들어서 사용하기도 합니다.

이럴때 홈페이지에 접근한 장비가 모바일장비인지 아닌지를 확인할 필요가 있는데요.

괜찮은 오픈소스가 있어서 소개를 해드리겠습니다.

 

Mobile Detect 라는 오픈소스입니다.

라이선스는 MIT 라이선스입니다.

 

 

 

파일을 다운받아서 압축을 풀게되면 4개의 폴더와 파일들이 있습니다.

그중 Mobile_Detect.php 파일만 있어도 됩니다.

 

해당 홈페이지에 보시면 많은 기능들이 있습니다만

제가 필요했던 기능에 대해서만 잠깐 살펴보겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

// Include and instantiate the class.
require_once 'Mobile_Detect.php';
$detect = new Mobile_Detect;

// 모바일 장비 확인 (폰과 테블릿 모두)
if ( $detect->isMobile() ) {
 //필요한 기능 코딩
}

// 테블릿 장비인지 확인
if( $detect->isTablet() ){
 //필요한 기능 코딩
}

// 모바일 장비중 테블릿을 제외
if( $detect->isMobile() && !$detect->isTablet() ){
 //필요한 기능 코딩
}

// Check for a specific platform with the help of the magic methods:
// 장비의 OS가 iOS(아이폰)인지 확인
if( $detect->isiOS() ){
 //필요한 기능 코딩
}

//장비의 OS가 안드로이드인지 확인
if( $detect->isAndroidOS() ){
 //필요한 기능 코딩
}

 

사용법이 쉬워서 더 설명이 필요없을것 같네요 ^^;

 

위와 같이 모바일을 체크했다면 보통은 모바일 웹 페이지로 redirect를 시켜주는데요.

이때 자바스크립트의 location.href를 사용해도 되지만

meta 태그를 이용하시는 것도 좋을것 같습니다.

<meta http-equiv='refresh' content='0; url=모바일 페이지 주소'></meta>

 

 

Posted by 작은0악마
2015. 2. 12. 17:16

mysqldump나 phpMyAdmin에서 DB를 다운받으면 자료가 많을 경우 파일의 크기가 무척 큰 경우가 있습니다.

제 경우는 약 900메가가 넘었는데요. 이렇게 파일의 크기가 크면 일반적인 텍스트 에디터로는 읽을 수가 없습니다.

그래서 PHP로 해당 파일을 처리하는 코드를 작성하였습니다.

 

1. 아래 코드는 dump받은 sql파일에서 테이블을 생성하는 코드만 남기고

데이터를 INSERT하는 부분을 제거하여 다른 파일로 저장하는 코드입니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$fileName_ori = "bigdata.sql";
$handle_ori = fopen($fileName_ori, "r");//읽기 모드로 파일 열기

$fileName_target = "tables.sql";
$handle_target = fopen($fileName_target, "w");//쓰기 모드로 파일 열기

while( !feof($handle_ori) ) {
 $buffer = fgets($handle_ori, 4096);
 //echo $buffer;
		
 if(strpos($buffer, "INSERT INTO") === false)
  fwrite($handle_target, $buffer);											
}

fclose($handle_ori);//파일닫기
fclose($handle_target);//파일닫기

 

2. 다음 코드는 테이블을 생성하는 코드와 데이터를 INSERT하는 코드를 모두 포함하지만

다른 텍스트 에디터로 읽을 수 있도록 파일을 나누는 코드입니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$fileName_ori = "bigdata.sql";
$handle_ori = fopen($fileName_ori, "r");//읽기 모드로 파일 열기

$file_num = 1;
$line_limit = 1000; //각 파일에 저장할 line 수

$fileName_target = "slice_".$file_num.".sql";
$handle_target = fopen($fileName_target, "w");//쓰기 모드로 파일 열기

$i = 1;
while( !feof($handle_ori) ) {
 $buffer = fgets($handle_ori, 4096);
 //echo $buffer;
 fwrite($handle_target, $buffer);
		
 if($i >= $line_limit){
  fclose($handle_target);//파일닫기
  $file_num++;
  $i = 0;
  $fileName_target = "slice_".$file_num.".txt";
  $handle_target = fopen($fileName_target, "w"); //쓰기 모드로 파일 열기
 }
 $i++;		
}

fclose($handle_ori);//파일닫기
fclose($handle_target);//파일닫기

 

쓰기 모드로 파일을 열때 인수를 "w"로 주었기 때문에

실행시 같은 이름의 파일이 있을 경우 그 파일의 이전 내용은 사라집니다.

 

만약 한줄의 길이가 매우 길다면 fgets()함수에서 4096의 값을 더 늘려주시면 됩니다.

 

문자열 encoding에 대해서는 고려하지 않았습니다.

읽는 파일과 저장할 파일의 문자셋을 확인하여

저장전에 iconv() 함수를 사용하셔서 처리하시면 됩니다.

 

위 두 코드는 원본 sql 파일의 크기에 따라서 실행시간이 매우 길기 때문에

브라우저에서 호출하시면 time out에 걸릴(?) 수 있습니다.

따라서 콘솔에서 실행하시는것을 권합니다.

 

또한 해당 폴더에 쓰기 권한이 없으면 권한을 주어야 합니다.

 

 

Posted by 작은0악마
2015. 2. 5. 13:45

이번엔 배열을 다룰때 중간에 추가하는 방법을 다루겠습니다.

이 방법에는 배열과 관련한 2개의 함수를 사용합니다.

각 함수는 array_slice()array_merge()함수입니다.

 

아래 코드를 보시겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$arr = array("aaa", "bbb", "ccc", "ddd","eee", "fff");
print_r($arr);

 

위 코드를 실행하면 결과는 다음과 같습니다.

"Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd [4] => eee [5] => fff )"

 

이제 코드를 수정해 보겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$arr = array("aaa", "bbb", "ccc", "ddd","eee", "fff");
$add = "jjj";

function insert_array($arr, $idx, $add){		
 $arr_front = array_slice($arr, 0, $idx); //처음부터 해당 인덱스까지 자름
 $arr_end = array_slice($arr, $idx); //해당인덱스 부터 마지막까지 자름
 $arr_front[] = $add;//새 값 추가
 return array_merge($arr_front, $arr_end);
}
$arr = insert_array($arr, 2, $add);
print_r($arr);

 

위 코드를 실행해보면 다음과 같은 결과가 나옵니다.

"Array ( [0] => aaa [1] => bbb [2] => jjj [3] => ccc [4] => ddd [5] => eee [6] => fff )"

 

insert_array()함수를 호출할 때 삽입할 idx를 2를 제시했기 때문에 해당 인덱스에 추가된 것을 보실 수 있습니다.

 

여기서 한가지 덧붙이자면...

지난번 포스팅한 "PHP에서 배열에 값이 포함되어 있는지 여부와 해당 인덱스 가져오기" 와 혼용하여

특정 인덱스 다음에 추가를 하고자 하실때는 insert_array()함수를 호출할때 가져온 인덱스 + 1을 하시면 됩니다.

Posted by 작은0악마
2015. 2. 4. 10:50

문자열에서 특정한 문자(열)이 있는지 여부와 시작 위치를 가져오는 함수(strpos, stripos등)를 사용하다 보면

Warning: strpos(): Offset not contained in string in ~ 라는 경고가 나올때가 있습니다.

위 경고문은 "offset인수는 문자를 포함할 수 없다." 라는 것인데 

이 인수를 숫자를 넣었는데도 이러한 경고가 발생할때가 있습니다.

 

따라서 오늘은 어떠한 상황에서 이러한 경고가 나오는지에 대해 포스팅을 하겠습니다.

 

아래의 코드는 정상적인 코드입니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$search = "op";
$desc = "abcdefghijklmnopqrstuvwxyz";
$offset = 0;
$pos = strpos($desc, $search, $offset);
if($pos === false)
 echo"not found!";
else
 echo"found! pos : $pos";

 

위 코드를 실행시키면 "found! pos : 14"란 결과가 표시됩니다.

 

다음 코드는 실제로 offset인수에 문자열을 넣어봤습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$search = "op";
$desc = "abcdefghijklmnopqrstuvwxyz";
$offset = "a";
$pos = strpos($desc, $search, $offset);
if($pos === false)
 echo"not found!";
else
 echo"found! pos : $pos";

 

그런데 이 코드를 실행시면 다른 경고가 발생합니다.

"Warning: strpos() expects parameter 3 to be long, string given in ~"

 

다시 코드를 수정해 보겠습니다. 이번엔 offset값을 -1로 지정하였습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$search = "op";
$desc = "abcdefghijklmnopqrstuvwxyz";
$offset = -1;
$pos = strpos($desc, $search, $offset);
if($pos === false)
 echo"not found!";
else
 echo"found! pos : $pos";

 

이번엔 "Warning: strpos(): Offset not contained in string in ~ " 라는 경고가 발생합니다.

1. offset 인수에 음수를 사용하면 해당 메시지가 발생합니다.

 

이번에는 문자열을 찾는 대상인 $desc의 값을 변경해보겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$search = "op";
$desc = "";
$offset = 0;
$pos = strpos($desc, $search, $offset);
if($pos === false)
 echo"not found!";
else
 echo"found! pos : $pos";

 

특별한 경고없이 "not found!"가 표시됩니다.

 

다음 코드를 보시겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$search = "op";
$desc = "";
$offset = 2;
$pos = strpos($desc, $search, $offset);
if($pos === false)
 echo"not found!";
else
 echo"found! pos : $pos";

 

이번에도 "Warning: strpos(): Offset not contained in string in ~ " 라는 경고가 발생합니다.

2. 찾는 대상의 값이 NULL일때 offset값을 0이 아닌 다른값이 주어지면 해당 메시지가 발생합니다.

 

$search 의 값은 별도로 테스트 해보지 않았기 때문에 다른 경우가 추가로 있을 수도 있겠지만

위의 경우들을 살펴보시면 해당 메시지가 나왔을때 어디를 점검해봐야 하는지 어느정도는 알 수 있을것 입니다.

 

 

 

Posted by 작은0악마
2015. 2. 2. 14:33

프로그래밍을 하다보면 배열을 사용할 때가 많습니다.

그런데 종종 배열을 정렬해서 사용해야 할 때가 있습니다.

오늘은 배열을 정렬하는 것에 대해 포스팅하겠습니다.

 

PHP에서 배열과 관련된 함수들은 http://php.net/manual/en/ref.array.php에서 확인하실 수 있습니다.

그중에서 정렬과 관련된 함수 몇개를  뽑아보자면 다음과 같습니다.

1. sort()

2. rsort()

3. ksort()

4. krsort()

5. usort()

6. uksort()

7. uasort()

등등...(물론 배열의 정렬과 관련된 함수는 더 있습니다.)

 

위 함수이름에서 sort()라는 이름 앞에 위치한 문자의 공통적인 부분을 알려드리겠습니다.

1. r : 정렬방식이 reverse order (내림차순, descend)라는 뜻입니다.

2. k : 정렬기준이 배열의 값이 아닌 키값을 가지고 정렬한다는 의미입니다.

3. u : 사용자가 정의한 비교함수를 가지고 정렬한다는 의미입니다.

 

즉, 위의 공통적인 부분을 가지고 함수 이름을 보면

1. sort() : 인수로 주어진 배열의 값을 오름차순으로 정렬하여 반환합니다.

2. rsort() : 인수로 주어진 배열의 값을 내림차순으로 정렬하여 반환합니다.

3. ksort() : 인수로 주어진 배열의 키값을 오름차순으로 정렬하여 반환합니다.

4. krsort() : 인수로 주어진 배열의 키값을 내림차순으로 정렬하여 반환합니다.

5. usort() : 사용자가 정의한 비교함수를 사용하여 배열의 값을 오름차순으로 정렬하여 반환합니다.

6. uksort() : 사용자가 정의한 비교함수를 사용하여 배열의 키값을 오름차순으로 정렬하여 반환합니다.

7. uasort() : 사용자가 정의한 비교함수를 사용하며 정렬하지만 배열의 인덱스 값을 유지합니다.

 

각 함수의 이름에 함수 설명페이지로 링크하였습니다.

이미 함수 설명에 예제가 잘 되어 있기 때문에

하나하나 예를 보여드리자니 너무 많아서...(사실 제가 좀 게을러서...ㅡㅡ;)

 

 

위 함수중 1~4까지의 함수는

첫번째 인수로 배열을 받으며 두번째 인수로 졍렬과 관련된 플래그를 받습니다.(두번째 인수는 생략가능합니다.)

 

5~7번까지의 함수는 마찬가지로

첫번째 인수로 배열을 받지만 두번째 인수로는 사용자가 정의한 함수를 받습니다.

따라서 5~7번까지의 함수를 사용하면 2차원 이상의 배열도 정렬이 가능합니다.

 

2차원 배열을 가지고 정렬하는 예를 들어보겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$arrTmp[0] = array('a' => 'abc', 'b' => 'bcd');
$arrTmp[1] = array('a' => 'cde', 'b' => 'aaa');
$arrTmp[2] = array('a' => 'efg', 'b' => 'fgh');

function user_compare_data($a, $b){
 if ($a == $b) {
  return 0;
 }
 return ($a < $b) ? -1 : 1;
}

usort($arrTmp, 'user_compare_data');

foreach ($arrTmp as $item) {
 echo $item['a'] . ', ' . $item['b'] . "
"; }

 

위 코드의 결과는 다음과 같이 나옵니다.

 

abc, bcd
cde, aaa
efg, fgh

 

즉, 주어진 배열의 2차원 배열의 첫번째 키의 값을 기준으로 오름차순 정렬한 결과가 반환됩니다.

 

다음 코드를 보시겠습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$arrTmp[0] = array('a' => 'abc', 'b' => 'bcd');
$arrTmp[1] = array('a' => 'cde', 'b' => 'aaa');
$arrTmp[2] = array('a' => 'efg', 'b' => 'fgh');

function user_compare_data($a, $b){
 if ($a['b'] == $b['b']) {
  return 0;
 }
 return ($a['b'] < $b['b']) ? -1 : 1;
}

usort($arrTmp, 'user_compare_data');

foreach ($arrTmp as $item) {
 echo $item['a'] . ', ' . $item['b'] . "
"; }

 

이 코드의 결과는 다음과 같이 나옵니다.

 

cde, aaa
abc, bcd
efg, fgh

 

사용자 정의 함수에서 2차 배열의 b라는 키값을 기준으로 정렬하게끔 하였기 때문에

정렬 결과가 달라졌습니다.

 

위와 같이 하여 2차원 이상의 배열도 처리가 가능합니다.

 

Posted by 작은0악마
2015. 1. 28. 11:18

프로그램을 작성하다 보면 특정 배열에서 어떤 값이 있는지 확인을 해야 할 필요가 있을때가 있습니다.

그리고 해당 값이 들어 있는 인덱스를 가져와야 할때도 있을 수 있구요

그럴때 사용되는 함수가 in_array()함수 와 array_search() 함수입니다.

 

차이는 in_array()함수는 단지 해당값이 배열에 포함되어 있는지 여부는 true/false로만 반환하는 반면

array_search()함수는 해당값이 있을때 인덱스나 키값을 반환합니다.

또한 array_search()함수는 해당값이 없을때는 NULL을 반환합니다.

 

따라서 단지 배열에 해당값이 있는가 하는 확인만 필요할때는 in_array()함수를...

해당값이 있는지 여부와 인덱스 또는 키값이 필요할때는 array_search()함수를 사용하시면 됩니다.

 

먼저 in_array() 함수의 예제는 다음과 같습니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$array = array("asp", "jsp", "php", "java");
if(in_array("php", $array)){
 echo"exist";
}else{
 echo"none";
}

 

위의 코드에서 결과는 당연히 true이겠죠?

 

 

다음은 array_search()함수의 예제입니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

$array = array("asp", "jsp", "php", "java");
$strIndex = array_search("php", $array);
if($strIndex == ""){
 echo"none";
}else{
 echo"find - " . $strIndex;
}

 

위 코드의 결과는 "find - 2" 가 됩니다.

 

물론 경우에 따라서 조사 대상이 되는 배열이 2차 이상의 배열 일때도 있을 수 있겠으며

다양한 상황이 될 수 있을것입니다.

 

이럴때는 위 두 함수의 첫번째 인수를 배열로 넣을 수 도 있으며

is_array()

is_object()

와 같은 함수를 위 두 함수의 조합과 함께 활용하는 방법도 있을 것입니다.

 

Posted by 작은0악마
2015. 1. 20. 15:03

이번엔 서버의 CPU사용 정보를 가져오는 방법을 알아보겠습니다.

CPU사용 정보를 가져오는 함수는 sys_getloadavg()입니다.

이 함수의 설명을 보시면 반환값은 배열로 반환됩니다.

 

그런데 이 함수를 사용할때 주의 사항이 있습니다.

바로 윈도우 플랫폼에서는 동작을 하지 않는다는 것입니다.

(XAMPP로 작업을 하다 확인해보니 바로 에러를 표시합니다. ㅡㅡ;)

 

 

 

 

윈도우 플랫폼에서는 다른 방식을 사용해야 하는데

해당문서 하단에 아래에 어떤분이 소스를 올려놓으셨습니다.

"rick at rctonline dot nl"로 해당문서에서 검색하시면 찾기 쉬우실 것입니다.

아래는 그분이 올려주신 소스입니다.

(코드는 Syntax Highlighter가 적용되어 모바일에서는 안보일 수 있습니다.)

 

function get_server_load() {
 if (stristr(PHP_OS, 'win')) { //윈도우 플랫폼일때
   $wmi = new COM("Winmgmts://");
   $server = $wmi->execquery("SELECT LoadPercentage FROM Win32_Processor");
           
   $cpu_num = 0;
   $load_total = 0;
            
   foreach($server as $cpu){
    $cpu_num++;
    $load_total += $cpu->loadpercentage;
   }
            
   $load = round($load_total/$cpu_num);
            
 } else {
       
  $sys_load = sys_getloadavg();
  $load = $sys_load[0];
       
 }
        
 return (int) $load;
 
}

 

그런데 제가 설치된 XAMPP에서 테스트를 해보니

$wmi = new COM("Winmgmts://");

위 코드에서 오류가 발생하였습니다.

 

이는 COM class를 인식하지 못하기 때문인데

php.ini 파일에 다음을 추가하시면 됩니다.

extension=php_com_dotnet.dll

물론 윈도우 플랫폼 기준입니다. ^^

 

 

Posted by 작은0악마