webForumDet fria alternativet

Köra kod "asynkront"?

8 svar · 424 visningar · startad av mmmMange

mmmMangeMedlem sedan jan. 2005110 inlägg
#1

Har en sida där man laddar upp foton. När en användare laddar upp ett foto så skapas också två mindre "thumbnails" på webservern. Detta tar en hel del tid. Alltså vill jag kunna köra thumbnailskaparkoden utan att besökaren behöver vänta på att den ska bli klar. Min webserver kör WinXP, alltså är pcntl_fork() uteslutet (om det nu hade fungerat i vilket fall som helst). Hur göra? Eller är det smidigaste att installera nåt program typ ImageMagick och exekvera det från PHP? Kan man isåfall exekvera det så att PHP-skriptet inte väntar på att ImageMagick ska köras klart?

Help me please.

Jesper TMedlem sedan nov. 20017 144 inlägg
#2

I .Net kan man ju skapa trådar "multithreading", det verkar inte funka i php.

dapperMedlem sedan sep. 2005114 inlägg
#3

PHP är enormt dålig på allt som har med Multithreading att göra, tyvärr.
Det går att få till, men det är buggigt, instabilt, och inte värt att använda. :)

Bara från vad jag har sett, och läst på gamla fina /.

Vad jag skulle kunna tänka mig, är att lägga upp schemalagda batch filer för att generera tumnaglarna lite ibland som det behövs.

aasahMedlem sedan mars 20034 471 inlägg
#4

Kan du inte generera thumbnails:en EN gång i stället och spara dom för framtiden i genererat skick i något bildformat ?

mmmMangeMedlem sedan jan. 2005110 inlägg
#5

aasah skrev:

Kan du inte generera thumbnails:en EN gång i stället och spara dom för framtiden i genererat skick i något bildformat ?

Jo, det är det jag gör. Men varje gång en användare laddar upp en bild måste han/hon vänta på att tumnaglarna ska skapas. Uppladdningen tar mindre tid än själva bildbehandlingen, så det är rätt irriterande.

Tror ni det går att lösa genom att exekvera ett fristående program (som t.ex. ImageMagick) ?

aasahMedlem sedan mars 20034 471 inlägg
#6

mmmMange skrev:

Jo, det är det jag gör. Men varje gång en användare laddar upp en bild måste han/hon vänta på att tumnaglarna ska skapas. Uppladdningen tar mindre tid än själva bildbehandlingen, så det är rätt irriterande...

Va? :q Men i så fall skapar du dom en gång per person, väl? Eller missförstår jag? Om inte kan du ev. ha glädje av denna tråd. En bit ner i tråden diskuteras just hur thumbnails:en skapas och när.

emissionMedlem sedan dec. 19996 721 inlägg
#7

Multitrådning har begränsad nytta inom webbutveckling, eftersom det ändå oftast är en rätt synkron exekvering. Dessutom skulle man antagligen hamna i ett läge där man lämnar barntrådar föräldralösa (eller dödar dem i förtid), vilket är en knepig situation resursmässigt.

Ditt problem skulle du kunna lösa med t.ex. php-fil för själva tumnagelvisingen

<img src="showthumb.php?file=[i]filidentifierare[/i]">

...som genererar tumnageln på begäran, om den inte redan finns. Om du lägger den img-taggen på sidan som kommer efter uppladdning så kommer du rätt nära en "bakgrundskörning". Om du sedan vill kan du använda showthumb.php på alla andra sidor som visar tumnaglarna, men det är inte nödvändigt.

mmmMangeMedlem sedan jan. 2005110 inlägg
#8

Ditt förslag med att lägga själva genereringen av tumnagelfilerna i samma skript som visar filen är ju inte helt fel. Använder redan ett skript för att visa tumnaglarna, så det är lätt implementerat. Men vad händer egentligen om användaren snabbt går vidare till en annan sida, innan tumnaglarna hunnit skapas?? Jag skapar både en mellanstor och en liten tumnagel, så det tar sin lilla tid...

En annan lösning jag ska testa nu är att ha ett Windowsprogram (skrivet i Delphi) som anropar ett skapa-tumnaglar-skript (via HTTP) typ var 5:e minut. Finns det inga bilder som saknar tumnaglar så behöver skriptet inte göra nåt, hittar den bilder som inte har sina tumnaglar så skapar det dem.

En nackdel med denna lösningen är ju att användaren inte kan se sina tumnaglar direkt efter uppladdning. Detta löser jag med en temporär tumnagelbild. Eventuellt kan man kanske skapa dessa tumnaglar med hjälp av imagecopyresized istället för imagecopyresampled, då det går fortare men ger sämre kvalité. Annars kör man nån "statisk" bild bara.

Den andra nackdelen är ju att om jag ska flytta sidan till ett webbhotell (har den på en dator i hemnätverket nu), så kan inte mitt intervallkörningsprogram följa med till webbhotellet. Men det är egentligen inget problem nu när jag tänker efter, för det kan ju fortfarande ligga på mitt hemnätverk eftersom det anropar skriptet via HTTP!

Någon som har andra förslag/synpunkter?

Dies_IraeMedlem sedan aug. 2001145 inlägg
#9

Såvit jag vet kör php klart sina script innan de avslutas. Så om någon går till en annan sida spelar ingen roll.

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)