/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Undgå timeout
Fra : Mads Lie Jensen


Dato : 17-08-03 14:43

Hej

Jeg har et php-script som køres gennem min webserver. Dette script
udskriver på en solid gammeldags matrixprinter. Sådan en printer er jo
ikke kendt for at være specielt hurtig, så det sker at det hele ender i
en timeout - og jeg står med en udskrift som kun er halvt færdig.

I scriptet er der indsat en set_time_limit() med passende mellemrum (vil
jeg mene...) og selve udskriften er pakket ind i en ignore_user_abort().

Alligevel sker det ved store udskrifter at browseren giver op og viser
en "Error - zero sized reply"

(Det kører godt nok gennem en Squid Proxyserver, det er muligt det er
den som giver op...)

Men kan jeg på nogen måde undgå dette? Kan man sende en form for
keep-alive header eller lign? Vil det måske hjælpe bare at smide lidt
data ud fra scriptet med echo med jævne mellemrum?


--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk

 
 
Johan Holst Nielsen (17-08-2003)
Kommentar
Fra : Johan Holst Nielsen


Dato : 17-08-03 14:56



Mads Lie Jensen wrote:
> Hej
>
> Jeg har et php-script som køres gennem min webserver. Dette script
> udskriver på en solid gammeldags matrixprinter. Sådan en printer er jo
> ikke kendt for at være specielt hurtig, så det sker at det hele ender i
> en timeout - og jeg står med en udskrift som kun er halvt færdig.
>
> I scriptet er der indsat en set_time_limit() med passende mellemrum (vil
> jeg mene...) og selve udskriften er pakket ind i en ignore_user_abort().
>
> Alligevel sker det ved store udskrifter at browseren giver op og viser
> en "Error - zero sized reply"
>
> (Det kører godt nok gennem en Squid Proxyserver, det er muligt det er
> den som giver op...)
>
> Men kan jeg på nogen måde undgå dette? Kan man sende en form for
> keep-alive header eller lign? Vil det måske hjælpe bare at smide lidt
> data ud fra scriptet med echo med jævne mellemrum?

Sikker på din PHP ikke kører i safe_mode?

Hvis du sætter set_time_limit(0) i ikke-safe-mode burde det ikke skabe
problemer.... og den burde kune sættes en gang.

mvh
Johan


Mads Lie Jensen (17-08-2003)
Kommentar
Fra : Mads Lie Jensen


Dato : 17-08-03 18:07

On Sun, 17 Aug 2003 15:55:32 +0200, Johan Holst Nielsen
<johan@weknowthewayout.com> wrote:

>> Men kan jeg på nogen måde undgå dette? Kan man sende en form for
>> keep-alive header eller lign? Vil det måske hjælpe bare at smide lidt
>> data ud fra scriptet med echo med jævne mellemrum?
>
>Sikker på din PHP ikke kører i safe_mode?

Ja, 100% sikker. Ingen safe_mode her, det er på min egen lille
hyggeserver.

>Hvis du sætter set_time_limit(0) i ikke-safe-mode burde det ikke skabe
>problemer.... og den burde kune sættes en gang.

Den bliver så godt nok sat flere gange, men ikke til 0.
Jeg er ikke helt tryk ved at sætte den til 0, så jeg sætter den til
<antal kopier af udskrift> * 30 sekunder (eller noget i den stil), dette
sker for hver udskrift (der kan være flere ting som skal udskrives i x
antal kopier).

Og ignore_user_abort() er sat til true. Alligevel stopper scriptet midt
i en udskriftsrunde hvis den er tilstrækkelig stor.

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk

Johan Holst Nielsen (17-08-2003)
Kommentar
Fra : Johan Holst Nielsen


Dato : 17-08-03 18:27

Mads Lie Jensen wrote:
>>Hvis du sætter set_time_limit(0) i ikke-safe-mode burde det ikke skabe
>>problemer.... og den burde kune sættes en gang.
>
> Den bliver så godt nok sat flere gange, men ikke til 0.
> Jeg er ikke helt tryk ved at sætte den til 0, så jeg sætter den til
> <antal kopier af udskrift> * 30 sekunder (eller noget i den stil), dette
> sker for hver udskrift (der kan være flere ting som skal udskrives i x
> antal kopier).

Well... ved faktisk ikke hvad der sker hvis man sætter den flere gange?
Bruger den den første værdi, den sidste værdi - eller ligger den alle
værdierne sammen og tilføjer php.ini værdien?

> Og ignore_user_abort() er sat til true. Alligevel stopper scriptet midt
> i en udskriftsrunde hvis den er tilstrækkelig stor.

Hmmm... en tanke - har du prøvet at smide memory_limit op til et par
ekstra MB?

Eventuelt - er du sikker på det er PHP scriptet der skaber timeouten?
Måske er det printeren der ikke helt kan klare dataen... kunne eventuelt
teste det med lidt sleep() engang imellem :)

Ellers er jeg lidt på bar bund ;)

mvh
Johan


Mads Lie Jensen (17-08-2003)
Kommentar
Fra : Mads Lie Jensen


Dato : 17-08-03 20:20

On Sun, 17 Aug 2003 19:27:12 +0200, Johan Holst Nielsen
<johan@weknowthewayout.com> wrote:

>> Den bliver så godt nok sat flere gange, men ikke til 0.
>> Jeg er ikke helt tryk ved at sætte den til 0, så jeg sætter den til
>> <antal kopier af udskrift> * 30 sekunder (eller noget i den stil), dette
>> sker for hver udskrift (der kan være flere ting som skal udskrives i x
>> antal kopier).
>
>Well... ved faktisk ikke hvad der sker hvis man sætter den flere gange?
>Bruger den den første værdi, den sidste værdi - eller ligger den alle
>værdierne sammen og tilføjer php.ini værdien?

I følge manualen bruger den den nye værdi hver gang man sætter den - men
den starter også med at regne fra nul igen. Dvs. hvis der er gået 27
sekunder når man sætter den til 10, så kan scriptet køre i 10 sekunder -
og i det hele altså nå op på 37 sekunder.

>> Og ignore_user_abort() er sat til true. Alligevel stopper scriptet midt
>> i en udskriftsrunde hvis den er tilstrækkelig stor.
>
>Hmmm... en tanke - har du prøvet at smide memory_limit op til et par
>ekstra MB?

Næh. Jeg tror heller ikke det har noget med det at gøre.... og af ren
nysgerrighed: hvorfor foreslår du det?

>Eventuelt - er du sikker på det er PHP scriptet der skaber timeouten?

Nej. Det kan være browseren, det kan være den proxy-server som al
webtrafik her i huset løber igennem.
Men jeg syntes stadig det er mærkeligt at scriptet så bare stopper, når
nu jeg har sat ignore_user_abort(true) - så burde scriptet jo køre
færdigt hvis jeg har forstået det korrekt.

>Måske er det printeren der ikke helt kan klare dataen... kunne eventuelt
>teste det med lidt sleep() engang imellem :)

Det er næppe derfor - mit script åbner parallelporten som var det en fil
(/dev/lp0) og skriver til den - printeren tager så imod efter som den
kan følge med. Matrixprintere er jo ikke kendt for at være hurtige.

>Ellers er jeg lidt på bar bund ;)

Nu hvor jeg har tænkt lidt over og kigget lidt på koden dagen igennem,
kan det måske være at min set_time_limit() står forkert så det alligevel
er derfor den laver timeout...
(Printerens buffet er fyldt når set_time_limit() sættes til tiden for de
nye labels som skal udskrives * tiden som det tager pr. label - her er
der ikke taget højde for tiden det tager printeren at tømme sin buffer
med de forrige labels...)

I bund og grund bør hele denne udskrivningsprocess skrives om til noget
mere holdbart, men her og nu skal det bare virke.....

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk

Johan Holst Nielsen (17-08-2003)
Kommentar
Fra : Johan Holst Nielsen


Dato : 17-08-03 21:55

Mads Lie Jensen wrote:
>>Well... ved faktisk ikke hvad der sker hvis man sætter den flere gange?
>>Bruger den den første værdi, den sidste værdi - eller ligger den alle
>>værdierne sammen og tilføjer php.ini værdien?
>
> I følge manualen bruger den den nye værdi hver gang man sætter den - men
> den starter også med at regne fra nul igen. Dvs. hvis der er gået 27
> sekunder når man sætter den til 10, så kan scriptet køre i 10 sekunder -
> og i det hele altså nå op på 37 sekunder.

Okay du har ret - læste ikke dokumentationen godt nok ;)

>>>Og ignore_user_abort() er sat til true. Alligevel stopper scriptet midt
>>>i en udskriftsrunde hvis den er tilstrækkelig stor.
>>
>>Hmmm... en tanke - har du prøvet at smide memory_limit op til et par
>>ekstra MB?
>
> Næh. Jeg tror heller ikke det har noget med det at gøre.... og af ren
> nysgerrighed: hvorfor foreslår du det?

Well, ved større scripts kan PHP stoppe pga. for meget memory forbrug -
dog plejer man ikke få fejlbeskeder som din men noget ala "memory limit
execeed"

>>Eventuelt - er du sikker på det er PHP scriptet der skaber timeouten?
>
> Nej. Det kan være browseren, det kan være den proxy-server som al
> webtrafik her i huset løber igennem.

Hvad med apache?

> Men jeg syntes stadig det er mærkeligt at scriptet så bare stopper, når
> nu jeg har sat ignore_user_abort(true) - så burde scriptet jo køre
> færdigt hvis jeg har forstået det korrekt.

Ved faktisk ikke om Apache har "rettigheder" til at stoppe PHP
scriptet... har du prøvet at køre det fra prompten?

>
>>Måske er det printeren der ikke helt kan klare dataen... kunne eventuelt
>>teste det med lidt sleep() engang imellem :)
>
> Det er næppe derfor - mit script åbner parallelporten som var det en fil
> (/dev/lp0) og skriver til den - printeren tager så imod efter som den
> kan følge med. Matrixprintere er jo ikke kendt for at være hurtige.

Nææh, kan knap nok huske jeg har ejet en :D

>>Ellers er jeg lidt på bar bund ;)
>
> Nu hvor jeg har tænkt lidt over og kigget lidt på koden dagen igennem,
> kan det måske være at min set_time_limit() står forkert så det alligevel
> er derfor den laver timeout...
> (Printerens buffet er fyldt når set_time_limit() sættes til tiden for de
> nye labels som skal udskrives * tiden som det tager pr. label - her er
> der ikke taget højde for tiden det tager printeren at tømme sin buffer
> med de forrige labels...)
>
> I bund og grund bør hele denne udskrivningsprocess skrives om til noget
> mere holdbart, men her og nu skal det bare virke.....

Har du overvejet at prøve en (fy skamme) set_time_limit(0)? Blot for at
se hvor problemet ligger - hvis den ikke virker - ved du at du skal
længere end PHP... og finde en anden problemkilde...

mvh
Johan


Mads Lie Jensen (18-08-2003)
Kommentar
Fra : Mads Lie Jensen


Dato : 18-08-03 22:25

On Sun, 17 Aug 2003 22:54:52 +0200, Johan Holst Nielsen
<johan@weknowthewayout.com> wrote:

>> Næh. Jeg tror heller ikke det har noget med det at gøre.... og af ren
>> nysgerrighed: hvorfor foreslår du det?
>
>Well, ved større scripts kan PHP stoppe pga. for meget memory forbrug -
>dog plejer man ikke få fejlbeskeder som din men noget ala "memory limit
>execeed"

Det har jeg endnu til gode at opleve så.

>> Det er næppe derfor - mit script åbner parallelporten som var det en fil
>> (/dev/lp0) og skriver til den - printeren tager så imod efter som den
>> kan følge med. Matrixprintere er jo ikke kendt for at være hurtige.
>
>Nææh, kan knap nok huske jeg har ejet en :D

Det er jo uhørt! Jeg har vist pt. 6 stående - dog kun den ene som bruges


>> Nu hvor jeg har tænkt lidt over og kigget lidt på koden dagen igennem,
>> kan det måske være at min set_time_limit() står forkert så det alligevel
>> er derfor den laver timeout...
>> (Printerens buffet er fyldt når set_time_limit() sættes til tiden for de
>> nye labels som skal udskrives * tiden som det tager pr. label - her er
>> der ikke taget højde for tiden det tager printeren at tømme sin buffer
>> med de forrige labels...)
>>
>Har du overvejet at prøve en (fy skamme) set_time_limit(0)? Blot for at
>se hvor problemet ligger - hvis den ikke virker - ved du at du skal
>længere end PHP... og finde en anden problemkilde...

Det er i hvert fald næste forsøg. Og så længe det kører på min egen
server kan jeg jo også komme til at slå det ned hvis det skulle løbe
løbsk.

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
http://www.gartneriet.dk

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408935
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste