Toon posts:

IIS7/PHP 5.3.5 SoapClient out of memory na volle disk

Pagina: 1
Acties:

Onderwerpen

Vraag


  • gnoe93
  • Registratie: September 2016
  • Laatst online: 15-03 08:58
We hebben een legacy server draaien waarop een PHP script via SOAP gevevens uit een database ophaalt op een andere server. Een paar dagen geleden had de server met het PHP script een volle disk, wat ondertussen is opgelost, maar sindsdien geeft de SOAP client een out of memory exception:

code:
1
2
3
4
5
6
7
8
SoapFault exception: [Client] Allowed memory size of 536870912 bytes exhausted (tried to allocate 41480192 bytes) in D:\inetpub\ftproot\wwwroot\dtliikennetietofi\commandline_tasks\libs\sqlcall_class_tip20_prod.php:62
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://soap.mmn...', '', 1, 0)
#1 D:\inetpub\ftproot\wwwroot\dtliikennetietofi\commandline_tasks\libs\sqlcall_class_tip20_prod.php(62): SoapClient->__call('GetDataFromDB', Array)
#2 D:\inetpub\ftproot\wwwroot\dtliikennetietofi\commandline_tasks\import_fi_finnra_d2\get_live_events_from_tip.php(60): sqlcall->sqlrequest('select vvguid,s...')
#3 D:\inetpub\ftproot\wwwroot\dtliikennetietofi\commandline_tasks\import_fi_finnra_d2\get_live_events_from_tip.php(9): give_events_from_db()
#4 D:\inetpub\ftproot\wwwroot\dtliikennetietofi\commandline_tasks\import_fi_finnra_d2\index.php(59): include('D:\\inetpub\\ftpr...')
#5 {main}


Het gaat hem om PHP versie 5.3.5 in IIS 7 op Windows Server 2008 R Enterprise.

Ik heb kunnen bevestigen dat de SOAP server zelf steeds de requests ontvangt en correct afhandelt. Het is dus uitsluitend een client error (zoals aangegeven in de stack trace). Het eigenaardige is dat het teruggegeven resultaat met SOAP nooit groter is dan 20MB.

Ik heb iemand met een gelijkaardig probleem gevonden, maar zijn uitleg/oplossing is niet echt duidelijk: https://stackoverflow.com...ory-size-using-soapclient. Ik heb in ieder geval geprobeerd de WSDL lokaal te laden, maar zonder resultaat.

Verder heb ik reeds geprobeerd de WSDL cache uit te zetten/clearen, maar ook dit zonder resultaat.

Een ander vermoeden is dat het mogelijks om een memory leak/bug gaat: https://bugs.php.net/bug.php?id=70900, maar dan zou ik verwachten dat de SoapClient faalt bij het aanroepen van de constructor, wat bij mij niet het geval is. Sommige SOAP requests slagen zelfs; het lijkt er op dat de client steeds op dezelfde query crasht.

[Voor 7% gewijzigd door gnoe93 op 02-09-2020 20:53]

Alle reacties


  • eLScha
  • Registratie: Juli 2005
  • Laatst online: 01:28
Probleem speelt zich af op regel 62. Kun je regel 50 tot 65 eens delen?

Zit de soapcall in een loop?

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Zo te zien gebruik je meer dan 512MB aan geheugen.
Ruim je geheugengebruik op in de db gebruik.

[Voor 9% gewijzigd door DJMaze op 02-09-2020 22:09]

Maak je niet druk, dat doet de compressor maar


  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Ik weet niet onder welke voorwaarden je die gegevens ophaalt, maar het is natuurlijk niet ondenkelijk dat je alleen nieuwe data ophaalt.

Is het probleem niet gewoon simpelweg dat er téveel nieuwe data wordt geleverd omdat het script tijdelijk niet heeft gewerkt? Als je onder normale omstandigheden ieder uur 1.000 nieuwe rows aan data ophaalt, maar het script heeft 24 uur niet gewerkt dan zal hij nu 24.000+ rows returnen waarbij PHP niet genoeg geheugen heeft om al die data te parsen (zeker niet als je er clientside ook nog eens doorheen gaat lopen loopen en weet ik wat al niet meer)...

☀️🔋  18 Panelen | 5,8 kWp | SolarEdge SE6K


  • gnoe93
  • Registratie: September 2016
  • Laatst online: 15-03 08:58
eLScha schreef op woensdag 2 september 2020 @ 22:01:
Probleem speelt zich af op regel 62. Kun je regel 50 tot 65 eens delen?

Zit de soapcall in een loop?
De regels er voor zijn gewoon parameters die meegegeven worden. Zit niet in een loop, het is de enige call die uitgevoerd wordt.
DJMaze schreef op woensdag 2 september 2020 @ 22:07:
Zo te zien gebruik je meer dan 512MB aan geheugen.
Ruim je geheugengebruik op in de db gebruik.
Harrie_ schreef op woensdag 2 september 2020 @ 22:41:
Ik weet niet onder welke voorwaarden je die gegevens ophaalt, maar het is natuurlijk niet ondenkelijk dat je alleen nieuwe data ophaalt.

Is het probleem niet gewoon simpelweg dat er téveel nieuwe data wordt geleverd omdat het script tijdelijk niet heeft gewerkt? Als je onder normale omstandigheden ieder uur 1.000 nieuwe rows aan data ophaalt, maar het script heeft 24 uur niet gewerkt dan zal hij nu 24.000+ rows returnen waarbij PHP niet genoeg geheugen heeft om al die data te parsen (zeker niet als je er clientside ook nog eens doorheen gaat lopen loopen en weet ik wat al niet meer)...
Dat was inderdaad een van mijn eerste vermoedens, maar er is sinds de dag van de volle schijf geen nieuwe data meer binnengekomen in de database. Zoals ik eerder al zei, is data die de SOAP call returnt, rond de 20MB.

Bovendien wordt SOAP call wordt altijd zonder uitzondering succesvol verstuurd, ontvangen en verwerkt, maar dan loopt het fout in de client zelf die het resultaat terug ontvangt. De out of memory gebeurt in de SOAP client zelf, zonder dat ik het resultaat kan verwerken/lezen. Het zou me verbazen dat de interne logica van SoapClient meer dan 500MB aan geheugen nodig heeft om een XML van 25MB te lezen?

[Voor 16% gewijzigd door gnoe93 op 03-09-2020 01:23]


  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

gnoe93 schreef op donderdag 3 september 2020 @ 01:19:
[...]
Dat was inderdaad een van mijn eerste vermoedens, maar er is sinds de dag van de volle schijf geen nieuwe data meer binnengekomen in de database. Zoals ik eerder al zei, is data die de SOAP call returnt, rond de 20MB.

Bovendien wordt SOAP call wordt altijd zonder uitzondering succesvol verstuurd, ontvangen en verwerkt, maar dan loopt het fout in de client zelf die het resultaat terug ontvangt. De out of memory gebeurt in de SOAP client zelf, zonder dat ik het resultaat kan verwerken/lezen. Het zou me verbazen dat de interne logica van SoapClient meer dan 500MB aan geheugen nodig heeft om een XML van 25MB te lezen?
Ik sluit met dan wel aan bij @eLScha met de vraag om de relevante regels te posten waarop het geheugen volloopt.

Het is toch niet geheel ondenkelijk dat er in de SOAP client zelf iets van een loop plaatsvind? Ik weet niet wat er precies met de data gebeurt, maar 25MB lijkt misschien 'weinig' totdat die soapclient van iedere regel een assoc array gaat bakken en er ook nog iets aan validatie op uit gaat voeren...

☀️🔋  18 Panelen | 5,8 kWp | SolarEdge SE6K


  • thlst
  • Registratie: Januari 2016
  • Niet online
gnoe93 schreef op woensdag 2 september 2020 @ 20:50:
Sommige SOAP requests slagen zelfs
Gewoon memory_limit verhogen O-)

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
gnoe93 schreef op donderdag 3 september 2020 @ 01:19:
Het zou me verbazen dat de interne logica van SoapClient meer dan 500MB aan geheugen nodig heeft om een XML van 25MB te lezen?
Meten is weten met memory_get_usage en memory_get_peak_usage
offtopic:
Het is geen WordPress website :p

Maak je niet druk, dat doet de compressor maar


  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

@gnoe93 Ben je nog verder gekomen? Is het inmiddels opgelost?

☀️🔋  18 Panelen | 5,8 kWp | SolarEdge SE6K

Pagina: 1



Google Pixel 7 Sony WH-1000XM5 Apple iPhone 14 Samsung Galaxy Watch5, 44mm Sonic Frontiers Samsung Galaxy Z Fold4 Insta360 X3 Nintendo Switch Lite

Tweakers is samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer onderdeel van DPG Media B.V.
Alle rechten voorbehouden © 1998 - 2022 Hosting door True

Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee