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

Я полагаю, что современный подход должен использовать эти id атрибут, который был бы оценен как привязка. Например, если бы Вы изменились

<h2><a name="one">Section One</a></h2>

к

<h2><a id="one">Section One</a></h2>

, то Вы все еще обратились бы к нему как page.html#one.

10
задан The Codesee 23 July 2016 в 10:42
поделиться

11 ответов

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

<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
ответ дан 3 December 2019 в 13:19
поделиться

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>
21
ответ дан 3 December 2019 в 13:19
поделиться

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

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

13
ответ дан 3 December 2019 в 13:19
поделиться

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

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

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

8
ответ дан 3 December 2019 в 13:19
поделиться

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

4
ответ дан 3 December 2019 в 13:19
поделиться

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

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

<?php
ignore_user_abort(1);

page_output_stuff();
// ...

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

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

1
ответ дан 3 December 2019 в 13:19
поделиться

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

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

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

0
ответ дан 3 December 2019 в 13:19
поделиться

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

0
ответ дан 3 December 2019 в 13:19
поделиться

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

0
ответ дан 3 December 2019 в 13:19
поделиться

Самое близкое, что я могу придумать, это:

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

0
ответ дан 3 December 2019 в 13:19
поделиться

Благодаря Оливеру за то, что я начал, у меня теперь есть решение, которое поддерживает рефакторинг и является типобезопасным. Это также позволило мне реализовать INotifyPropertyChanged, чтобы он справлялся с переименовываемыми свойствами.

Его использование выглядит так:

checkBoxCanEdit.Bind(c => c.Checked, person, p => p.UserCanEdit);
textBoxName.BindEnabled(person, p => p.UserCanEdit);
checkBoxEmployed.BindEnabled(person, p => p.UserCanEdit);
trackBarAge.BindEnabled(person, p => p.UserCanEdit);

textBoxName.Bind(c => c.Text, person, d => d.Name);
checkBoxEmployed.Bind(c => c.Checked, person, d => d.Employed);
trackBarAge.Bind(c => c.Value, person, d => d.Age);

labelName.BindLabelText(person, p => p.Name);
labelEmployed.BindLabelText(person, p => p.Employed);
labelAge.BindLabelText(person, p => p.Age);

Класс person показывает, как реализовать INotifyPropertyChanged безопасным способом (или см. Этот ответ для другой довольно хороший способ реализации INotifyPropertyChanged, ActiveSharp - Automatic INotifyPropertyChanged также выглядит хорошо):

public class Person : INotifyPropertyChanged
{
   private bool _employed;
   public bool Employed
   {
      get { return _employed; }
      set
      {
         _employed = value;
         OnPropertyChanged(() => c.Employed);
      }
   }

   // etc

   private void OnPropertyChanged(Expression<Func<object>> property)
   {
      if (PropertyChanged != null)
      {
         PropertyChanged(this, 
             new PropertyChangedEventArgs(BindingHelper.Name(property)));
      }
   }

   public event PropertyChangedEventHandler PropertyChanged;
}

Вспомогательный класс привязки WinForms имеет в себе основу, которая заставляет все работать:

namespace TypeSafeBinding
{
    public static class BindingHelper
    {
        private static string GetMemberName(Expression expression)
        {
            // The nameof operator was implemented in C# 6.0 with .NET 4.6
            // and VS2015 in July 2015. 
            // The following is still valid for C# < 6.0

            switch (expression.NodeType)
            {
                case ExpressionType.MemberAccess:
                    var memberExpression = (MemberExpression) expression;
                    var supername = GetMemberName(memberExpression.Expression);
                    if (String.IsNullOrEmpty(supername)) return memberExpression.Member.Name;
                    return String.Concat(supername, '.', memberExpression.Member.Name);
                case ExpressionType.Call:
                    var callExpression = (MethodCallExpression) expression;
                    return callExpression.Method.Name;
                case ExpressionType.Convert:
                    var unaryExpression = (UnaryExpression) expression;
                    return GetMemberName(unaryExpression.Operand);
                case ExpressionType.Parameter:
                case ExpressionType.Constant: //Change
                    return String.Empty;
                default:
                    throw new ArgumentException("The expression is not a member access or method call expression");
            }
        }

        public static string Name<T, T2>(Expression<Func<T, T2>> expression)
        {
            return GetMemberName(expression.Body);
        }

        //NEW
        public static string Name<T>(Expression<Func<T>> expression)
        {
           return GetMemberName(expression.Body);
        }

        public static void Bind<TC, TD, TP>(this TC control, Expression<Func<TC, TP>> controlProperty, TD dataSource, Expression<Func<TD, TP>> dataMember) where TC : Control
        {
            control.DataBindings.Add(Name(controlProperty), dataSource, Name(dataMember));
        }

        public static void BindLabelText<T>(this Label control, T dataObject, Expression<Func<T, object>> dataMember)
        {
            // as this is way one any type of property is ok
            control.DataBindings.Add("Text", dataObject, Name(dataMember));
        }

        public static void BindEnabled<T>(this Control control, T dataObject, Expression<Func<T, bool>> dataMember)
        {       
           control.Bind(c => c.Enabled, dataObject, dataMember);
        }
    }
}

Здесь используется много нового в C # 3.5 и показывает, что возможно. Если бы только у нас были гигиенические макросы программист на Lisp мог бы перестать называть нас гражданами второго сорта)

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

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

9
ответ дан 3 December 2019 в 13:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: