Jump to content

PHP HTML labākā prakse


0xDEAD BEEF
 Share

Recommended Posts

DjMDP, pats tu ar buļļa kakām mētājies. Pavisam vienkāršs kods:

<?php

   $str = str_repeat('blah ', 1024 * 1024);
   for ( $n = 0; $n < 15; ++$n ) {
       echo $str;
       sleep(1);
   }

Saproti, cik ilgi jāizpildās skriptam? Es jā - ~15 sec. Kaut kur Tevis minēto 'flush()' redzi? Es nē. Pēc tavas loģikas, lietotājam 15sec būtu jāblenž baltā logā (jo, redz', flush() netiek izsaukts un viss uzkrājas web serva [apache/lighty/iss/whatever] buferī). Pēc tā, kā tas reāli notiek - lietotājs outputu ierauga īsi pēc urļa atvēršanas, turklāt ik pēc ~sekundes lietotājs ierauga arvien vairāk un vairāk.

 

Tas, ko flush() dara, drīzāk ir buffera nosūtīšanas *forsēšana* - gadījumā, ja kaut kas ir aizķēries buferī konkrētajā brīdī (nevis atļaušana, kā tas būtu pēc Tavas loģikas).

 

Par mod_deflate u.c. - buferī uzglabājas daļa outputa, nevis viss outputs. Vot nafig gaidīt, kad sakrāsies viss outputs, ja to pašu kompresiju var veikt outputa daļai?

 

Par headeriem - Tu nepateici neko tādu, kas būtu pretrunā ar manis teikto.

 

Protams, ka servera bufferis neturēs visu responsu RAMā un tad jamo nepūtīs uzreiz nesūtīs klientam. Saņems vajadzīgos responsa datu izmēru un pūtīs jamo klientam.

 

Apache gadījumā sūtāmo datu buffera izmēru kontrolē direktīva SendBufferSize (bai default jamā jūzo sistēmas noklusēto vērtību, kas vismaz manā gadījumā (defaultais ubuntu 9.04 kernelis) ir tieši 4 kb).

 

Vēl ir variants, ka php ir ierubīts implicit flush, ko mēdz dev. vidēs darīt.

 

Vismaz agrāk (ar apache2) mod_deflate turēja ramā visu responsu un tad jamo pūta arā (responsu ģenerēja mod_fcgi)

 

Bez flush NEVAR paļauties, ka kaut kas no responsa aizies līdz klientam pirms responsa beigām, jo tas ir atkarīgs gan web servera konfiga, gan defaultajā konfigā fallbackojas uz TCP/IP stackā uzliktajiem limitiem, kas piemēram gadījumā, ja kaste funkcionēs kā rūteris būs uzlikti lieli. Ja taisi kaut kādus smagos aprēķinus, pirms viņiem ir jāpasauc flush, jo savādāk tā ir paļaušanās uz sistēmas konfigu.

 

ob_start vienīgā atšķirība ir tā, ka jams nodod visu noģenerēto respsonsu servera bufferim vienā reizē, nevis kā klasiski - pēc procesēšanas outputojot.

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...