[PHP/ODBC] Pagina laden duurt té lang->timeout

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 25-04 18:21
Ik heb een database van een stuk software van een klant. Hierin zitten processen beschreven met daarin verantwoordelijke functies en afdelingen. Ik heb in principe 4 tabellen in de DB staan (processen, afdelingen, functies en procesinformatie). Nu maak ik voor een klant verschillende paginas met overzichten:
- Boomstructuur van de processen (zit een boomstructuur in de tabel processen).
- Boomstructuur van de functies/afdelingen.

Het stukje PHP kijkt of een proces beschreven is, en of er een verantwoordelijke functie aan gekoppeld is etc., anders toont ie hem niet. Bij het afdelingsoverzicht kijkt ie of de betreffende afdeling wel functies onder zich heeft welke verantwoordelijk zijn voor processen etc.

Ik laad al de gegevens in in arrays zodat ik iets krijg in de trant van $processen[ID][Name], $processen[ID][Verantwoordelijk]....etc, zodat ik maar eenmalig de queries hoef uit te voeren.

Punt is nu dat als het om grote projecten gaat (>150 processen, >80 functies) dat ik dan gewoon timeout errors krijg in PHP bij de grote overzichten. Nu kan ik wel de timeout-tijd verlengen, maar dan duurt het gewoon té lang. Ik kan niet verwachten van mensen dat ze 60sec. zitten te wachten op een intranetpagina.

Hoe kan ik dit oplossen? Het punt is is dat ie gewoon vaak door die arrays moet lopen en als je bijvoorbeeld 100 functies heeft, moet ie sowieso 100x elk proces langs om te kijken of ie niet een keer benodigd is in een proces. En elk proces bestaat ook weer uit handelingen. Stel je hebt 100 functies, 100 processen met elk 10 handelingen.....dan krijg je 100 * 100 * 10 = 100000 checks. Dat is echt ietsje te veel.

Moet ik misschien eenmalig alles inlezen en dan static-pagina's bouwen of pregenerated output in xml-files pleuren?

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Is het dan niet ook handig om per functie een array bij te houden in welke processen deze gebruikt is ?

Acties:
  • 0 Henk 'm!

Anoniem: 160136

Hmm, ik weet niet of ik je verhaal goed begrijp maar is dit niet juist iets wat je door het DBMS kan laten doen? Het lijkt nu alsof je alle informatie uit de DB trekt en dan zelf nog datgene moet zoeken wat je eigenlijk wil hebben. Hoe vaak en wanneer wordt die query die je nu hebt uitgevoerd?

Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 25-04 18:21
Ik query alles 1x uit een Access DB en dan laadt ik alles in arrays. Ik heb dus een array met $processen en een array met $afdelingen etc.
Ik zal eens kijken of ik het één en ander samen kan voegen.
Probleem blijft echter dat als er een andere DB gekozen wordt (wat mogelijk moet zijn), dat men dan in een administrator module per afdeling/functie kan bepalen of deze gepubliceerd mag worden etc. Ze moeten dan dus al die info hebben zoals [aantal verantwoordelijke processen] etc. Het dus onvermijdelijk dat dat overzicht in ieder geval 1x opgevraagd wordt en dat duurt voor een iets te groot project net iets te lang.

@Brentmeister:
Ik trek het belangrijkste uit de DB en zoek daarna wat ik nodig heb inderdaad. Dit omdat ik later nog plugins moet toevoegen die eventueel andere overzichten maken. Ik heb als het ware een Toolkit gemaakt die al die info in zich heeft zodat eventueel andere mensen ook nog het één en ander zouden kunnen programmeren.

[ Voor 22% gewijzigd door armageddon_2k1 op 19-05-2006 17:53 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Als de pagina zelden wijzigt is het een optie om de pagina semi-dynamisch op te bouwen ?
Initieel wordt de pagina de eerste keer dynamisch opgebouwd en in een cache-file gestopt, vervolgens kan je een check inbouwen of er een record gewijzigd is, zo ja: wijziging verwerken, zo nee: cache laten zien.
Alternatief kan je de alleen de data in een cache-file opslaan en met (bijv.) array_diff checken of er een verandering in de array(s) heeft plaatsgevonden ....

Op die manier duurt alleen de 1e keer opvragen van de info lang

Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 25-04 18:21
Ja, dat idee had ik ook al en lijkt me zinniger. De pagina's zullen niet vaak veranderen namelijk.
Ik maak gewoon een directory aan en daar worden verschillende html-files gemaakt. Volgens mij is dat een goede oplossing.

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Vaudtje
  • Registratie: April 2002
  • Niet online
Het argument dat je van database moet kunnen vernaderen doet niets af aan het feit dat je de selectielogica misschien beter in SQL kan uitvoeren.
Desnoods definieer je je queries ergens buiten het programma, dan kun je ze configureren.

Anders kun je misschien je data redundant opvragen, bijvoorbeeld door bij elk proces een count(gelinkte afdelingen) mee te querien. Dan hoef je alleen nog maar de rijen te tonen waar die waarde > 0 is.

In deeze zin staan drie fauten


Acties:
  • 0 Henk 'm!

Anoniem: 177596

Volgens mij als je je database goed opsteld (goede Indexes enzo) dan zou dit toch gewoon moeten kunnen. Het gebruik van goede indexes is volgens mij nog veel en veel sneller dan wat jij nu doet met je array's.
Pagina: 1