За последние 24 часа нас посетили 18602 программиста и 1660 роботов. Сейчас ищут 913 программистов ...

Как отобразить страницу раньше, чем завершится скрипт?

Тема в разделе "Прочие вопросы по PHP", создана пользователем Павел, 7 авг 2009.

  1. Павел

    Павел Активный пользователь

    С нами с:
    5 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    Привет!

    Мой скрипт состоит из двух частей.
    Первая генерирует HTML страницу.
    А вторая загружает ресурс из сети и сохраняет его в файл.
    Загрузка - долгая операция и может выполняться до 10 секунд.
    Результат загрузки никак не отражается на содержимом HTML страницы.
    Сначала выполняется первая часть, а потом вторая.

    По окончанию первой части я вызываю flush(), это позволяет отобразить страницу сразу перед стартом второго этапа.
    Однако, встроеный в страницу Flash-ролик SWF не отображается.

    SWF - это ключевой элемент страницы и его необходимо отобразить как можно раньше.
    Он встроен в страницу с помощью библиотеки SwfObject.
    Проблема в том, что SwfObject начинает открывать SWF по событию onLoad() страницы.

    А событие onLoad() приходит только по окончанию второй части, то есть может быть вызвано через 10 секунд. В итоге не смотря на вызов flush() пользователь ждет впустую до 10 секунд.

    Можно ли решить эту проблему при помощи PHP?
    Можно ли запустить задачу загрузки (второй этап)в отдельном процессе?
    Можно ли сообщить браузеру перед вторым этапом, что страница готова и можно уже посылать странице событие onLoad()?
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    1. загружаешь закачку файла и выдаешь пользователю в броузер редирект на страничку со флешем.
    2. первая страничка обрабатывает ignore_user_abort() и продолжает качать файл, тогда как редирект уже показывает флеш.
     
  3. Павел

    Павел Активный пользователь

    С нами с:
    5 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    Спасибо большое!
    Красивое решение (и пока единственное которое у меня есть).
    К сожалению у меня не получилось успешно его реализовать.

    Вот скрипт, который должен в фоне загружать книжку из lib.ru и переходить на яндекс.
    Увы, скрипт сначала грузит книжку, а потом уже переходит на яндекс.

    Наверняка что-то я делаю не так :(

    Код (Text):
    1. <?php
    2. $redirectUrl = "http://yandex.ru";
    3. header("Location: $redirectUrl");
    4. ?>
    5.  
    6. <html>
    7. <head>
    8. <title>Main</title>
    9. </head>
    10. <body>
    11. Main<br/>
    12. </body>
    13. </html>
    14.  
    15.  
    16. <?php
    17. loadResource();
    18.  
    19. function loadResource() {
    20.     $url = "http://lib.ru/DVOJS/ulysses.txt";
    21.  
    22.     $ch = curl_init();
    23.     curl_setopt($ch, CURLOPT_URL, $url);
    24.     curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    25.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable
    26.     curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    27.  
    28.     $text = "";
    29.     try {
    30.         $text = curl_exec($ch);
    31.     }
    32.     catch (Exception $e) {
    33.         echo("Exception...\n$e");
    34.         return;
    35.     }
    36. //Text processing skipped...
    37. }
    [/quote]
     
  4. Павел

    Павел Активный пользователь

    С нами с:
    5 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    Ау, ребята, PHP-гуру!
    Неужели эту проблему нельзя решить на PHP?
     
  5. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    можно
    можно
    мб ajax
     
  6. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    Код (Text):
    1.  
    2.     $text = "";
    3.     try {
    4.        $text = curl_exec($ch);
    5.     }
    6.     catch (Exception $e) {
    7.        echo("Exception...\n$e");
    8.        return;
    9.     }
    o_O
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    проблема в архитектуре, а не в реализации, поэтому и возникает такая ерунда. головой надо думать прежде чем код ваять.
     
  8. Павел

    Павел Активный пользователь

    С нами с:
    5 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    Frozen, извините, я не очень понял, что это за значок в конце сообщения.
     
  9. Павел

    Павел Активный пользователь

    С нами с:
    5 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    440Hz, да я действительно не подумал.
    Решение проблемы пришло само, я поместил SWF в iframe и теперь флешка открывается моментально.

    А код ваять да, я могу, 6 лет в Borland этим занимался.
     
  10. kostyl

    kostyl Guest

    По-моему JQuery может загрузить флешь до полной загрузки страницы. Но я не знаю как это реализовать.