logo

파일 열고 처음부터 다시 쓰기

Server Side March 21, 2019

PHP 환경에서 사이트맵을 자동적으로 제작해주는 코드를 만들고 있었습니다.

자연스레 파일 입출력 관련 코드를 쓰게됬는데 우분투(리눅스) 환경에서는 폴더에 새로운 파일을 쓸때 권한설정이 엄격하죠.

 

대부분 파일업로드처럼 파일을 서버에 새로 '쓰는' 행위를 할 때는 해당 디렉토리의 권한을 777로 많이 둡니다. 근데 이게 한 폴더면 상관없지만 사이트맵처럼 루트에 놓으면 좋은 파일을 주기적으로 새로 작성한다고 했을때 루트 디렉토리에 쓰기권한을 주는건 좀 아니죠.

 

사이트맵의 경우에는 특히 포스팅이 있는 홈페이지에선 그 포스팅 페이지 링크를 사이트맵에 등록시켜놔야 해서 주기적으로 사이트맵을 제작해주어야합니다. 이를 프로그램으로 제작하고 파일 내용을 다시 쓰는 과정에서 파일 내용을 비우고 다시 써야합니다.

 

일반적으로 검색해보면 그냥 파일을 w+권한으로 열거나 해당 파일을 삭제하고 다시 파일을 만든 후 작성하라고 합니다...만! 문제는 위에처럼 해당 디렉토리에 쓰기권한을 안주는 경우는 이런방식으로 해결할 수 없다는거죠.

 

각설하고 결국 여기서 하고싶은것은 파일내용을 삭제할때 파일은 그대로 놔두고 내용만 삭제하는 방법입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
 
// 파일 작성 시작
$sitemap = fopen($path.'/sitemap.xml''r+') or die('file not found'); 
ftruncate($sitemap0);
fwrite($sitemap'');
fwrite($sitemap'');
 
// 대표 링크 기록
$lastmod = date('Y-m-d\TH:i:s') . "+00:00";
$link = "$domain$lastmoddaily1.00";
fwrite($sitemap$link);
 
// 파일 작성 종료
fwrite($sitemap'');
fclose($sitemap);
 
cs

 

내용만 삭제해주는 메소드는 ftruncate 입니다. 이 메소드의 원래 목적은 파일 스트림의 크기를 지정된 크기만큼 줄이는 것입니다. 이걸 응용해서 크기를 0으로 지정해주고 메소드를 실행시키면 쉽게말해 파일 내용의 크기가 0이 되어버리는거죠. 파일 권한이나 이름, 속성값은 그대로 놔두고 내용물만 지워버리는 행위를 하게 되는겁니다.

 

그리고 필요한 내용을 처음부터 적어주면 파일을 별도로 지우지 않고도 새로운 내용을 적을 수 있죠.

 

모든 접근에 대해서 권한이 오픈되어있는 디렉토리 환경에선 그냥 파일을 "w"권한으로 열면 기존파일이 알아서 삭제되고 새파일이 생성되지만 위의 방법은 그러지 못할 경우에 쓰면 될 것 같네요.