안녕하세요 워누입니다.

 

오늘은 그동안 포스팅했던 mkdir, fopen, fclose, fwrite 등을 활용해서 프로그램을 실행한 내용과 전달받은 데이터 등을 기록하는 로그파일을 만들어보는 방법을 포스팅 해보겠습니다. 

 

직전 포스팅에서 언급했던 것처럼 로그파일을 만드는 것은 개발자에게 꽤 중요한 작업이에요. 

귀찮더라도 초급 개발자분들은 이 과정을 꼭 한번씩 거쳐보시는 것을 권장합니다!

 

그럼 바로 시작해보겠습니다!

로그파일은 보통 프로그램 실행 중 정상 혹은 오류에 대한 기록을 잡기 위해 많이 사용합니다. 

그래서 보통 어떤 프로그램을 써먹어볼까 하다가 PHP로 간단한 계산기를 만들고, 계산기록을 메모장에 남겨보는 형태로 진행해보면 되겠다 싶어 바로 html로 요청 페이지를 만들고, php로 응답하도록 로직을 구성해 보았습니다! 

 


Code :: request.html 

<html>
<head>
 <title> PHP 계산기 TEST </title>
</head>
<body>
 <form method="post" action="response.php">
  사칙 연산 : 
  <select name="Calculator">
    <option value="Addition" selected>더하기</option>
    <option value="Subtraction">빼기</option>
    <option value="Multiplication">곱하기</option>
    <option value="Division">나누기</option>
  </select>
  <br>
  첫번째 숫자 : 
  <input type="text" name="FirstNum" value="" /><br>
  두번째 숫자 : 
  <input type="text" name="SecondNum" value="" /><br>
  <input type="submit" value="Submit" />
 </form>
</body>
</html>

UI :: request.html

request.html


일단은 간단하게 두개의 수만 받아서 더할 것인지, 뺄 것인지, 곱할 것인지, 나눌 것인지를 구성해보았습니다. 

요청은 이렇게 구성하고, 다음은 결과를 구성한 코드와 화면을 볼까요?

 


Code :: Response.php

<?php 

//전달받은 데이터를 변수로 저장 
$Calc = $_POST['Calculator'];
$num1 = $_POST['FirstNum'];
$num2 = $_POST['SecondNum'];

//계산한 두 수의 결과값을 저장할 변수 선언
$result = "";

//오늘의 날짜를 변수로 저장 
$logDate = date("Ymd");

//log 폴더 생성 
$dirName = "log";
$isDir = is_dir($dirName);

if($isDir){					//log 폴더가 존재하는 경우
	opendir($dirName);		//log 폴더 열기
} else {					//그렇지 않으면
	mkdir($dirName);		//"log" 폴더 새로 만들기
}

//로그파일 생성. 파일명은 오늘날짜. 
$fileName = $logDate.".log";

//로그파일 열기 
$fp = fopen("./log/".$fileName, 'a+');

//로그파일 기록 시작.
fwrite( $fp,"************************************************\r\n");
fwrite( $fp,"계산시작일시	: ".date("YmdHis")."\r\n");
fwrite( $fp,"num1		: ".$num1."\r\n");
fwrite( $fp,"num2		: ".$num2."\r\n");
fwrite( $fp,"연산기호		: ".$Calc."\r\n");

//사칙연산(+,-,*,/) 요청 값에 따라 구분하여 처리.
switch($Calc){
	case("Addition"):
		$result = $num1+$num2;
		break;
	case("Subtraction"):
		$result = $num1-$num2;
		break;
	case("Multiplication"):
		$result = $num1*$num2;
		break;
	case("Division"):
		$result = $num1/$num2;
		break;
}

//계산결과를 화면에 전달.		
echo "계산결과 :".$result."<br>";

fwrite( $fp,"결과		: ".$result."\r\n");
fwrite( $fp,"************************************************\r\n");

//로그파일 종료
fclose($fp);
?>

UI :: response.php

response.php


요청한 계산에 대한 결과를 이렇게 확인할 수 있었습니다!

계산은 제대로 되었는데 과연 로그 파일은 잘 작성되었는지 한번 보겠습니다. 

 

1. 계산 요청 전 php_prac 폴더의 상태.

기존의 폴더 상태

2. 계산 요청 후 php_prac 폴더의 상태.

더하기 계산 후 폴더 상태

3. log 폴더 상태.

log 폴더 상태 -> log파일이 정상적으로 생성됨.

일단 결과적으로도 잘 생성이 되었네요! 

그럼 로그폴더 안의 txt도 잘 기록되었는지 봅시다. 

 

더보기

************************************************
계산시작일시 : 20210125004605
num1 : 2
num2 : 5
연산기호 : Addition
결과 : 7
************************************************

20200125.log 안의 내용물을 그대로 복사해서 가져왔습니다. 

해당 로그 기록의 요청은 response.php 파일 내 fwrite()부분을 그대로 기재한 것을 볼수가 있네요! 

결과적으로 요청 값을 잘 기록했고, log파일이 생성된 시간과 log폴더 안에

계산 시작일시 시간도 일치하는 것을 볼수 있습니다!

 

혹시나 몰라 1분 내로 곱셈도 한번 더 진행했습니다. 

request.html
response.php

역시나 웹 페이지에 결과가 잘 기재되었네요!

그럼 아까 폴더 경로로 가서 파일이 잘 생성되었는지 봅시다. 

log 폴더 -> 수정한 날짜에 찍힌 시간이 46분에서 47분으로 바뀜

일단, 시간이 업데이트 된걸로 봐서 기록이 잘된것 같네요!

그럼 안의 내용물은 어떤지 한번 볼까요?

더보기

************************************************
계산시작일시 : 20210125004605
num1 : 2
num2 : 5
연산기호 : Addition
결과 : 7
************************************************
************************************************
계산시작일시 : 20210125004750
num1 : 9
num2 : 10
연산기호 : Multiplication
결과 : 90
************************************************

안의 내용물도 잘 업데이트 되었네요! 

계산시작일시가 47분 50초로 적혀 있습니다! 

 

이렇게 로그 파일을 잘 남겨두면, 내가 프로그램을 실행한 시간과 요청했던 데이터,

프로그램 실행 시 이슈 등을 파악하는데 매우 용이하게 사용할 수 있습니다. 

 

로그파일 형식은 굳이 저렇게 안하고 개발자 본인이 작성하고 싶은대로,

그러나 필요한 내용은 반드시 기재하는 용도로 체크해두시면 나중에 조금 더 깊게 개발하실 때 큰 도움이 되리라 생각해봅니다. 

 

오늘 포스팅한 내용도 읽어주신 여러분께 도움이 되길 바라며, 여기서 마치겠습니다! 

감사합니다 ㅎㅎ

안녕하세요 워누입니다! 

오랜만에 tistory 블로그를 작성하네요 ㅎㅎ

회사일과 네이버 블로그를 동시에 병행하다 보니 정신이 없지만, 힘내서 포스팅을 진행해보겠습니다!

이번 포스팅에서는 PHP에서 시간을 표시하는 date() 함수에 대해서 알아보겠습니다. 

 

우선 PHP에서 시간을 표시할 때 아래와 같이 작성합니다. 

 

date(시간 포맷)

시간 포맷이라는 알고 싶은 시간의 단위값(연도 또는 월일, 요일)을 입력합니다. 

어떤 형식인지 아래 표를 같이 보시죠!

(예시 데이터는 2021년 1월 18일을 기준입니다.)

문자 의미 예시
Y 연도를 4자리로 표시 2021
y 연도를 2자리로 표시 21
m 0이 붙은 상태로 월을 표시 01
n 0 없이 월을 표시 1
d 0이 붙은 상태로 일을 표시 18
j 0 없이 일을 표시 18
H 0이 붙은 상태로 시를 표시(24시 표현) 01
G 0 없이 시를 표시(24시 표현) 01
i 0이 붙은 상태로 분을 표시 56
s 0이 붙은 상태로 초를 표시 55
A 오전, 오후를 대문자로 표시 AM
a 오전, 오후를 소문자로 표시 am
D 요일을 세글자로 표시 Mon
l(소문자 엘) 요일을 전체 글자로 표시 Monday
w 요일을 숫자로 표시(0~6, 0:일요일, 6:토요일) 1
M 월을 세글자로 표시 Jan
F 월을 전체 글자로 표시 January
z 올해 1월 1일부터 며칠 지났는지 표시 17

 

각각 대소문자를 구별하고 기능이 다르므로 사용 시 주의하셔야 합니다. 

설명도 다 했으니 이제 예시 데이터를 만들어봅시다!

(date.php라는 파일명으로 아래와 같이 샘플을 작성해봅시다.)

<?php 

//시간 표시 (연도, 월, 일, 시, 분, 초) : 0이 붙어 있는 예시
echo date("Y년 m월 d일 H시 i분 s초")."<br>";

//시간 표시 (연도, 월, 일, 시, 분, 초) : 0이 붙어 있지 않은 예시
echo date("y년 n월 j일 G시 i분 s초")."<br>";

//오전 오후 여부
echo date("A")."<br>";
 
//요일 표기
echo date("D")."<br>";

//올해가 며칠 째인지 표기
echo date("z")."<br>";
?>

결과는 아래와 같이 조회됩니다. 

date.php 실행 결과

생각보다 간단하죠?

date() 함수 안에 괄호에서 큰따옴표(")를 사용하고 그 안에서 문자열로 표기되고, 

표에서 설명한 문자열이 아닌 다른 문자열은 그대로 표기가 되는 것으로 보여집니다. 

.

php를 배우시는 분들이라면, date() 함수를 자유자재로 계속 테스트 해보시길 권장 드립니다. 

 

이번 포스팅에서는 여기서 짧게 마치고, 다음 포스팅에서는 로그(log)라는 파일을 만들어볼건데요,

개발자라면 자신이 만든 프로그램에서 어떠한 이벤트가 발생했을 때 그에 대한 기록들을 남겨두기 때문에 

오늘 포스팅에서 배운 date() 함수를 포함하여 그동안 포스팅을 통해 알려드린 mkdir, fopen, fclose, fwrite 기능을

이용해서 실제 현업에서 써먹는 방법을 간략하게 전달드리도록 하겠습니다!

 

그럼 오늘은 여기서 20000!!

 

 

안녕하세요 워누입니다. 

 

그동안 네이버 블로그에 글을 쓰느라 tistory는 방치를 시켜놨네요 ㅜㅜ 

다행히(?) tistory에도 글을 써야지하고 다짐은 하고 있었는데, 드디어 오늘 포스팅하게 되었습니다 ㅎㅎ 

 

오늘은 지난번에 txt 파일을 생성해보고 읽어오는 것도 해봤으니,

이번에는 파일이 아닌 폴더를 생성하고, 삭제하는 것 기능을 포스팅해볼게요. 바로 시작해봅시다!

.

php에서 폴더를 생성하는 함수는 mkdir입니다!

우선 예제 소스를 보면서 어떻게 사용하는지 감을 잡아봅시다!!

.

<생성할 폴더명을 받을 html 페이지 : mkdir_req.html>

<html>
<head>
 <title> PHP 폴더 만들기 테스트 </title>
</head>
<body>
 <form method="post" action="mkdir_res.php">
  생성할 폴더명 : 
  <input type="text" name="ReqData" value="" /><br>
  <input type="submit" value="Submit" />
 </form>
</body>
</html>

<폴더를 생성하는 php 페이지 : mkdir_res.php>

<?php 

//req html 페이지로부터 전달받은 데이터 저장
$dirName = $_POST["ReqData"];

//폴더 생성
$makeDir = mkdir($dirName, '777');

//폴더 생성 여부 확인
if($makeDir){
	echo $dirName." 폴더 생성 완료!";
}
else {
	echo $dirName." 폴더 생성 실패!";
}

?>

<실행 결과>

mkdir_req.html 페이지

 

mkdir_res.php 페이지
test 폴더 생성

.

html 페이지에서 입력한 'test'라는 이름으로 폴더가 정상적으로 생성된 것을 확인할 수 있네요! 

 

html 페이지는 단순히 생성할 폴더명을 받는 페이지고,

지난번 txt 파일 생성하는 포스팅에서도 한번 언급했으니 넘어가겠습니다.

 

mkdir_res.php 페이지를 보시면 mkdir 함수가 보이실텐데요! 두가지 매개변수($dirName, '777')를 가지고 있습니다! 

mkdir 함수에 들어가는 매개변수는 아래와 같이 설정해주어야 합니다.

 

mkdir(경로 및 생성할 폴더 이름, 퍼미션 설정값)

 

위에서 언급한 매개변수 중 퍼미션(permission)이라 함은 권한을 말하는데요, 3자리의 숫자로 구성됩니다. 

첫번째 자리 두번째 자리 세번째 자리
소유자 권한 그룹 권한 사용자 권한

여기서 소유자는 파일 혹은 폴더 생성하는 사람, 그룹은 소유자가 속한 그룹(혹은 같은 그룹원), 사용자는 폴더를 사용하는 사람(보통 유저)을 의미합니다. 각 권한은 읽기(read), 쓰기(write), 실행(execute)으로 구성됩니다. 

읽기(read) 쓰기(write) 실행(execute)
4 2 1

표를 보면서 정리하면, 읽기 권한을 적용하려면 4, 쓰기 권한을 적용하려면 2, 실행 권한을 적용하려면 1을 입력합니다. 

 

읽기+쓰기 권한을 같이 주고 싶다면 6, 읽기+실행 권한을 같이 주고 싶다면 5,

읽기+쓰기+실행 권한을 모두 주고 싶다면 7을 입력해주시면 됩니다. 

 

윈도우에서는 파일을 오른쪽 버튼 클릭해서 나오는 속성 창에서 보안 항목을 통해 직접 권한을 줄 수도 있습니다. 

.

윈도우 속성 창에서 사용권한 부여

일단 저는 테스트이기도 하고, 보안적으로 문제될 것도 없어서 777로 설정을 하였으나

회사에서는 보안적인 이슈를 위해 755나 744 등으로도 쓰이니 용도에 맞게 권한 설정을 해주시면 될 것 같습니다. 

 

mkdir 함수에 대한 설명은 이정도로 하면 될 것 같습니다ㅎㅎ

이번엔 mkdir 함수로 만든 폴더를 rmdir()이라는 함수로 삭제해보도록 하겠습니다!

 

rmdir 함수는 아래와 같이 사용하면 됩니다! 

rmdir(삭제할 폴더 이름)

정말 단순하죠? 예제 소스도 그냥 단순하게 작성해서 테스트 해보았습니다. 

.

<test 폴더를 삭제하는 php 페이지 :  rmdir.php>

<?php

//폴더 삭제
$removeDir = rmdir('test');

//폴더 삭제 여부 확인
if($removeDir){
	echo "폴더 삭제 완료!";
}
else {
	echo "폴더 삭제 실패!";
}

?>

<실행 결과>

 

rmdir.php 페이지
test 폴더 삭제 확인

.

생성했던 test 폴더가 삭제되고 그동안 블로그에 기재하기 위해 작성하였던 파일들만 남아있네요! 

 

오늘은 이렇게 php로 폴더를 생성하고 삭제하는 방법을 작성해보았는데요! 

다음 포스팅에서는 이전에 포스팅했었던 php로 txt 파일을 생성하는 방법과, 오늘 포스팅한 폴더 생성하는 방법으로 

간단하게 날짜에 맞게 로그파일을 생성하는 방법을 포스팅해보겠습니다!

 

그럼 오늘은 여기서 마무리해볼게요~ 긴 글 읽어주셔서 감사합니다!

안녕하세요 워누입니다! 

오늘은 제가 회사에서 개발하다가 궁금한 점이 부딪혀서 직접 알아본 내용을 포스팅하고자 합니다. 

.

상황은 API 호출 시 특정 URL로 form-data를 post로 던지고 그 결과를 받아오는 로직입니다!

 

1. file_get_contents

//Post api call
function reqPost($data, $url){
	$requestData = stream_context_create(array(
		'http' => array(
			'method' => 'POST',
			'header' => 'Content-type:application/x-www-form-urlencoded;charset=euc-kr',
			'content' => $data,
			'timeout' => 15
		)
	));
	
	$response = file_get_contents($url, FALSE, $requestData);
	return $response;
}

 

2. curl

//Post api call
function reqPost(Array $data, $url){
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);	//connection timeout 15 
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));	//POST data
	curl_setopt($ch, CURLOPT_POST, true);
	$response = curl_exec($ch);
	curl_close($ch);	 
	return $response;
}

API를 호출하는 방식의 차이이고, 제가 적용한 소스에서 두 방식 모두 결과는 같습니다!

 

그렇다면 대체 뭐가 다른지 알아야 다른 모듈을 개발하면서 API를 호출할 때,

file_get_contents()를 쓸지, curl을 쓸지 쉽게 결정하겠죠? 

 

일단 file_get_contents()과 curl은 함수/라이브러리라는 개념적인 차이점이 있습니다. 

표로 아래와 같이 정리해볼 수 있겠습니다. 

명칭 구분 설명
file_get_contents() 함수 전체 파일을 문자열로 읽어오는 함수. php 4.3부터 7.x버전까지 사용 가능

*매개변수 ($filename, [$use_include_path, $context, $offset, $maxlen])
[] : 옵션 매개변수
$filename : 읽어올 파일명 or URL
$use_include_path : 파일 내 참조된 내용까지 읽어올지 여부 결정. 
$context : stream_context_create()로 작성된 유효한 컨텍스트 리소스. 
$offset : 몇 번째 데이터부터 읽을건지 설정.
$maxlen : 얼만큼 데이터를 읽을건지 length(길이)를 설정.
curl 라이브러리 다양한 프로토콜을 이용하여 데이터를 주고받는 기능 제공.
http, https, ftp, gopher, telnet, dict, file, ldap 등의 프로토콜 지원.

*함수
curl_init : curl 초기화 
curl_setopt : curl 데이터 옵션 설정 
 <예시>
 CURLOPT_URL : 통신할 URL 설정
 CURLOPT_RETURNTRANSFER : 요청 결과를 문자열로 반환 
 CURLOPT_CONNECTTIMEOUT : 요청 시 최대 Connection timeout 설정
 CURLOPT_SSL_VERIFYPEER : 원격 서버의 인증서가 유효한지 체크
 ...
curl_exec($ch) : curl_setopt를 통해 설정된 $ch에 대하여 통신을 실행하는 함수.
curl_close($ch) : curl $ch 종료함수.

이렇게 보니까 차이가 좀 크네요! 확실히 curl이 좀더 복잡해보입니다.

만약 두개가 서로 차이점이 없다면, 굳이 복잡한 curl을 쓸 필요가 없겠지만

php 개발자들이 가급적 curl을 선호하는 이유가 있습니다! 검색해서 찾아보고 정리해보았습니다.

 

1. file_get_contents()를 사용할 경우, 로그인이 필요하지 않은 페이지의 URL만 확인 가능하며, 읽어올 대상 페이지의 서버 혹은 소스에 allow_url_fopen 옵션이 활성화되어 있어야 합니다. 

그러나 이마저도, 최근에 allow_url_fopen 옵션에 대하여 보안문제가 이슈가 되어 php 개발자들이 해당 기능을 잘 사용하지 않는다고 하니 file_get_contents()를 사용하기가 점점 어려워 지고 있습니다.

 

2. curl_setopt를 통해 사용할 수 있는 설정들이 다양합니다. 범위가 함수냐, 라이브러리냐의 차이이기 때문에 간단한 기능이라면, file_get_contents()를 쓰겠지만 다양한 기능을 쓴다면 당연히 curl로 처리하는게 더 좋겠죠?

 

3. 같은 옵션, 같은 함수를 반복적으로 호출할 시 속도면에서 약 15~30%정도 차이가 나는 것을 확인하였습니다.

이거는 제가 체험해봐서 아는 거라 자세히 설명하기가 어렵네요..ㅜ 직접 소스를 돌려보고 차이를 느껴보셔야 합니다...!!

 

위와 같은 이슈로 요즈음의 php 개발자들은 데이터를 읽어오고 통신하는 부분에서는 curl을 더 선호한다고 합니다! 

그래도 단순 파일 읽어오기 혹은 보안 이슈가 필요없는 URL 호출을 사용한다면 file_get_contents()를 이용해서 데이터를 읽어와도 될 것 같습니다. 

 

PHP를 사용하시는 개발자라면 두 가지 방식 다 알아둔다면 적재적소에 써먹을 수 있을 것 같네요 ㅎㅎ

도움이 필요하신 분들이 이 글을 읽어서 도움이 되기를 바라며 오늘 포스팅은 여기서 마치겠습니다! 

 

긴 글 읽어주셔서 감사합니다!

 

 

 

워누입니다! 

오늘은 어제 포스팅한 파일 쓰기에 이어서 파일을 읽는 방법을 포스팅해보고자 합니다! 

파일을 작성하는 것 만큼 읽어오는 것도 중요하게 쓰입니다!

이것도 잘 익혀두면 필요할 때마다 유용하게 쓸 수 있거든요ㅎㅎ

 

txt 파일 쓰는 방법은 어제 포스팅(https://seoneu.tistory.com/20?category=395796)을 참고해주세요!

 

그럼 거두절미하고, 바로 보여드리겠습니다. 


[파일 읽기 소스코드 - filereadTest.php]

<?php 

//내용을 읽어올 파일명
$fileName = "fwriteTest.txt";


if(file_exists($fileName)){
	//파일 열기 
	$fp = fopen($fileName, 'r');
	if($fp){
		//파일 읽기 
		$fr = fread($fp, filesize($fileName));
		if($fr){
			//내용 출력
			echo $fr;
			//파일 닫기
			fclose($fp);
		} else { 
			echo "파일 읽기에 실패하였습니다.";
		} //end if_fr
	} else { 
		echo "파일 열기에 실패하였습니다."; 
	} //end if_fp
} else { 
	echo "파일이 존재하지 않습니다."; 
} //end if_fe

?>

이전 포스팅 내용을 확인한 후 위 소스를 보면 이해가 빠를 겁니다! 

fopen이 파일 열기 함수였으니 위 소스를 그대로 가져와서 예시를 들게요!

 

파일 열기 함수[fopen()] : $fp = fopen($fileName, 'r'); // r -> 읽기 권한을 말합니다.

파일 읽기 함수[fread()] : $fr = fread($fp, '불러올 파일의 용량');

파일 용량 확인[filesize()] : filesize('불러올 파일 경로와 파일명');

파일 존재 여부 확인 함수 [file_exists()] : file_exists('파일명');

 

fread() 함수를 사용하려면 파일 용량을 알아야 하는데 그 용량을 일일이 체크하지 않고 filesize() 함수로 가져올 수 있습니다. (byte 단위로 가져옵니다.) 그리고 읽으려는 파일의 존재 여부를 체크하기 위해 file_exists() 함수를 사용하였습니다. 괄호 안에 파일 명이 존재하면 true를 반환하고, 존재하지 않는다면 false를 반환합니다. 

 

그래서 위 소스를 실행하면 어제 만들어놨던 fwriteTest.txt 파일의 내용을 그대로 읽어옵니다.

.

fwriteTest.txt
filereadTest.php 실행결과

만약 없는 파일명이나 파일이 존재하지 않는다면 if문이 아닌 else문이 동작하여 다른 결과가 나오니까, 

직접 테스트해보시길 바랍니다 ㅎㅎ

.

파일을 읽어오는 함수가 fread만 있는건 아니더라구요!

찾아보니 fgets()라는 함수가 있는데, 파일 내용을 한 라인씩 읽어오는 함수라고 하더라구요.

(이런 것도 몰랐는데 그동안 개발은 어떻게 했니 나레기야..)

.

여튼, 쓰는 방법은 이렇게 쓴다고 합니다.

$fg = fgets($fp, '불러올 용량')

.

이걸 기반으로 소스코드를 아래와 같이 적어보았습니다.


[파일 한줄씩 읽기 소스코드 - fgetsTest.php]

<?php 

//내용을 읽어올 파일명
$fileName = "fgetstext.txt";


if(file_exists($fileName)){
	//파일 열기 
	$fp = fopen($fileName, 'r');
	
	//파일 용량의 크기가 얼마나 될지 몰라서 filesize() 함수 사용
	$readByte = filesize($fileName);
	if($fp){
		$fg=fgets($fp,$readByte);
		echo $fg."<br>";
	} //end if_fp 
} //end if_fe

?>

[미리 적어놓은 fgetstext.txt, 라인을 구분하기 위해 번호를 적었습니다!]

더보기

1 : fgetsTest
2 : 티스토리
3 : 만세!


fgetsTest.php를 실행해봅시다.

fgetsTest.php 실행 결과

정말 한줄만 읽어와서 가져오네요! fread()랑은 다른 용도로 잘 사용할 수 있을 것 같습니다. 

이걸 반복문을 돌리면 다 읽어올 수 있을것 같네요!

fgetsTest.php를 수정해보겠습니다. 

 


[fgetsTest.php, 반복문 추가]

<?php 

//내용을 읽어올 파일명
$fileName = "fgetstext.txt";


if(file_exists($fileName)){
	//파일 열기 
	$fp = fopen($fileName, 'r');
	
	//파일 용량의 크기가 얼마나 될지 몰라서 filesize() 함수 사용
	$readByte = filesize($fileName);
	if($fp){
    	// 수정한 부분 -> while을 이용한 반복문을 돌림.
        // fgets() 함수 사용 시, 더이상 불러올 용량이 없으면 false 반환!
		while($fg=fgets($fp,$readByte)){
			echo $fg."<br>";
		} // end while_fgets
	} //end if_fp 
} //end if_fe

?>

반복문을 추가했으니 다시 한 번 실행해보겠습니다. 

 

수정한 fgetsTest.php 결과.

오.. 예상한 그대로 나오니 짧은 코드를 쓰더라도 뭔가 뿌듯하네요ㅋㅋㅋ (이런거에 만족하는 초급개발자란..)

 

이전 포스팅이나 오늘 포스팅이나 회사에서는 주로 개발한 내용에 대해서 요청-응답 기록을 남기기 위해 로그 파일을 찍고 읽어오도록 소스 코드를 작성할 때가 많을 것입니다. 그러다보니 쉬워 보이는 내용이지만 실제로 많이 쓰이는 함수라고 보시면 될 것 같습니다!

 

오늘 포스팅은 여기서 마치도록 하겠습니다아~!!

블로거 워누입니다! 

오늘은 회사에서나 개인 프로젝트에서 요긴하게 쓰일만한 내용을 들고 왔습니다! 

늘상 회사에서 써먹겠냐 생각하셨다면 맞습니다!(오늘도 쓰고 왔습니다.)

 

txt 파일을 만들고 내용을 작성하는 것이 의외로 많이 쓰이는데요, 

프로그램을 만들고 나서 예상치 못한 오류를 추적하기 위해서 기록을 남기는 경우, 요청하거나 응답할 때 기록을 남겨놓는 경우, 중요한 값에 대한 백업이 필요하여 기록을 남기는 경우 혹은 예외처리가 필요한 구간에 기록을 남겨놓는 등 제가 본 케이스만 해도 엄청 많이 쓰이고 또 요긴하게 쓰이더라구요! 그래서 PHP로 (JSP나 다른 개발언어로도 한번 찾아뵙겠습니다!) 한번 만들어서 같이 공유해보고자 합니다! 

.

회사에서 쓰는 느낌이 들게 html로 요청 페이지를 구성해보았습니다. 


[요청페이지 소스코드 - filetest_req.html]

<html> 
 <head>   
  <title> PHP 파일쓰기 테스트 </title>
 </head>
 <body>  
  <form method="post" action="filetest_res.php">  
  파일에 작성할 Data :   
  <input type="text" name="ReqData" value="" /><br>   
  <input type="submit" value="Submit" />  
  </form>
 </body> 
</html>

 

[응답페이지 소스코드 - filetest_res.php]

<?php 

//req html 페이지로부터 전달받은 데이터 저장
$content = $_POST["ReqData"];

//내용을 저장할 파일명
$fileName = "fwriteTest.txt";

//파일 열기 
$fp = fopen($fileName, 'w');

//파일 쓰기
$fw = fwrite($fp, $content);

//파일 쓰기 성공 여부 확인
if($fw == false){
	echo '파일 쓰기에 실패하였습니다.';
}
else {
	echo '파일 쓰기 성공!!';
}

//파일 종료
fclose($fp);
?>

블로그에서 코드블럭을 지원하다니..tistory 만세!

 

생각보다 소스는 간단하죠? 하지만 파일을 여는 fopen() 함수나 파일을 작성하는 fwrite()함수,

파일을 종료하는 fclose() 함수는 되게 중요해서 쉽게쉽게 익혀놔야 나중에 어려운 코드 속에서도 헤메지 않고 잘 쓸수 있습니다! 

 

함수 사용 방법은 아래와 같습니다. 

 

파일 열기 함수 : fopen('파일 경로 및 파일명', '파일을 여는 옵션')

파일 작성 함수 : fwrite('파일 경로 및 파일명', '파일에 작성할 내용')

파일 닫기 함수 : fclose('fopen() 함수로 실행된 파일 변수')

 

대충 쉬워보이는데 파일을 열 때 여는 옵션..?

fopen()함수에 보면 입력값으로 파일을 여는 옵션이 보이죠?

fopen()함수를 쓸 때 아래 5가지 옵션이 존재합니다. 

 

r : 파일을 읽기 전용으로 열기 (해당 옵션으로 파일을 열면 쓰기 불가)

w : 파일을 쓰기 전용으로 열기 (기존 파일이 있을 경우, 내용이 삭제되고 처음부터 다시 씀)

a : 파일을 쓰기 전용으로 열기 (기존 파일이 있을 경우, 내용 뒤에 덧붙여서 씀)

w+ : 파일을 읽고 쓸 수 있도록 열기 (기존 파일이 있을 경우, 내용이 삭제되고 처음부터 다시 씀)

a+ : 파일을 읽고 쓸 수 있도록 열기 (기존 파일이 있을 경우, 내용 뒤에 덧붙여서 씀)

 

저 다섯개가 어떤용도인지는 위 소스에서 fopen 옵션을 한번씩 바꿔가면서

파일을 실행시키면 확인할 수 있을 것입니다. (이번 포스팅에서는 w와 a 옵션 보여드릴게요!)

다만, r 옵션을 적용시키면 fwrite 함수를 사용하지 못하겠죠? 이것도 같이 주의하시면 됩니다. 

 

설명이 너무 길어졌죠? 일단 실행시키면 입력화면과 결과화면이 이렇게 나옵니다. 

 

요청 페이지 : filetest_req.html
결과 페이지 : filetest_res.php
txt 파일 : fwriteTest.txt

요청한 기록에 대하여 응답 값을 txt에다 적는 형태의 소스코드입니다! 

위에 소스를 그대로 실행시키면 이렇게 진행됩니다. 

 

이번엔 다시한 번 똑같이 진행하는데 요청할 값을 "Hello World!" 가 아닌 "Test Request!"로 요청해보겠습니다.

 

요청 페이지 : filetest_req.html
결과 페이지 : filetest_res.php
txt 파일 : fwriteTest.txt

내용을 바꿨더니 w 옵션 설명에서 말했던 것처럼 기존 내용이 삭제된 것을 볼 수 있습니다. 

 

그럼 이번엔, filetest_res.php 파일 내 fopen($fileName, 'w'); 를 fopen($fileName, 'a');로 

바꿔서 다시한 번 실행해보겠습니다. 

이번엔 입력값을 "Test Response!"으로 변경해보겠습니다. 

 

요청 페이지 : filetest_req.html
결과 페이지 : filetest_res.php
txt 파일 : fwriteTest.txt

이번엔 지워지지 않고 뒤에 덧붙여서 진행되었습니다! 

 

이렇게 php를 이용하여 txt 파일을 작성하는 법을 공유해보았습니다. 

작성하면서 테스트를 해보니 쉽지만, 막상 회사가면 한번 뇌에서 필터링을 거치게 되더라구요!

너무 쉽지 않나..?라고 생각하지만 요긴하게 쓰이는 함수라서 필히 익혀두어야 할 것 같습니다ㅎㅎ 

 

오늘은 여기까지만 글을 작성하고 다음에 다른 언어로 작성하는 방법도 같이 포스팅하겠습니다! 

그럼 이만!!

블로거 워누입니다! 

오늘은 IT쪽 뉴스를 찾아보다가 조금 놀라운 소식을 접하게 되어 여러분과 같이 공유하고자 합니다! 

그것은 바로 PHP8이 출시된다는 뉴스!!

.

<관련 기사>

https://zdnet.co.kr/view/?no=20200610173614

 

웹서비스 발전 이끈 PHP, 25주년 맞아

웹프로그래밍 핵심 언어 중 하나인 PHP가 올해로 25주년을 맞았다.PHP는 그린란드 출신 프로그래머 라스무스 레도프(Rasmus Lerdorf)가 1995년 6월 8일 출...

zdnet.co.kr

.

세상에.. 제가 회사에 입사할때 쯤인 2017년 말에 PHP 7.2가 나오는 바람에 5.6버전 아래로 구성되었던 샘플의 파라미터를 PHP 규칙도, 사용 방법도 전혀 모르면서 구글신에게 의존하며 검색했던게 엊그제 같은데..  재작년에는 7.3이 나오면서 5.6을 완전히 지원 종료하고(php 5.x의 15년 역사가 막을 내리는 순간이라네요..) 작년에 7.4가 나오더니 7.x 출시한 지 5년만에....!(TMI : 7.0은 2015년 12월 3일에 정식 출시되었다고 합니다!)

.

PHP 그룹에서 올해 2020년 말, 12월 즈음에 PHP8을 출시한다고 하네요! 

벌써 베타버전이 PHP 사이트에서 제공중이기도 합니다. 

.

https://www.php.net/

.

이전에 PHP 5.6에서 7.0 버전으로 올라갔을 때는 아무래도 5.6 버전을 가장 많이 사용하다 보니, 7.0으로 업데이트 시 유지 및 보수가 용이하도록 새로운 기능을 추가하되 기존 호환성을 최대한 유지하느라 PHP 개발자들은 큰 신경을 쓸 필요가 없었다고 합니다. 이 때 추가되었던 기능을 잠깐 보자면, 

  • 성능 향상 - PHP 5.6 보다 두배 이상 빠른 속도
  • 메모리 사용률이 현저히 감소
  • 추상 구문 트리(Abstract Syntax Tree)
  • 일관된 64비트 지원(Consistent 64-bit support)
  • 향상된 예외 상속(Improved Exception hierarchy)
  • 많은 치명적 에러들이 예외로 전환 됨
  • 보안 난수 발생기(Secure random number generator)
  • 오래 됐거나 지원하지 않는 SAPI와 확장 지원 중단
  • Null 병법 연산자(The null coalescing operator (??))
  • 리턴 값, 스칼라 타입 정의
  • 익명 클래스(Anonymous Classes)
  • Zero cost asserts

출처 - 위키백과(https://ko.wikipedia.org/wiki/PHP)

.

이정도로 정리될 수 있겠네요! 위키에서 잘 정리해놓았습니다ㅎㅎ 속도가 빨짐과 동시에 메모리 사용률도 감소, 게다가 예외 상속이 향상되면서 그 전에 많았던 치명적 에러들이 예외로 전환되는 효과가 있어 개발자들이 7.0으로 업데이트함에 있어 큰 이슈가 없을만 했습니다. 

(그 외 기능은 PHP에서 "https://wiki.php.net/phpng-upgrading" 링크를 통해 잘 설명하고 있더군요!)

.

그럼 이제 얼마전에 출시된 7.4.9에서 대망의 8.0으로 넘어갈 때에는 어떤 이슈가 있는지 한번 보도록 하겠습니다. 

(대규모 변경점을 예고한 PHP 그들은 과연...?)

 

뉴스에 나온 내용 부터 정리해볼게요!

 

1. 변수 유형을 여러개 지정할 수 있는 유니온 형 지원

-> PHP는 일반적으로 언어가 변수 유형을 자동으로 결정해주는 동적 타이밍을 채용하는 언어인데, 이번 PHP8에서 변수 유형을 여러개 지정할 수 있도록 지원한다고 합니다. 유니온 형과 PHP의 궁합이 매우 좋을 것 같네요!!

 

2. JIT(Just In Time) 컴파일 지원

JIT는 just in time의 약자로 변환된 코드를 미리 저장해 비슷한 명령이 요구되면 해당 코드를 바로 사용해 속도를 높이는 기술입니다.

PHP가 인터프리터 프로그래밍 언어인지라 프로그램을 실행할 때마다 기계가 코드를 읽고 실행할 수 있는 코드로 변환하고, 실행이 완료되면 변환된 코드를 삭제하기에, C나 Java와 같은 컴파일러 형 언어와 비교하면 실행속도 면에서는 매우 불리하였습니다. 
이번 PHP8에서는 이 부분을 개선하려고 JIT 컴파일을 지원할 예정이라고 하니, 기존 인터프리터 언어의 특징을 탈피하고 컴파일러 타입처럼 비슷한 명령의 경우 해당 코드를 바로 사용하여 속도를 높인다면 속도 면에서 뒤지지 않을 것으로 예상됩니다! 

 

3. 클래스 호출 방식 추가 

->PHP 8에서 객체의 클래스 이름을 가져올 때 get_class()뿐만 아니라 ::class를 사용할 수 있게 되었다고 합니다. 

.

<예시>

$foo = new Foo();

var_dump($foo::class);

.

이렇게 보니 편리하게 쓸 수 있을 것 같습니다! 확실

 

4.  피연산자 변경 순서 변경

PHP 8에서는 피연산자를 연결하는 우선 순위가 변경되었다고 합니다. 

 

<예시>

echo "sum: " . $a   $b;

 

PHP 7 해석 : echo ("sum: " . $a)   $b;

PHP 8 해석 : echo "sum: " . ($a   $b);

 

아니 이게 무슨 개똥같은 해석이람..? 이건 좀 생각해봐야 할 것 같네요.. (가만히 있는 피연산 순서는 왜바꿔..)

 

이 외에도 많은 기능들을 제공하고 있습니다!

반환 값 형식으로 static 지정 가능, 기본 오류 레벨 변경(E_NOTICE나 E_DEPRECATED로 분류되던 오류가 E_ALL로 통합), TypeError의 일관성 보장, fdiv 함수 추가 등 대규모 변경점이라고 예고한 PHP의 말마따나 진짜 많고 다양한 기능을 제공하려고 하는 것 같습니다. 

 

이번 업데이트 내용은 "https://stitcher.io/blog/new-in-php-8" 페이지에서 제공해주는 내용을 기반으로 작성해 보았는데요, 알파버전 이후 베타버전이 지속적으로 나오면서 조금씩 수정되거나 삭제, 추가되고 있다고도 합니다. 올해 말까지 계속해서 나올 베타버전에 대하여 계속 주목해볼 필요가 있겠네요! 

 

기존에 개인적으로 작업하고 있던 Mantis나 wordpress가 PHP8버전을 만나면 어떻게 변경될지도 기대가 되는 부분입니다! 만약 PHP 개발자라면 베타버전을 다운로드해보고 체험해보시길 권장해봅니다! 저도 조만간 다운로드받고 후기를 여기에 올려볼게요 ㅎㅎ

 

오늘 글은 여기까지입니다! 그럼 이만!!

안녕하세요 워누입니다!

.

직장에 다닌다는 핑계로, tistory를 방치하고 있었네요..ㅜ 

그래도 나름 자료가 유용했는지 방문자님들이 계셔서 감사한 마음입니다ㅎㅎ 

저는 직장에서 주로 PHP를 쓰기 때문에 이제 PHP언어에 대하여 집중적으로 포스팅하려고 합니다.

(SDN을 제외한 다른 분야도 조금씩 포스팅해보겠습니다.) 

PHP로 코딩하려면 Apache 서버 설치하고 conf 세팅하고, PHP 버전에 맞게 설치하고 세팅하고 그랬었는데,

지금은 bitnami에서 한번에 해주고, 필요한 기능은 php.ini에서 조금씩 세팅해주고 있네요..ㅎㅎ

.

https://bitnami.com/

 

Bitnami

With over 1 million apps deployed per month, Bitnami makes it incredibly easy to deploy apps with native installers, as virtual machines, docker containers or in the cloud.

bitnami.com

.

궁금하신 분들은 구글이나 네이버에 bitnami만 쳐도 설치방법이 자세히 나오니 참고하시면 좋을것 같아요!

세팅이 완료되면 자신의 PHP 버전이 몇이고 어떤 세팅이 되어있는지 점검해야 해요. 

php에서는 세팅정보를 확연하게 볼 수 있도록 phpinfo()라는 함수를 제공합니다. 

어떻게 쓰냐면 아래처럼 씁니다. 

.

phpinfo() 함수

.

....?

3줄이 다냐구요? 네. 다입니다.

이걸 phpinfo.php라는 파일명으로 저장해주시고 위에서 설치한 Bitnami 폴더에서 apache2>htdocs 경로에 올려주세요!

그리고 인터넷 브라우저를 실행해준 뒤 로컬호스트 웹사이트에서 실행하면 아래와 같이 나와요! 

.

php 서버에 업로드한 phpinfo.php

.

요렇게 나옵니다. 

이런 면에서는 php가 많이 편한것 같습니다! 

필요한 기능은 php.ini 파일에서 아래와 같이 편집해주세요! 

.

1) php 경로 설정

extension_dir에서 dll 경로 설정.

2) dll 활성화

사용하려는 dll 기능 체크하여 주석 풀어주기.

php.ini 파일에서는 세미콜론( ; )이 주석 역할을 해주기 때문에 세미콜론을 지워주면

기능이 활성화된다고 보시면 됩니다. 

php.ini에서 설정한 extension_dir 실제 경로

이렇게 하고 다시 phpinfo.php를 웹브라우저에서 실행하면 기능이 활성화된 것을 볼 수 있습니다.

php 기본 세팅은 이렇게 마무리하고 다음 포스팅부터는 제가 했었던 프로젝트를 위주로 포스팅해보겠습니다. 

 

오늘 포스팅은 여기서 마무리하도록 할게요! 

 

+ Recent posts