epg2xml 자체에, 요청에 대한 타임아웃 처리가 덜 된 부분이 있어서 특정 Source에서 응답이 없으면 전체적으로 멈추는 문제가 있었네요.
커넥션 타임아웃 처리만 되어 있고, 요청 타임 아웃에 대한 처리가 안되어 있었어요.
일단, 아래와 같이 수정하면 멈추지 않고 못받아온 채널의 EPG 정보는 그냥 넘어가게 되면서 끝까지 가게 됩니다.
지금처럼 SK 소스인 채널이 응답이 불규칙적인 경우는 여러 채널의 정보를 못받게 되긴 하네요.
응답을 못 받을 경우 일정 시간 후 재시도 등 하는 로직을 넣어서 해결해야 할 것 같은데..
php에 대한 지식이 미천하여 이 이상은 구현을 고치진 못하겠네요.
--- epg2xml-web.php.org 2018-03-30 15:14:50.000000000 +0900
+++ epg2xml-web.php 2018-09-07 15:31:33.092010182 +0900
@@ -7,6 +7,7 @@ define("VERSION", "1.2.6");
$debug = False;
$ua = "'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116'";
$timeout = 5;
+$req_timeout = 10;
define("CHANNEL_ERROR", " 존재하지 않는 채널입니다.");
define("CONTENT_ERROR ", " EPG 정보가 없습니다.");
define("HTTP_ERROR", " EPG 정보를 가져오는데 문제가 있습니다.");
@@ -913,6 +914,7 @@ function getWeb($url, $params, $method)
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, True);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $GLOBALS['timeout']);
+ curl_setopt($ch, CURLOPT_TIMEOUT, $GLOBALS['req_timeout']);
curl_setopt($ch, CURLOPT_HEADER, False);
curl_setopt($ch, CURLOPT_FAILONERROR, True);
curl_setopt($ch, CURLOPT_USERAGENT, $GLOBALS['ua']);
epg2xml에 대해 wonipapa 님께서 유지보수를 중단하신 상황이라, github에 반영되진 못할듯 하네요.
전 제 로컬에 있는 파일만 고치고, 최신 버전을 더이상 안 받아오게 해 두었습니다.
혹시, 이치로 님의 docker-tvheadend에서는 https://github.com/wiserain/epg2xml 여기서
epg2xml 최신 버전을 가져오시나요? 만약 그렇다면, 이치로님 repository에라도 위 패치를 적용해
두면 좀 나을것 같긴 한데요.
의견 부탁드립니다.
그런데 왜 컨테이너 재시작하면 그때는 잘 불러올까요?
그리고 tvheadend에서는 스케줄 된 시간에 이전 작업이 아직 안 끝나 있으면 새 작업을 시작하지 않습니다.
그래서 중간에 문제가 생겼을 때 더이상 새로운 작업도 제대로 수행이 안되었던 것이고요, 위의 타임아웃 설정을 추가하니 응답을 무한히 기다리느라 작업이 안 끝나는 경우는 없는 것 같습니다.
merge 된후 말씀해 주시면 감사하겠습니다.
docker-tvheadend에서 최신 버전은 어디에서 받아오게 되어 있나요?
EPG2XML_VER=.으로 바꿨던거 다시 latest로 바꾸고 재시작 해보니 이전 버전으로 다시 받아오네요.
https://www.clien.net/service/board/cm_nas/12566572CLIEN 나미다용님의 댓글 부분도 반영되어 졌으면 좋겠습니다.
sk소스 자체를 못불라오는지라....
기본적으로 등록된 서비스 아이디와 채널명을 기준으로 사이트 페이지 소스를 찾다보면 나와요.
일단 sk경우는 뭔가를 막아버린 느낌입니다. epg를 긁어오던 회선으로 사이트 접속 자체가 안되는중.
lte로 하면 접속 되는거 보니 뭔가 조치를 취한듯하네요
그렇다면 내부 코드를 고쳐서.. 천천히~ 받아오게 하는게 답이 될수도 있겠네요..
슬립1초 걸었더니 벤 안당하고 안정적으로 받아오는듯 하네요.
저같은 경우는 파이썬으로 돌리는지라 php에선 슬립을 어찌 줘야하는지 모르겠네요 ㅠㅠ
sk나 skb 소스를 위한 슬립인데 거기 걸 경우 나머지 소스에 까지 1초씩 슬립이 걸리게됩니다.
불러올게 전체 100채널이면 전보다 100초정도 느리게 돈다 치고 그냥 적용했습니다.
일단 끝까지 다 돌고 정상 종료되는걸 확인 했습니다.
정말 감사드립니다.
$req_timeout = 10;
curl_setopt($ch, CURLOPT_TIMEOUT, $GLOBALS['req_timeout']);
위 두줄만 epg2xml-web.php 안에 추가해주면 되는거죠?
일단 이건 무한히 대기하지만 않게 고쳐둔 버전인데, 어제부터 SK 소스에서 너무 심하게 땡겨 가면 응답을 막아버리는거 같습니다.
그래서 무한대기는 안하지만 중간 이후에 데이터를 온전히 못받아오는 문제가 있습니다.
SK 소스에 대해 쉬엄쉬엄 해서 밴 당하지 않도록 수정이 필요할 것 같네요.
397라인인 $ChannelServiceId = $ChannelInfo[3]; 이거 다음줄에
sleep(초);
를 삽입하면 저 위에 파이썬 적용할때 썼던거랑 똑같은 효과 주는게 가능하네요.
1초 줬을땐 왠지 벤당해서 2초주고 돌리는중인데 이상하게 전 작업스케쥴러로 php는 돌아가는 속도가 너무 느려서
끝까지 테스트 하기가 힘드네요... 일단은 잘 돌아가고는 있는데 끝나려면 엄청 걸릴듯하네요.
도커 tvh쓰시는분들이 한번 테스트 해주심이 좋을듯...
1초가 안되는경우 모든 소스 2초면 너무 느리니 각각 적용한다 할떄
397라인 다음에 써놨던 슬립 지우고
SK는 403라인인 elseif($ChannelSource == 'SK') : 다음줄에
SKB는 405라인인 elseif($ChannelSource == 'SKB') : 다음줄에
sleep(2);
를 한번씩 넣어주면 될듯 하네요.
해당 sk, skb 다음줄에 sleep(2); 넣으니 잘 작동되네요.
고맙습니다.
저도 문제가 해결 되었습니다!!
블럭 되는 조건을 정확히 모르니 어느 정도 값을 넣는게 최적인지는 모르겠는데..
일단 아예 좀더 시간을 써서 5초 sleep으로 바꾸곤 현재까지 별 문제 없습니다.
현재 Channel.json에 있는 모든 채널을 다 받아오도록 설정해 두었는데 약 9분 정도 걸립니다.
어짜피 제가 모르는 시간에 백그라운드로 받아오는 작업이라 시간이 좀 걸리더라도 별 상관 없다고 생각해서
전 5초로 설정해서 써 보려 합니다.
백그라운드로 그날 안에만 받아진다면 사용에 큰 지장도 없을태구요.
좀 다른 방법? 은 SK와 SKB의 서비스 아이디는 같은데 사이트는 다릅니다.
(두 사이트의 서버가 같은지는 모르겠습니다.)
채널.json에 SK는 110개 SKB는 31개인데 SK몇개를 SKB로 수정해
두곳으로 좀 분산을 두는것도 하나의 방법일듯 합니다.
모든 채널을 불러올경우 연속된 SK사이사이에 SKB를 두던가 하는식으로.
근데 좀 귀찮은 작업이니 결국은 sleep좀 넉넉하게 두고 알아서 돌도록 냅두는게 낫겠네요 ㅎㅎㅎ
터미널 명령어로 실행시키시는 거라면 -e 옵션으로 환경 변수 지정할 수 있고요 -e "EPG2XML_VER=." 이런 식으로요, Web UI 사용하시는 거면 설정 화면에 환경 변수 설정하는 메뉴가 있을 겁니다.
환경변수 EPG2XML_VER
값 latest
이렇게 되어있는데 환경변수에 EPG2XML_VER=. 이렇게만 하고 값은 그대로 latest 로 나두면되는 건가요?
php파일을 노트패드++로 열어서 제일 마지막에 붙여 넣기 하면 될까요? 코딩문외한이라 감이 전혀 안잡히네요.ㅜㅜ
이 이슈로 인한 변경 사항을 두 분의 저장소에 PR 보내서 모두 적용이 완료되었습니다.