Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

Динамическое отображение выполнения скрипта

#jquery #php #javascript


Всем доброго времени суток!
Вопрос вот в чем: есть html-страница. На ней форма отправки данных, подгружающая
и парсящая файл csv и подгружающая архив.
В csv хранятся адреса почты. Архив - приложение к письму.
Форма обрабатывается скриптом jQuery (библиотека jQuery Form):

    $(document).ready(function(){  
    $("form").submit(function(){  
    var options = {  
        url: 'sent.php',  
        dataType: 'html',  
        status: $(".result").html(''),  
        type: 'POST',  
        success: function(msg){  
            $(".result").append(msg);  
            }  
        };  
        $(this).ajaxSubmit(options);  
        return false;  
    })  
});

Очень хочется, чтобы PHP отдавал, а JS обрабатывал отдаемое, типа: "Файл загружен",
"отправка на %email_address%... OK!" и т.д.
Но я понимаю, что JS реагирует на ответ сервера.
Как сделать так, чтобы это было динамично и динамично отображались данные?    


Ответы

Ответ 1



Использовать сокеты (двухстороннее общение). Тогда сервер при выполнении определенного этапа легко сможет сообщить об этом клиенту. Long polling (Пример для php). Суть метода проста. Отправляем запрос на сервер, если ничего еще не обработано, сервер просто не возвращает ответ (держит соединение открытым - в пхп может реализовываться с помощью sleep). Как только что-то произошло, сервер закрывает соединение, отдавая в ответе нужные Вам данные (успешно обработанный этап в вашем случае). Как только клиент получает ответ, он перепосылает запрос, ожидая следующий ответ. Но тут да, при переоткрытии соединения нет гарантий, что не выполниться несколько этапов за это время - поэтому лог не отправленных статусов лучше хранить.

Ответ 2



Сразу скажу свое мнение - оно того не стоит. Вы потратите кучу времени, столкнетесь с несовместимостью в браузерах и кучей багов. Реализовывать советую только в случае, если это некий тестовый проект и вы делаете это для собственного опыта (нет ограничений во времени и ресурсах:) Ну а теперь перейдем к практике: При классическом подходе Сервер может только отвечать на запросы Клиентов (браузеров) и никак иначе. Сам сервер не может инициировать запрос на клиенты. Смиритесь с этим. Как было сказано выше в комментариях - почитайте про Comet. Отличная статья на Хабре. Тут описаны основные подходы для решения этой задачи. В случае с пхп взгляните в сторону PHP WebSocket Стандартным примером в этом случае служит простейший чат. Это как Hello, world! при изучении нового языка. Переделать такой пример под свои потребности совсем не сложно. Главное уловить суть и вытащить кусок кода который отвечает за ответ с сервера на клиент. Там уже можно передавать что угодно и соответственно обрабатывать скриптами на клиенте. В свое время, когда мой хостинг не позволял реализовать ничего подобного, то я нашел реализацию, когда при подключении каждому клиенту создается уникальный файл на хостинге, в который и пишется вся инфа, а каждый клиент уже читает инфу со своего файла. Вообщем говорить тут можно долго и много. Если вы искали стандартное решение в одну строку, то его нет...

Ответ 3



Нужно использовать аякс-запросы, вот общая схема, без подробностей: сперва вешаем событие на кнопку отправки формы в событии делаем аякс-запрос к серверу, в нём в ветке beforeSend включаем показ "данные отправляются", в success (запрос успешен) отрубаем отображение "данные отправляются" и выводим "данные отправлены"; можно чего добавить в error (если произошла ошибка) - по желанию. $(document).ready(function(){ $("$submit-id").click(function(){ $.ajax({ //parameters beforeSend: function(){},//включили "данные отпраляются" success: function(){},//выключили и показали сообщение, что всё хорошо error: function(){alert("Ошибка!");} }); return false;//что бы форма не отправилась обычным способом }); });

Ответ 4



Ну вообще это не правильная архитектура в рамках вебсервиса (а в принближении оно так и есть) пытаться лезть внутрь метода вебсервиса снаружи. Слом идеологии, в следствии чего рождаются всевозможные "хаки". На мой взгляд правильным решением тут будет следующее: 1.Скрипит (Метод вебсервиса) что то делает, при этом о результатах своей работы он как то репортует через какое-нибудь проектное АПИ. 2.Клиент, инициировавший этот процесс, вешается на событие js Объекта, который или с какой либо периодичностью опрашивает сервер на предмет есть что отрепортуемое (вызывает скрипт который через АПИ запрашивает а кто что отрепортовал) и если есть - то вызывает подписчиков, или иным другим способом об это узнаёт (через флешовые socket например) В проектном АПИ реализация методов - например тупо через базу. При этом метод из пункта один дополнительно может инициализировать запрос через сокет если клиент это поддерживает. Как то так :-) А если вы по факту хотите видеть консольный вывод скрипта, то Вам поможет вариант long pull и отключение буферизации у php. т.е. определяете iframe с вашим скриптом и то что он будет кидать т.к. без буфера будет отображаться в браузере. Только Вам надо отдавать будет текст, т.к. браузер может ждать завершения тегов например для построения и отображения дом модели.

Ответ 5



Может быть в самом скрипте включить буферизацию вывода, а на js ловить ответы от сервера? как вариант...

Комментариев нет:

Отправить комментарий