[php ajax] div aanvullen gedurende php uitvoering

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi Tweakers,

Ik heb twee php pagina's.

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<html> 
<head> 

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

<script language="javascript" type="text/javascript"> 
function getHTML() 
{ 
var url = 'pagina2.php'; 
var pars = ''; 
document.getElementById("hiero").innerHTML = 'Gestart.';  
             
            var myAjax = new Ajax.Updater( 
                        {success: 'hiero'}, 
                        url, 
                        { 
                            method: 'get', 
                            parameters: pars, 
                            onFailure: reportError 
                        }); 
             
        } 
     
        function reportError(request) 
        { 
            alert('Er is iets misgegaan.'); 
        } 
         
    </script> 

</head> 
<body> 
<font size="2" face="Verdana"> 

<a href="javascript:getHTML();">Zo, ga maar eens halen<a> 

<div style="height:10px;"></div> 

<div id="hiero">Een div</div> 

</font> 
</body> 
</html>


HTML:
1
2
3
stap 1 gestart <br />
<?php sleep(5);?>
stap 1 klaar. stap 2 gestart <br />


Wat ik graag zou willen is dat de div op de eerste pagina steeds wordt aangevuld met de info van pagina 2. Pagina 2 simuleert namelijk een erg grote pagina die lang duurt om te laden. Via een tussentijdse echo of innerhtml div update wil ik de gebruiker laten zien hoe het er voor staat met de verwerking op pagina 2.

Na een ruime tijd zoeken heb ik nog steeds niet gevonden en wil ik graag beroep doen op jullie expertise.
Nergens waren ajax tutorials / voorbeelden te vinden. php lijkt me ook niet helemaal de bedoeling (kreeg het overigens ook niet werkend).

Het zou erg mooi zijn dat als de actie gestart wordt op pagina 1 en dat de gebruiker ziet: onderdeel 1 van 10 is gestart. Na x seconden: onderdeel 1 is klaar. Onderdeel 2 van 10 wordt gestart etc.

Ik weet dat het niet mogelijk is om een voortgang te geven via ajax van de nog te laden tijd, maar op deze manier informatie is beter dan ze een minuut naar een ladende pagina te laten staren.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Je wil waarschijnlijk iets gaan doen met Output buffering.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Naar deze optie heb ik gekeken maar dat werkt niet. Zit een typfoutje in m'n openingspost zie ik want ik heb het reeds getest. M'n shared hosting staat daar niet juist voor ingesteld en liever zou ik zelf een andere oplossing via AJAX zien, ookal kan die volgens mijn informatie nu maar 4 standaard statussen geven.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Nee, je request kan pas op 1 moment iets weergeven (foutmeldingen daargelaten) en dat is wanneer de request is afgerond.

Hoe bedoel je dat je hosting niet is ingericht voor output buffering?

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Het lijkt me het belangrijkste dat je voor jezelf eerst duidelijk krijgt wat een request precies is en hoe zich dat verhoud tot een php script. Zodra dat duidelijk kun je de zoektocht naar de oplossing wat meer richting geven.

Je geeft immers aan dat je hoster op 1 of andere manier beperkt dat je tijdens het draaien van je script al uitvoer naar de client kunt sturen. Ajax requests zijn natuurlijk zelf ook weer losse requests. Om data tussen verschillende gelijktijdige requests te kunnen uitwisselen zul je een andere oplossing moeten zoeken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Je mist een aantal inzichten in de verschillende technieken. Php is een scripting taal waarmee je op de server iets kan programmeren. Het resultaat aan het einde van de run wordt naar de client gestuurd.

De client ontvangt dus iets (html etc) en maakt daar een pagina van. Tijdens of na het renderen van de pagina worden zaken als javascript uitgevoerd. Wanneer je dat op een asynchrone manier gebruikt, kom je tot technieken als ajax.

Je hebt dus een client vs. serverplaatje niet goed in je hoofd zitten. Met php een ajax effect maken gaat je dus ook niet lukken. Wel kan je met ajax (clientside!) een aantal requests doen waarna je (serverside!) met php daarop gaat reageren. Met meerdere requests een soort "ping" actie uitvoeren en daarmee met php content genereren is wel mogelijk. Toch zijn imo best wat voorbeelden van dit soort updaters te vinden hoor :)

[ Voor 11% gewijzigd door mithras op 05-03-2009 16:54 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
MueR schreef op donderdag 05 maart 2009 @ 16:48:
Nee, je request kan pas op 1 moment iets weergeven (foutmeldingen daargelaten) en dat is wanneer de request is afgerond.

Hoe bedoel je dat je hosting niet is ingericht voor output buffering?
Ik heb wat test scripts gedraaid voor output buffering maar dat geeft geen resultaat.
http://nl.php.net/manual/en/outcontrol.configuration.php bepaalde php.ini instellingen moeten daarvoor waarschijnlijk aangepast worden en daar heb ik geen toegang tot.

Toch lijkt het me sterk dat het niet mogelijk is wat ik graag zou willen. Ik zal eens wat voorbeeld sites gaan zoeken want het moet m.i. toch echt mogelijk zijn om mbv ajax een div dusdanig te updaten gedurende het lopen van scripts dat de gebruiker op de hoogte is van de voortgang.

Toch bedankt voor je output buffering tip.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Tuurlijk kan het. Maar met een kleine omweg. Je zult een script moeten hebben dat iets doet, dat op een andere manier wordt aangeslingert dan via een browser (via crontab bijv.). Die zal z'n output ergens kwijt moeten (database, file, etc). Dan heb je nog een script nodig die je ajax call afhandelt en de output teruggeeft. Dit script zal dan moeten bijhouden wat er al verstuurt is en wat niet. Je javascript stuk kan dan de verkregen output via de ajax call blijven toevoegen.

In andere omgevingen heb je vaak een applicatie server waar je dingen kan laten draaien e.d. zodat je de omweg via crontab o.i.d. niet nodig hebt.

[ Voor 13% gewijzigd door Creepy op 05-03-2009 17:00 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Zou je het niet eens proberen? Die ini vars zijn default values, maar probeer gewoon eens een klein scriptje met ob_start() en bijbehorende functies een aantal regels te laten printen.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thuis lijkt het te werken, maar op het werk niet.
Al is het op het werk erg afgeknepen, beveiligd en draaien we oude meuk.

Ik heb een klein bestandje gemaakt die thuis goed werkt.
Eerst een ob_start();
dan een echo 'tekst';
en dan ob_flush(); en flush();

daarna weer echo 'tekst 2';
en weer ob_flush en flush.

Dat blijkt het doel wat ik heb te treffen.
In een erg lang php script kan ik nu naar de gebruiker kwijt in welke stap deze zit.

Bedankt voor de hulp en ook het inzicht in php / ajax.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Let op dat output vaak gebuffered wordt. IE dit dit bijvoorbeeld zelf ook. Probeer naast 'tekst' ook eens 1024 spaties terug te sturen oid.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1