비동기로 함수를 처리하거나 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 리소스를 잡고 있기 때문에.. 뻗는 현상은 동일할 것으로 생각됩니다.
그 뜻 은 아닌 듯 합니다. ("자주 사용할만한 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
단점은, 작업량이 많고/번거로운 편일 수 있습니다. 기타.. 크론 서비스 필요/서버 환경 체크/크론 서비스 안정 등등 체크 필요
send_push.php 내용이 궁금하군요.
만 번 호출에 10분이면 뭔가 이상한 점이 있네요.