Tweakerts,
Lang geleden. Ik zit met een issue op een server die niet van mij. Het heeft met buffering te maken.
Probleem is dit; er staan files op een server en die moeten users kunnen downloaden. Daar moeten ze voor betalen dus daar kom je alleen aan via een PHP script.
So far so good. PHP script met de controle, wat headers en iets van fread of readfile. Allemaal koek en ei.
Echter bleken grote files (> 50MB) problemen te geven. Dat komt natuurlijk door de memory_limit van 64M ingesteld op de server. Nou dacht ik, dan lezen we hem in stukjes en flushen we de output na elke fread.... Echter lijkt hoe ik ook flush de output gebuffered te worden tot het geheugen op is, de max execution time overschreven of het uitvoeren van het script klaar is...
Om te te verifiëren deed ik zoiets;
En inderdaad... Op mijn servers (zendserver / centos / redelijk default .ini) krijg je hier netjes om de seconde de tijd voor je snufferd in de browser. Op de server waar het om draait blijft hij cachen tot de tijd op is... Sterker nog zodra ik flush_buffers(); aanroep komt er helemaal niets meer uit.
Bekijk ik dit probleem van de juiste hoek? En zoja, welke settings in php.ini veroorzaken het verschil in gedrag?
Lang geleden. Ik zit met een issue op een server die niet van mij. Het heeft met buffering te maken.
Probleem is dit; er staan files op een server en die moeten users kunnen downloaden. Daar moeten ze voor betalen dus daar kom je alleen aan via een PHP script.
So far so good. PHP script met de controle, wat headers en iets van fread of readfile. Allemaal koek en ei.
Echter bleken grote files (> 50MB) problemen te geven. Dat komt natuurlijk door de memory_limit van 64M ingesteld op de server. Nou dacht ik, dan lezen we hem in stukjes en flushen we de output na elke fread.... Echter lijkt hoe ik ook flush de output gebuffered te worden tot het geheugen op is, de max execution time overschreven of het uitvoeren van het script klaar is...
Om te te verifiëren deed ik zoiets;
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| function flush_buffers(){ ob_end_flush(); ob_flush(); flush(); ob_start(); } ini_set('zlib.output_compression', 0); ini_set('implicit_flush', 1); ini_set('output_buffering', 1); $i = 0; while($i < 15) { $i++; flush_buffers(); sleep(1); echo date('h:i:s') . '<br />'; } |
En inderdaad... Op mijn servers (zendserver / centos / redelijk default .ini) krijg je hier netjes om de seconde de tijd voor je snufferd in de browser. Op de server waar het om draait blijft hij cachen tot de tijd op is... Sterker nog zodra ik flush_buffers(); aanroep komt er helemaal niets meer uit.
Bekijk ik dit probleem van de juiste hoek? En zoja, welke settings in php.ini veroorzaken het verschil in gedrag?
[ Voor 0% gewijzigd door Woy op 15-02-2011 12:58 . Reden: Code tag aangepast ]