Как выполнить асинхронное эхо PHP (код JavaScript) по мере их возникновения? - PullRequest
1 голос
/ 22 апреля 2011

У меня есть страница с пользовательской картой Google, которая имеет около 100-150 маркеров.Данные маркера получаются путем анализа через внешний PHP XML-файла, представляющего собой список событий / проектов, но внутри каждого события есть соответствующие данные для создания маркера.

В настоящее время все работает, но этозагрузка карты занимает некоторое время, потому что анализ XML-файла занимает некоторое время.Чтобы ускорить процесс, я, по сути, хочу динамически загружать страницу, рисуя пустую карту при загрузке страницы, а затем запускать внешний PHP-файл для асинхронного анализа XML с помощью AJAX и добавлять маркеры на карту по мере их вывода из асинхронного режима.,Цикл PHP.

Что я не знаю, как это сделать, это выполнить эти эхо по мере их поступления.

Страница, на которой есть карта (explore.php), запускает JavaScript:

 <script type="text/javascript">;
        function init() {
            // Draw the map (blank)
            var map_focus = new google.maps.LatLng(35,-37);
            var myOptions = { zoom: 2,center: map_focus,mapTypeId: google.maps.MapTypeId.ROADMAP };  
            var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
            var xmlhttp = new XMLHttpRequest();
            // Run PHP to parse XML, asynchronously
            xmlhttp.open("GET","project_locations.php",true);
            xmlhttp.send();
            // This is where I want the JS/AJAX to execute echoes as they come from the above call to project_locations.php
            eval(xmlhttp.responseText);
        }
        // Add marker to map. Markers would appear as fast as the XML is parsed
        function addMarker(object, name, id) {
            google.maps.event.addListener(object,"click", function() {
                window.location = "showproject.php?id=" + id;
            });
        }
    </script>

И это project_locations.php:

include('spparser.php'); // Parse XML
$i = 0;
foreach(SPParser::search($_REQUEST) as $index=>$sp) {
    if ($sp["latitude"] != '' && $sp["longitude"] != '') {
        echo "var marker" . $i . "= new google.maps.Marker({\n";
            echo "position: new google.maps.LatLng(" . $sp["latitude"] . ", " . $sp["longitude"] . "),\n";
            echo "map: map,\n";
            echo "icon: 'http://www.google.com/intl/en_us/mapfiles/ms/micons/" . $sp["color"] . "-dot.png',\n";
            echo "title: \"" . $sp["name"] . "\"\n";
        echo "});\n\n";
        echo "addMarker(marker" . $i . ", \"" . $sp["name"] . "\", " . $sp["id"] . ");\n";
        $i++;
    }
}   

Приведенный выше код рисует пустую карту и все.Однако, если я запускаю его синхронно, используя:

xmlhttp.open("GET","project_locations.php",false);

Существует большая задержка, тогда карта и все маркеры отрисовываются, то есть оператор eval (), который следует после того, как send () выполнит всеотголоски в конце.Как мне выполнить их в режиме реального времени, поскольку они отражены в project_locations.php?

Ответы [ 3 ]

1 голос
/ 22 апреля 2011

Вы можете использовать jQuery Ajax для выполнения асинхронного HTTP (Ajax) запроса.

Именно то, что вы можете сделать, это создать простой HTML-файл и написать там свою функцию JavaScript, которая будет вызывать методы сервера после некоторого периода ожидания, или вызывать его в цикле или восстанавливать вашу функцию, в зависимости от того, что вам нравится. Могу ли я увидеть рабочий образец вашей проблемы. Так что я могу помочь вам лучше?

0 голосов
/ 22 апреля 2011

Поскольку файл PHP в основном генерирует код Javascript, вы, вероятно, могли бы просто включить его как файл Javascript.

С помощью jQuery вы можете сделать это с $.getScript('project_locations.php'). Он должен быть асинхронным.

Совет. Когда вы генерируете переменные JS из PHP, используйте функцию PHP json_encode.

0 голосов
/ 22 апреля 2011

Причина в том, что текст ответа будет возвращен после завершения скрипта чтобы получить данные для их загрузки, вы должны взять текст ответа как его загрузку, как таковой.

while(true)
   {
    xmlhttp.onreadystatechange=function() //listens to the state chnages
   {
    if(xmlhttp.readyState==3) //if its still loading
     {
      eval(xmlhttp.responseText);
     }
   }

    if(xmlhttp.readyState==4) { eval(xmlhttp.responseText);} break; //finished loading get out of for loop
   }

Также убедитесь, что php не буферизует какой-либо вывод. как таковой в верхней части вашего файла.

@ini_set('zlib.output_compression',0);
@ini_set('implicit_flush',1);
@ob_end_clean();

ob_implicit_flush(1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...