как вызвать функцию в PHP после 10 секунд загрузки страницы (без использования HTML) - PullRequest
10 голосов
/ 26 августа 2009

Можно ли вызвать функцию через 10 секунд после загрузки страницы в PHP. (Не использует HTML.)

Ответы [ 12 ]

21 голосов
/ 26 августа 2009

PHP - это язык сценариев на стороне сервера. Если вам нужно проверить, загружено ли уже что-то на стороне клиента, вам понадобится язык сценариев на стороне клиента, например JavaScript .

Вам может понадобиться использовать jQuery для вашей цели , чтобы упростить вещи.

JQuery является быстрый и лаконичный JavaScript Библиотека, которая упрощает HTML-документ прохождение, обработка событий, анимация, и Ajax взаимодействия для быстрой сети развитие. JQuery предназначен для изменить способ, которым вы пишете JavaScript.

Сначала загрузите jQuery . В заголовке вашего HTML-кода добавьте следующее:

<script type="text/javascript" src="jquery.js"></script>          
<script type="text/javascript">

// Check if the page has loaded completely                                         
$(document).ready( function() { 
    setTimeout( function() { 
        $('#some_id').load('index.php'); 
    }, 10000); 
}); 
</script> 

В тексте вашего HTML-кода добавьте:

<div id="some_id"></div>
13 голосов
/ 26 августа 2009

Не совсем, нет. Через 10 секунд после загрузки страницы (по крайней мере) через 10 секунд после завершения PHP-скрипта, то есть он больше не работает (кроме трюков, которые пытаются сохранить соединение открытым, что, я думаю, не будет работать в течение 10 секунд)!

Следовательно, вам нужно либо запланировать выполнение задания cron на стороне сервера через 10 секунд, либо вам потребуется обратный вызов с веб-сайта с использованием AJAX.

9 голосов
/ 26 августа 2009

Если я интерпретирую ваш вопрос как «Создание моей страницы занимает много времени, теперь я могу вызывать функцию PHP каждые 10 секунд, пока она генерирует», тогда есть несколько способов, как вы можете подойти к этому ...

Время вашего цикла, сделать что-то после 10 секунд работы ...

$nexttick=time()+10;
$active=true;

while ($active)
{
    if (time()>=$nexttick)
    {
        my_tick_function();
        $nexttick=time()+10;
    }

    //now do some useful processing
    $active=do_some_work();
}

Можно использовать такую ​​технику для реализации индикатора выполнения для длительных операций, если ваша функция "tick" выводит некоторый javascript для обновления HTML, представляющего индикатор хода выполнения.

Использование pcntl_alarm ...

В качестве альтернативы, если в вашей сборке PHP включена поддержка Process Control , вы можете использовать pcntl_alarm для вызова обработчика сигнала через определенное время прошло.

Использование галочек ...

Вы можете использовать конструкцию Declare вместе с register_tick_function , чтобы механизм PHP вызывал вашу функцию каждые x 'ticks'. Из руководства:

Тик - это событие, которое происходит для каждые N низкоуровневые галочки выполняется синтаксическим анализатором в пределах объявить блок. Значение для N указано с помощью галочки = N в пределах объявить раздел директивы блоков.

8 голосов
/ 26 августа 2009

Это кажется странной идеей, но, возможно, это то, что вы ищете, если вы хотите сделать это на PHP, не касаясь HTML / JS:

<?php
your_website_here();

flush(); //this sends the output to the client. You may also need ob_flush();
sleep(10); //wait 10 seconds

your_func_here();
?>

Вышесказанное в принципе хорошо, но на практике это приведет к ОЧЕНЬ ресурсоемкому приложению. Так что будьте осторожны.

И, пожалуйста, не отрицайте меня, это всего лишь теоретический спор.

4 голосов
/ 26 августа 2009

если вы имеете в виду, что после загрузки страницы вам понадобится javascript / ajax / jquery.

1 голос
/ 26 августа 2009

Если вам действительно нужно сделать это в одном и том же PHP-скрипте, самым чистым способом будет fork .

Или, если это невозможно, вот очень плохой хакерский способ сделать это:

<?php
ignore_user_abort(1);

page_output_stuff();
// ...

flush();
sleep(10);
do_something_after_script();
?>

Если вы делаете это, чтобы выводить данные пользователю после задержки, вышеприведенный можно заставить работать, но это действительно уродливый способ сделать это. Просто используйте вместо этого AJAX.

0 голосов
/ 15 декабря 2011

Я хотел сделать то же самое, чтобы получать уведомления при каждом попадании моего резюме. С flush () после всех отправленных данных затем выполняются операции с БД и почтой: страница на клиенте полностью отображается, но индикатор выполнения загрузки все еще присутствует, пока сценарий не будет полностью завершен.

Я хотел сохранить весь материал на стороне сервера (чтобы сгенерированный HTML-файл можно было без проблем использовать в автономном режиме без ошибок), чтобы JS не был вариантом.

В конце концов я просто добавил строку с параметрами в текстовый файл, каждую минуту добавлял задание cron, которое сравнивает размер этого файла с последней отправленной версией, и этот скрипт bash обрабатывает все длинные функции, пока страница 9k все еще загружается и отображает в доли секунды.

К сожалению, этот метод все еще имеет задержку до 1 минуты, но все еще прост:

#!/bin/sh
FLOG=/home/web/traceur/cvaccess.txt

if [ -e $FLOG ]; then
    if [ ! -e $FLOG.sent ]; then touch $FLOG.sent; fi;
    SENT_LINES=$(wc -l $FLOG.sent | cut -d " " -f 1)

    # No disk write if no new-data
    if [ $(wc -l $FLOG | cut -d " " -f 1) -gt $SENT_LINES ]; then
        cp -f $FLOG $FLOG.intr
        NEW_LINES=$(wc -l $FLOG.intr | cut -d " " -f 1)
        TO_SEND=$(( $NEW_LINES - $SENT_LINES ))
        tail -n $TO_SEND $FLOG.intr > $FLOG.diff

        mailx -s "Nouvelle consultation du CV" -r "HAL <hal@jmd-tech.com>" jmarodon@jmd-tech.com < $FLOG.diff
        rm $FLOG.diff
        mv -f $FLOG.intr $FLOG.sent
    fi
fi

А страница находится по адресу: http://www.jmd -tech.com / cv-julien-marodon.html , код PHP является не чем иным, как этими тремя строками в конце ранее простого HTML-файла:

<?php
// Enregistrement log
$ligne=$_SERVER["REMOTE_ADDR"]."\t".$_SERVER["HTTP_USER_AGENT"]."\t".$_SERVER["HTTP_REFERER"]."\t".date("Y-m-d H:i:s");
$fic=fopen("/home/web/traceur/cvaccess.txt","a");
if ($fic) { fwrite($fic,$ligne."\n"); fclose($fic); }
?>

Если я хотел сделать почти мгновенную (<1 с) или 10-секундную версию с задержкой, я думаю, что лучше всего было бы использовать демон вместо задания cron и какое-то межпроцессное взаимодействие, вероятно, прослушивающий сокет, который PHP-скрипт fsockopen () для отправки данных и закрытия (быстро), затем демон самостоятельно выполняет длинные операции. </p>

0 голосов
/ 26 августа 2009

Этот код работает. Отредактировано из ответа Рэнделла.

<script type="text/javascript" src="jquery.js"></script>          
<script type="text/javascript">

$(document).ready(function()
  {
    setTimeout(function()    {   $('#some_id').load('index.php');    }, 10000);
  });
</script>  

Благодаря Рэнделлу

0 голосов
/ 26 августа 2009

Самая близкая мысль, которую я могу придумать:

Как только ваш скрипт завершит выполнение, он сохранит запись в базе данных со временем. Затем демон (стиль cron) выполняет каждую секунду каждую инструкцию в базах данных старше 10 секунд.

0 голосов
/ 26 августа 2009

Php является скриптовым языком, и не может определить, загружена страница или нет. поэтому вы должны использовать клиентский скрипт javascript.

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