이 주제와 관련된 많은 게시물을 찾았습니다. 그러나 내가 찾은 해결책은 나에게 그다지 부적합하지 않습니다. 일부 전문가는 코드 구조를 변경하라고 조언했지만 어떻게해야할지 모르겠습니다.
내가 원하는 것 :
1) SQL 데이터베이스에서 영화 목록
가져 오기 2) 각 영화에 대한 웹 사이트에서 정보 가져 오기
내가 직면 한 문제 : PHP MAX_TIMEOUT이 발생합니다.
내가 생각한 해결책 : 각 영화에 대해 비동기 요청을 개별적으로 호출하십시오 .
병목 현상 : 너무 많은 비동기 요청
구현 방법에 대해 조언 해 주시겠습니까 (가능한 경우 jquery가 아닌 JS 만 해당)?
웹의 일부 솔루션 :
1) ASYNC = FALSE를 사용하십시오 .... SYNC req를 사용하고 싶지 않습니다. Ajax를 사용하는 것이 무의미합니다.
2) 모든 데이터를 수집 한 다음 Ajax 호출을 한 번만합니다. 긴 스크립트 (웹에서 영화 정보 가져 오기), 궁극적으로 PHP MAX_TIMEOUT
3) PHP MAX_TIMEOUT 증가 ... 가능하지 않음, 얼마나 늘릴 지 모르겠습니다.
JS
function loadData(mArray){
mArray = [{"movieid":"1","title":"10 Things I Hate About You"},{"movieid":"2","title":"100 Girls"}]; // TO SIMLYFY, I PUT THIS CODE HERE .. NORMALLY I GET THIS ARRAY USING ANOTHER AJAX CALL
for (var i = 0; i < mArray.length; i++) {
var obj = mArray[i];
webAjaxcall(obj["mid"],obj["title"]); // DEFINITELY NOT A GOOD IDEA
}
return true;
}
function webAjaxcall(mid,title){
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
//DO SOMETHING
}
}
xmlhttp.open("POST","file2.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
params = "title="+title+"&mid="+mid;
xmlhttp.send(params);
}
누군가 내가 JS 배열을 채우는 방법을 알고 싶어하는 경우를 대비하여 :
파일 1
$sql = "SELECT `movieid`,`title` FROM movielist";
$result = mysql_query($sql) or die(mysql_error());
while($row=mysql_fetch_assoc($result)){
$output[] = $row;
}
exit(json_encode($output));
파일 2
$json=file_get_contents("http://www.website.com/?t=".rawurlencode($moviename));
$info=json_decode($json);
DO SOMETHING
AJAX를 통해 영화 감상
var xmlhttp=new XMLHttpRequest();
var myarr;
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
myarr = xmlhttp.responseText;
loadData(JSON.parse(myarr));
}
}
xmlhttp.open("POST","file1.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
params = "fname=<?php echo $ses_id;?>";
xmlhttp.send(params);
참고 : 동기식을ASYNC = FALSE
의미 합니다 . 즉 , 모든 것이 순서대로 발생하고 한 번의 호출이 이전 호출을 기다리고 궁극적으로 코드를 차단합니다.
솔루션 / 의견 : 데이터 를 가져 오는 사이트 (또는 API)가 단일 요청으로 여러 결과를 처리 할 수 없다고 가정하면이 반복되는 ajax 요청을 처리 할 수있는 유일한 방법은 ajax를 캐시하는 것입니다. SQL db에서 직접 결과 :
::pseudo-architecture::
다음 PHP 파일을 가정 해 보겠습니다.
index.php
$(document).ready()
모든 "캐시되지 않은"영화를 반복 하는 함수를 작성하고 아직 캐시되지 않은 각 항목에 대해 적절한 매개 변수를 사용 하여 get.php 를 비동기 적으로 호출합니다 GET
. 이렇게하면 페이지가 이미로드 된 후에 발생하므로 페이지로드 시간에 영향을주지 않습니다.::pseudocode::
for movie in movies
if object has cached data and date retrieved is less than [some time ago]
return data from SQL db
else
display a "caching in progress" notification for that title
send GET request to get.php
참고 : 서버가 얼마나 강력한 지에 따라 get.php에 대한 요청을 큐 / 지연해야 할 수 있습니다. 한 번에 1000 개의 개별 스레드가 실행되지 않도록합니다.
get.php
$_GET
index.php의 ajax 루프에서 전송 된 매개 변수를 검색 하고 요청을 타사 API / 웹 사이트로 전달합니다.::pseudocode::
send 200 ok status code and connection-close header
get $_GET parameters
retrieve API data for your movie by sending $_GET parameters
cache to your SQL db once data is returned
궁극적으로 페이지는 실시간으로로드되고 새 데이터를 보려면 페이지를 새로 고쳐야합니다 (또는 정말 멋지게 하려면 클라이언트에 알리는 WebSockets로 작업을 수행 ).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다