우리가 상속 한 CRM을 개발 중입니다. 간단히 말해서-백그라운드에서 실행되어야하는 PHP 스크립트를 호출하는 버튼이 있으며 응답을 기다릴 필요가 없습니다.
request(idata+'transferInTimeExec.php',{
sync: false,
preventCache:true,
method:'GET'
});
이제
transferInTimeExec.php
실행하는 데 1 시간이 걸리며, 채용 회사의 주간 작업 표를 처리하고 처리하며 많은 DB 작업을 수행하는 매우 복잡한 스크립트입니다.
Chrome 사용. 버튼을 눌러 실행할 때마다 모든 xhr 호출이 끝날 때까지 차단합니다. CRM은 "ajax heavy"이며 스크립트가 실행되는 동안 사용자가 아무것도 수행 할 수 없습니다. 다른 서브 페이지로 이동하면 시작된 프로세스가 완료 될 때까지 xhr 요청이 해결되지 않습니다. 새 브라우저 탭을 열어서 무언가를 시도하더라도 그렇게하지 않습니다. 스크립트가 실행되는 동안 다른 브라우저 (Firefox)에서 CRM을 열면 CRM을 사용할 수 있습니다.
네트워크 탭에서-첫 번째 통화는 보류 중이며 다른 Ajax 통화 대기에 대한 모든 후속 통화 대기 (모두 sync : false 있음)를 볼 수 있음
전체 로직을 PHP 함수
sleep(30)
로 교체했습니다.
같은 문제를 반환하기 전에 30 초 동안 아무 작업도 수행하지 않습니다.
onClick
내부에서 일반 자바 스크립트로 XHR을 사용해 보았습니다.
Dojo 메소드가 아닌 버튼 HTML 마크 업에 동일한 문제가 있습니다.
sync:true
를 대신하여 전체 프로젝트에서 잔인한 검색/바꾸기를 수행했습니다.
sync:false
로
-아무것도 바뀌지 않았습니다.
아이디어가 부족합니다. 어쩌면 여기있는 사람이 이것을 알아낼 수 있습니까? 동기화/비동기 용 글로벌 스위치가 있습니까? 아약스 문제가 아닌 경우 다른 무엇을 할 수 있습니까?
- 답변 # 1
관련 자료
- apache - 내 도메인이 아닌 다른 도메인의 요청을 차단하는 방법은 무엇입니까?
- javascript - 함수 호출이 서로 영향을 미치고 있습니다
- angular - RxJS에서 서로 데이터를 전달하는 하위 순차 URL 호출을 어떻게 처리합니까?
- linux - 귀하를 가리키는 다른 도메인 차단
- geoserver - wms-in-wms 기능 찾기 - 규모에 따라 다른 wms를 호출하는 wms
- web - API 호출 또는 소켓 이외의 서버에서 실시간 데이터를 얻는 다른 옵션이 있습니까?
- css - 다른 콘텐츠를 차단하지 않도록 고정 위치 요소 가져 오기
- python - 꽉 찬 루프가 다른 파일을 호출해도 괜찮습니까?
- Combine에서 비동기식 호출의 동기 시퀀스를 예약하는 방법은 무엇입니까?
- javascript : 확인란이 토글될 때 데이터베이스 업데이트
- javascript : ajax 요청의 게시물 데이터가 작동하지만 PHP는 여전히 정의되지 않은 인덱스를 표시합니다.
- javascript : PHP 변수를 DataLayer로 푸시
- javascript : json_encode를 사용하여 PHP에서와 같이 Java에서 동적 차트를 생성하는 방법
- php : XML 데이터는 로컬 시스템에서 잘 작동하지만 온라인에서는 작동하지 않습니다.
- onclick= copyToClipboard: JavaScript를 사용하는 PHP 변수용
- javascript : 양식 제출 시 애니메이션 로더 화면은 JS를 사용하는 iphone이 아닌 랩톱에서 작동합니다.
- javascript : django에서 ajax 호출로 쿼리 및 폐기된 데이터의 속성 값을 표시하는 방법
- javascript : PHP base_url 함수에 대한 변수 값
- Laravel 8 -JavaScript onclick 이벤트에서 PHP 변수를 값으로 사용할 수 있습니까? [복제하다]
스크립트
이 스크립트를 실행하는 데 1 시간이 걸리면 UI에서 AJAX로 호출하는 것은 좋지 않습니다. 매시간 또는 매일 Cron을 설정하고 백엔드에서 모든 작업을 수행해야합니다. 물론 세션을 사용하는 경우 스크립트를 약간 조정해야합니다.transferInTimeExec.php
아마도 세션을 사용하고 있습니다. 이 경우 다른 AJAX 호출이 시작되지 않고 세션 데이터를 덮어 쓰지 않도록이 AJAX 호출이 완료 될 때까지 기다리십시오. AJAX 호출을 비동기로 설정해도 동작이 변경되지 않습니다.수정
session_write_close();
를 사용할 수 있습니다 스크립트 상단에 이렇게하면 PHP에이 스크립트가 세션에 아무것도 쓰지 않으므로 다른 AJAX 호출은 세션을 자유롭게 사용할 수 있습니다. 그러나이 후에 세션에 아무 것도 쓰지 않도록주의하십시오. 오류가 발생할 수 있습니다.