(HTML kullanarak değil) sayfa yükün 10 saniye sonra PHP bir işlevi çağırmak için nasıl

12 Cevap

Bir işlevi PHP sayfa yük sonra for every 10 seconds of 10 saniye aramak için herhangi bir yolu var mı. (HTML kullanarak değil.)

Şimdiden teşekkürler.

Fero

12 Cevap

Bu kod çalışır. Randell cevabı düzenlenebilir.

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

Randell sayesinde

Pek değil, hayır. Yüklenmiş sizin sayfası 10 saniye sonra (en az) PHP script bittikten 10 saniye sonra, yani it is no longer running (dışında ben sanmıyorum ki, bağlantıyı açık tutarak deneyin hileler gibi bir süre için çalışacak sürece 10 saniye)!

Bu nedenle, 10 saniye içinde yangın sunucu tarafında bir cron işi planlamak gerekir, ya sen AJAX kullanarak, web sitesinden bir geri gerekir.

PHP is a server side scripting language. Bir şey istemci tarafında zaten yüklü olup olmadığını kontrol etmek gerekiyorsa, you will need a client-side scripting language like JavaScript.

You might need to use jQuery for your purpose şeyleri basitleştirmek için. jQuery a,

fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.

Birincisi, indir jQuery. HTML'nizin kafa etiketinde, bu ekleyin:

<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'nizin vücut olarak, bu ekleyin:

<div id="some_id"></div>

Edited to remove bug

Bu garip bir fikir gibi görünüyor ama belki size HTML / JS dokunmadan PHP bunu yapmak istiyorsanız için ne arıyorsanız:

<?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();
?>

Yukarıdaki teoride preety Tamam, ama pratikte çok bellek tüketen uygulama neden olacaktır. Yani uyardı.

Ve beni DOWNVote etmeyiniz, bu sadece teorik bir anlaşmazlık var.

Eğer sayfa yüklendikten sonra Yani eğer bunu javascript / ajax / jquery kullanmak gerekir.

Gibi soru yorumlamak, o zaman bu yaklaşım birkaç yolu vardır "Benim sayfa oluşturmak için uzun bir zaman alır o üretir iken, şimdi ben bir PHP işlevini her 10 saniyede arayabilirler" ...

Time your loop, do something after 10 seconds of work...

$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();
}

Bu sizin "kene" fonksiyonu çıktılarının bir ilerleme ölçer temsil HTML güncelleştirmek için bazı javascript alarak, uzun süren operasyonlar için bir ilerleme ölçer uygulamak için böyle bir tekniği kullanmak mümkündür.

Using pcntl_alarm...

Eğer Process Control desteği PHP sizin inşa etkin varsa Alternatif olarak, pcntl_alarm zaman belli bir miktar geçtikten sonra bir sinyal yöneticisini çağırmak için kullanmak mümkün olabilir.

Using ticks...

Sen register_tick_function PHP motoru fonksiyonu her x 'kene' diyoruz için declare ile birlikte inşa kullanabilirsiniz. Manuel:

A tick is an event that occurs for every N low-level tickable statements executed by the parser within the declare block. The value for N is specified using ticks=N within the declare blocks's directive section.

Eğer gerçekten aynı PHP komut dosyası içinde bunu yapmak gerekir, temiz yolu bir fork olacaktır.

Bu mümkün değilse ya da, burada bunu yapmanın gerçekten kötü bir hackish yolu:

<?php
ignore_user_abort(1);

page_output_stuff();
// ...

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

Eğer bir gecikmeden sonra kullanıcıya çıktı şeyler için bu yapıyorsanız, yukarıdaki can çalışma yapılabilir ama bunu yapmanın gerçekten çok çirkin bir yoldur. Sadece yerine AJAX kullanın.

Sen fonksiyonunu her on saniyede çağıran bir JavaScript zamanlayıcı oluşturabilirsiniz.

Tutorial here

(10 saniye 10000 milisaniye olduğunu)

Belki) bazı crontab / uyku ile döngü () ve file_get_contents (kullanılması dışında, PHP ile bunu hiçbir yolu yok. Daha önce belirtildiği gibi veya javascript / ajax kullanmak.

Php bir servide betik dili ve sayfa yüklü olup olmadığını tespit edemez. böylece istemci tarafı komut dosyası javascript kullanmak zorunda.

Yakın I düşünüyorum düşünüyorum:

Script çalıştırmak için bir renge sahiptir kez, o zaman bir veritabanlarında bir girişi kaydeder. Sonra, bir cini (cron tarzı) 10 saniyeden daha eski veritabanlarında her saniye her bir talimatı yürütmek.

I wanted to do the same thing, to be notified at each hit my resume got. With flush() after all data sent then the DB and mail operations: the page on the client is fully rendered but the downloading progress bar is still present until the script is fully terminated.

Ben (oluşturulan HTML dosyası hataları vermeden temiz kullanılabilir çevrimdışı olmasını sağlamak için) tüm eşyalarını sunucu tarafı tutmak istedim JS bir seçenek değildi.

Sonunda sadece bir cron işi son Gönderdi¤imiz sürümü ile bu dosya boyutunu karşılaştırır her dakika ekleyin ve bu betik tüm lenghty fonksiyonlarını 9k sayfa hala yükler sırasında kolları ve bir kısmını işler, bir metin dosyasına parametreleri ile bir satır ekleyerek sona erdi Bir saniyenin.

Ne yazık ki bu yöntem hala en fazla 1 dakika gecikme ama hala basit vardır:

#!/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

And the page is at: http://www.jmd-tech.com/cv-julien-marodon.html, the PHP code is nothing more than those 3 lines at the end of the previously plain HTML file:

<?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); }
?>

I yakın bir anlık (<1s) veya 10 saniyelik bir gecikme sürüm yapmak istedim, ben gitmek için yol bir cini yerine bir cron işi ve süreçler arası iletişim çeşit, muhtemelen bir dinleme soketi kullanarak olacağını düşünüyorum PHP komut dosyası, Tul işlemleri ile kendisi tarafından daha sonra cini gelirleri veri gönderme ve (hızlı) kapatılması için () fsockopen hangi.