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

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

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> 

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

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

Если я интерпретирую ваш вопрос как «Моя страница занимает много времени, чтобы сгенерировать, теперь я могу вызвать функцию 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 включена поддержка управления процессом , вы можете использовать pcntl_alarm для вызова обработчика сигнала через определенное время.

Использование тиков …

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

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

Это кажется странной идеей, но, возможно, это то, что вы ищете, если хотите сделать это на 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(); ?> 

Вышеописанное теоретически теоретически, но на практике это приведет к ОЧЕНЬ потребляющей память приложению. Поэтому будьте осторожны.

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

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

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

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

 <?php ignore_user_abort(1); page_output_stuff(); // ... flush(); sleep(10); do_something_after_script(); ?> 

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

Вы можете создать таймер Javascript, который вызывает функцию каждые десять секунд.

Учебник здесь

(10 секунд – 10000 миллисекунд)

Вы не можете сделать это с помощью PHP, за исключением, может быть, использования crontab / loop с sleep () и file_get_contents (). Или используйте javascript / ajax, как упоминалось ранее.

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

Самое близкое, о чем я думаю, это:

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

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

Я хотел бы сохранить весь серверный сервер (чтобы сгенерированный 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 – это не что иное, как эти 3 строки в конце ранее обычного файла HTML:

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

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

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

 <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> $(document).ready(function() { setTimeout(function() { $('#some_id').load('index.php'); }, 10000); }); </script> 

Благодаря randell