리눅스 질문 입니다~
본문
안녕하세요. 늘 sir에서 힌트를 얻어서 열심히 코딩하고 있는 사람입니다.
다름이 아니옵고..
라즈베리파이(리눅스) 기반의 IOT 설계 중인데요..
rs232 통신을 이용해서 txt 문서를 라즈베리파이(리눅스)에 받아서 파싱 후 ftp 전송 후에 db 입력 하는 과정중에서..
만약 인터넷 연결이 안되어 있다면? 최악의 상황이라면? 으로 시작하여 현재 코딩 중입니다.
어쨌든.. 해결이 안되는 부분은요..
인터넷 연결이 안되어있을 때 txt 문서를 보관 하고 있다가 클론 서비스로 일괄적으로 ftp를 쏴주는 것 까지는 해결을 하였는데..
ftp로 전송받은 수천개의 txt 문서가 db 입력이 동시에 이뤄지면서 데이터 무결성이 깨지고 있습니다..
/var/www/html/upload IN_CLOSE_WRITE,IN_MOVED_TO php /var/www/html/dbsetting.php $@/$#
위에 코드는 upload 폴더에 txt 문서가 접근 하였을 때 dbsetting.php를 실행 시키라는 것이구요..
실제로 수천개의 txt 문서가 mysql db에 입력이 되는데..
예를 들어 1.txt 문서가 수백개씩 등록이 되더라구요ㅠㅠ
그래서 dbsetting.php 코드는..
$dir = "/var/www/html/upload/";
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle)))
if ($file != "." && $file != "..") {
$parsing=explode( "." ,$file);
$definition_name=$parsing[0];
$definition = fopen($dir.$definition_name.".txt", "r");
} closedir($handle);
}
if ($definition) {
$main_seq = 0;
$project_seq = 0;
$product_sql = "insert into product set ";
while (($buffer = fgets($definition, 4096)) !== false) {
$tmp_array=explode( "_" ,$buffer);
for($i=0;$i <= sizeof($tmp_array)-1;$i++) {
$item_array[$i] = explode( ":" ,$tmp_array[$i]);
}
if(strpos($item_array[0][0],$searchName01) !== false) {
if(strpos($item_array[1][0],$searchName02) !== false) {
$product_project=$item_array[1][0];
$$product_project=$product_project;
$product_project_value=$item_array[1][1];
$product_project_value=$ymd."".$product_project_value;
}
이런식으로 시작을 하여서 sleep(1); 을 아무리 줘봐도 동일한 증상이 생기고 있습니다.
클론탭에서 1개씩 처리 하는게 아니라 아마 수백개 수천개의 파일을 동시에 dbsetting.php를 호출하여 실행 하는 것 같은데..;;;;; 아마 하나의 파일을 수백번 수천번 실행 하는 듯 합니다..
어떻게 해야지 중복으로 파일을 실행 안시키고.. 하나씩 입력 할 수 있을까요?
클론탭에 옵션이 있는건지.. 아니면 dbsetting.php에 어디를 수정 해야 하는지..
능력자분들의 답변 부탁 간곡히 드리는바 입니다ㅠㅠ
!-->답변 2
하나의 파일을 수백번 수천번 실행한다면 단순히 반복문을 잘못 설정하신듯 싶구요.
"rs232 통신을 이용해서 txt 문서를 라즈베리파이(리눅스)에 받아서 파싱 후 ftp 전송 후에 db 입력 하는 과정중에서.." 라고 하셨는데 굳이 돌아서 가는 이유가 따로 있나요?
라즈베리파이의 DB에 곧바로 넣으신건 어떤지.
만약 DB서버가 따로 있고 인터넷이 문제라면 라즈베리파이에 넣고 mysql 리플리케이션으로 해도 될듯 싶습니다. 근데 그전에 인터넷이 끊어진다라면 IOT자체에 이슈가 생기므로 인터넷이 연결되는 시점에 다시 try하는것도 방법이 될 수 있습니다.
전 예전에 학생들과 같이 라즈베리파이로 IOT 구현할때는 센서에서 값 받아서 바로 라즈베리파이 내부SQL에 바로 집어넣게 했습니다만..
rs232로 txt 문서를 받는 라즈베리파이가 10대가 있구요. 메인 서버가 있는데... 인터넷이 연결이 안되어 있는 경우도 늘 생각하고 있거든요~