비동기로 함수를 처리하거나 php 서버에서 비동기로 돌아가게 하고 싶어요. async

비동기로 함수를 처리하거나 php 서버에서 비동기로 돌아가게 하고 싶어요. async

QA

비동기로 함수를 처리하거나 php 서버에서 비동기로 돌아가게 하고 싶어요. async

본문

기존에 PUSH알람을 보내고 있던 함수가 전체회원에게 push를 보낼때면 10분 이상 걸리거나 뻗는 현상이 나타나서 비동기로 함수를 돌린 뒤 테스트 해볼려 했습니다.

우선은 php가 아닌 ajax로 async 하도록 구현하였습니다.



$.ajax({
  url: '../admin/async/send_push.php', 
  type: "POST",
  dataType: 'json',
  data: {
    arr_mb_hp,
    wr_id
  },
  success: (data) => {
    console.log(data);
    console.timeEnd("sendPush");
    if (data.msg) {
      alert(data.msg);
    }
  }
});

alert("발송요청을 보냈습니다.");

 

send_push.php 여기엔 우선 비동기 테스트라 sleep(7) 7초 대기만 걸어주었습니다. 

아래 '발송요청을 보냈습니다.' 얼럿이 바로 나오지만, 서버는 7초동안 멈춰지는 현상이 발생합니다.

그렇다고 서버가 완전 멈춘건 아닙니다. 

문제점? 

1. 제가 크롬에서 비동기 테스트를 하여 7초동안 사이트 접속이 안되지만 

2. 웨일브라우져로 7초안에 로그인, 리스트조회 등등 사이트 접속 및 정상작동하는걸 확인했습니다.

 

php 로 비동기를 구현하면 될까 싶어서



$.ajax({
  url: '../admin/proc_new.php', 
  type: "POST",
  dataType: 'json',
  data: {
    proc_mode: 'send_push',
    arr_mb_hp,
    wr_id
  },
  success: (data) => {
    console.log(data);
    console.timeEnd("sendPush");
    if (data.msg) {
      alert(data.msg);
    }
  }
});

alert("발송요청을 보냈습니다.");

 

proc_new.php 여기에서 다시 async/send_push.php를 호출하여 하는방식



passthru("php ./async/send_push.php /dev/null 2>&1");

방식으로도 구현해봤습니다. 

하지만 위에 문제점들의 현상이 동일했습니다. 아래 복사해 왔습니다.

문제점? 

1. 제가 크롬에서 비동기 테스트를 하여 7초동안 사이트 접속이 안되지만 

2. 웨일브라우져로 7초안에 로그인, 리스트조회 등등 사이트 접속 및 정상작동하는걸 확인했습니다.

 

제가 원한 비동기는 요청을 보내고 저는 다른 작업을 하면서 나중에 결과만 확인하고싶었습니다만... 

 

어떻게 해야 비동기 처리를 구현할수있을까요?

 

아 그리고 가장 처음 push 함수 자체를 비동기로 요청 할수있다면 가장 베스트이긴 합니다. 

php function 을 비동기 할수있다면 그런 방법 알려주셔도 감사합니다.

이 질문에 댓글 쓰기 :

답변 3

가장 좋은 방법은,

전체회원을 대상으로 회원 한명씩 푸시를 보내는 것이 아닌..

전체회원을 대상으로 전체회원에게 1번의 푸시를 보내는 것입니다.

 

1) send_push_all.php 생성 (전체회원에게 푸시 발송 파일)

※ 참고 : https://stackoverflow.com/questions/58993124

(토큰을 array 에 저장하여, registration_ids 값으로 보내면 됩니다.)

 

2) 전체회원에게 보내는 경우 send_push_all.php 호출

 

---------------

 

참고로 비동기 처리는.. 아마도 가능하지 않고..

가능하다고 하더라도.. 백그라운드에서 실행되더라도..

해당 작업이 진행되는 동안 DB 리소스를 잡고 있기 때문에.. 뻗는 현상은 동일할 것으로 생각됩니다.

아마 한번에 보낼수 있는 Max  가 1000 일 겁니다.

회원숫자가 그렇게 많은지 미처 예상 못했습니다.

비동기 처리 방법중의 하나는..

처리를 popup 으로 하면 되지 않을까 합니다. 물론, popup 창을 닫으면 안되고요..

잠깐 찾아본 다른 방법으로는..

shell_exec() 를 이용하는 방법이 있는 것 같습니다.

https://stackoverflow.com/questions/16060578/php-run-script-in-background

기록은 DB 에 남기고..

해당 DB 의 내용을 특정페이지에서 열릴때마다 확인해주는 방식으로 체크해서 있으면 보여주는 식으로 하면 될 것 같습니다.

대략 16000번 push를 보내야 합니다.

자주 사용할만한 api에 push를 확인하고 보내는 부분을 삽입 해서 한다 이 뜻이죠?

흠 좀더 좋은 방법이 있으면 좋겠습니다 ㅋㅋㅋ 우선 서버가 뻗는 현상을 없애야 하는 상황이니 적용해야죠 ㅎㅎ
감사합니다.

그 뜻 은 아닌 듯 합니다. ("자주 사용할만한 api에 push를 확인하고 보내는 부분을 삽입 해서 한다 이 뜻이죠?")

 

1) send_push.php 를 팝업창으로 띄우는 방법입니다.

window.open('send_push.php', '', ''); // 파라미터 받는 방식, 처리방식은 조금 수정해야 될 수 있습니다.

본 창에서 다른 작업은 할 수 있지만.. 팝업창에서 작업이 완료되기 까지 팝업창을 닫으면 안되는 단점이 있습니다.

 

2) proc_new.php

passthru() 대신 shell_exec() 를 사용해주면 됩니다. shell_exec() 를 사용하면.. 아마 원하는대로 작동될 듯 합니다.

다만 결과의 확인이 쉽지 않은데.. 해당 처리 파일에서.. 마지막에 작업 결과 내용을 DB 어딘가에 기록한 후,

sir 의 답변 알림처럼.. 관리자의 어떤 특정페이지에서 로딩될 때 마다 마지막 작업 결과 내용을 DB 에서 가져와서 보여주는 방법을 사용해 볼 수 있습니다.

 

3) 스케쥴링 DB 테이블을 별도로 만들고, 웹에서는 스케쥴링 등록 작업만 하고.. 실제 메시지 보내고 결과를 DB 에 기록하는 작업은 크론으로 하기

스케쥴링 DB 에 등록시각 | 보냄여부 등의 칼럼을 만들고, 웹에서 발송 버튼 클릭시 스케쥴링 등록 처리를 합니다.

스케쥴링 DB 를 읽어서(send 여부가 N 인 건만 읽기) 모두 보내면 DB 의 보냄여부 칼럼에 Y 표시로 기록 처리하는 파일을 만듭니다. ex. send_push_job.php

크론에.. 10분 주기로 실행되도록 등록합니다. https://m.blog.naver.com/PostView.nhn?blogId=crazytta&logNo=221244907179

단점은, 작업량이 많고/번거로운 편일 수 있습니다. 기타.. 크론 서비스 필요/서버 환경 체크/크론 서비스 안정 등등 체크 필요

 

답변을 작성하시기 전에 로그인 해주세요.
전체 11
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT