Problemen met flush
in onderstaand script spreek ik een webservice aan en wacht op zijn antwoord.
Tijdens het wachten zou ik met flush mijn gebruikers willen duiden op het feit dat er niks mis is maar dat hij bezig is met het ophalen van gegevens.
Maar hij flusht niks en plaats de output op het einde net als de andere echo opdracht.
Wat doe ik fout?
Code (php)
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
session_start();
if ($_SESSION['ingelogd']!="ja")
{
header ("location:inloggen.php");
exit();
}
$type=$_GET['type'];
if (! is_numeric($type))
{
/*er is geknoeid met de variabele*/
exit();
}
else
{
/*functie om de bewonerid uit de record te strippen*/
function stripid($smap)
{
$amap=explode("/",$smap);
$bewonerid=$amap[1];
return $bewonerid;
}
?>
<html>
<head>
<!-- javascript om popup te openen en andere dicht te doen -->
<script type="text/javascript" language="javascript">
function opendichtcenter()
{
var w= 750;
var h= 125;
var left = (screen.width/2)-(w/2);
var top = (screen.height/2)-(h/2);
window.open('downloaden.php', 'downloaden', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);
window.close('wachten');
}
</script>
</head>
<body>
<?php
header( 'Content-type: text/html; charset=utf-8' );
include('ftp.php');
$abestanden=array();
array_push($abestanden,'nul','Dagboek.pdf','Therapeutisch_schema.pdf');
$basisurl='http://81.82.201.205/Bewoners.svc/J1S2D3K4A5/';
$smap=$_SESSION['map'];
$bewonerid=stripid($smap);
$url=$basisurl.$bewonerid.'/'.$type;
echo str_repeat(" ", 256)."<pre>";
echo "Bezig met aanmaken van uw recente versie<br>";
flush();
ob_flush();
sleep(1);
$jsonObject= json_decode(file_get_contents($url));
if ($jsonObject=="OK")
{
$path='d/'.$bewonerid;
$bestandsnaam=$abestanden[$type];
$openen=$ftp_address.$path.'/'.$bestandsnaam;
$_SESSION['downloaden']= $openen;
echo "<form>
<p align= \"center\">Uw recente versie is aangemaakt. <br>Klik om de download te starten <br>
<input type=\"button\" value=\"downloaden\" OnClick=\"opendichtcenter()\">
</form></p>";
}
else
{
echo "er liep iets fout bij het aanmaken van uw recente versie. <br>
Gelieve even te wachten en daarna opnieuw te proberen. Indien deze fout zich blijft voordoen neemt u best contact op met DVC Heilig Hart.<br>
Bedankt voor uw medewerking.";
}
}
?>
</body>
</html>
?>
session_start();
if ($_SESSION['ingelogd']!="ja")
{
header ("location:inloggen.php");
exit();
}
$type=$_GET['type'];
if (! is_numeric($type))
{
/*er is geknoeid met de variabele*/
exit();
}
else
{
/*functie om de bewonerid uit de record te strippen*/
function stripid($smap)
{
$amap=explode("/",$smap);
$bewonerid=$amap[1];
return $bewonerid;
}
?>
<html>
<head>
<!-- javascript om popup te openen en andere dicht te doen -->
<script type="text/javascript" language="javascript">
function opendichtcenter()
{
var w= 750;
var h= 125;
var left = (screen.width/2)-(w/2);
var top = (screen.height/2)-(h/2);
window.open('downloaden.php', 'downloaden', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);
window.close('wachten');
}
</script>
</head>
<body>
<?php
header( 'Content-type: text/html; charset=utf-8' );
include('ftp.php');
$abestanden=array();
array_push($abestanden,'nul','Dagboek.pdf','Therapeutisch_schema.pdf');
$basisurl='http://81.82.201.205/Bewoners.svc/J1S2D3K4A5/';
$smap=$_SESSION['map'];
$bewonerid=stripid($smap);
$url=$basisurl.$bewonerid.'/'.$type;
echo str_repeat(" ", 256)."<pre>";
echo "Bezig met aanmaken van uw recente versie<br>";
flush();
ob_flush();
sleep(1);
$jsonObject= json_decode(file_get_contents($url));
if ($jsonObject=="OK")
{
$path='d/'.$bewonerid;
$bestandsnaam=$abestanden[$type];
$openen=$ftp_address.$path.'/'.$bestandsnaam;
$_SESSION['downloaden']= $openen;
echo "<form>
<p align= \"center\">Uw recente versie is aangemaakt. <br>Klik om de download te starten <br>
<input type=\"button\" value=\"downloaden\" OnClick=\"opendichtcenter()\">
</form></p>";
}
else
{
echo "er liep iets fout bij het aanmaken van uw recente versie. <br>
Gelieve even te wachten en daarna opnieuw te proberen. Indien deze fout zich blijft voordoen neemt u best contact op met DVC Heilig Hart.<br>
Bedankt voor uw medewerking.";
}
}
?>
</body>
</html>
?>
Gewijzigd op 12/11/2013 16:56:54 door De Clercq Andy
Het hoeft niet per se aan je code te liggen. Ook de webserver en browser kunnen nog buffering toepassen en de flush van PHP is daar machteloos tegen. Als je Apache gebruikt zou het nog kunnen helpen om mod_gzip uit te zetten, maar eigenlijk is flush() een functie die alleen goed bruikbaar is als je PHP als losse scriptingtaal op de commandline gebruikt.
Het beste advies is om heel die ob_ functies en flush() te vergeten. in plaats daarvan moet je gewoon je PHP programma boven in het bestand houden en de output onder in het bestand. In het programma gedeelte mag geen enkele output komen. Je houdt daar alles in de variabelen.
Superklein voorbeeldje:
Code (php)
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
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
<?php
// hier komt het programma gedeelte. In principe zonder output zolang alles goed gaat.
$hour = intval(date('G'));
$dagdeel = 'nacht';
if($hour >= 6)
$dagdeel = 'morgen';
if($hour >= 12)
$dagdeel = 'middag';
if($hour >= 18)
$dagdeel = 'avond';
// achter de sluittag van php begint de output.
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Mijn pagina<title>
</head>
<body>
<p>Goede <?php echo $dagdeel; ?>, van harte welkom bij de betere website</p>
</body>
</html>
// hier komt het programma gedeelte. In principe zonder output zolang alles goed gaat.
$hour = intval(date('G'));
$dagdeel = 'nacht';
if($hour >= 6)
$dagdeel = 'morgen';
if($hour >= 12)
$dagdeel = 'middag';
if($hour >= 18)
$dagdeel = 'avond';
// achter de sluittag van php begint de output.
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Mijn pagina<title>
</head>
<body>
<p>Goede <?php echo $dagdeel; ?>, van harte welkom bij de betere website</p>
</body>
</html>
Bij grotere projecten zie je vaak dat het ouput gedeelte in een apart bestand staat. Dit wordt dan ook wel de view genoemd.
Maar hoe kan ik dit probleem aan de hand van de tweede opmerking oplossen?
Moraal van het verhaal is dat de connectie met de webservice lang kan duren, vandaar dat ik output flush dat is de enige reden.