Ik heb een API endpoint waar ik in bulk JSON naar PUT. Daarbij krijg ik de volgende error (PHP-FPM 7.4, Apache 2.4.46, Ubuntu 20.04):
Mijn eerste vermoeden was een te kleine post_max_size, max_execution_time of memory_limit. Ik ben vervolgens in de PHP-FPM logs gaan kijken, maar daar was raar genoeg niets te zien. Voor de zekerheid heb ik de logs op debug gezet en catch_workers_output op yes. Ik heb vervolgens ook post_max_size op 100M, max_execution_time op 30s en memory_limit op 1024M gezet. Maar helaas... zelfde resultaat en niets in de logs.
De inhoud van de request body is een JSON array als volgt:
Ik ben de grootte van de request body beginnen verlagen, in de hoop ergens een grens te bereiken waar het wel werkt. Die grens ligt blijkbaar op een 1140 items in de array. Vanaf 1141 items weer dezelfde fout. Dit deed me toch vermoeden dat er ergens een limiet bereikt werd, maar bij 1140 items wordt er 15MB geheugen gebruikt, < 1 MB request body, en een execution time van < 1s...
Om er 100% zeker van te zijn of dit probleem (niet) aan Apache/FCGI ligt, heb ik nogmaals geprobeerd met alle 80000 items in de JSON, maar dan met alle database calls naar MySQL uitgecomment. Succes, dit blijkt te werken.
Mijn focus ligt nu dus op MySQL (8). Mijn vermoeden is dat de database driver ergens op vast loopt zonder exception/error te tonen/loggen. Meer specifiek gebruik ik native queries met Doctrine DBAL, met de PDO driver. Ik verdeel de inserts in batches van 10000 en maak gebruik van MySQL batch inserts (meerdere rows per insert statement).
Na wat experimenteren met de batch size, lijkt het er op dat het niet uitmaakt of de batch size 100 of 10000 is, het loopt altijd vast vanaf 1141 rows, ook al wordt elke batch in een andere transaction gedaan. Voor zij die de betreffende code willen inkijken: https://gist.github.com/e...f052caff3d7e0a634a43cc390 (vanaf regel 105 gebeurt de batch).
Heeft iemand enig idee wat hier exact foutloopt? Zijn er bepaalde MySQL instellingen die hier van toepassing zijn?
code:
1
2
3
| [Sat Apr 24 09:13:27.944932 2021] [proxy_fcgi:error] [pid 112610:tid 140078236018432] [client ::1:39960] Premature end of script headers: index.php [Sat Apr 24 09:13:27.944994 2021] [proxy_fcgi:error] [pid 112610:tid 140078236018432] [client ::1:39960] AH01070: Error parsing script headers [Sat Apr 24 09:13:27.945003 2021] [proxy_fcgi:error] [pid 112610:tid 140078236018432] (22)Invalid argument: [client ::1:39960] AH01075: Error dispatching request to : |
Mijn eerste vermoeden was een te kleine post_max_size, max_execution_time of memory_limit. Ik ben vervolgens in de PHP-FPM logs gaan kijken, maar daar was raar genoeg niets te zien. Voor de zekerheid heb ik de logs op debug gezet en catch_workers_output op yes. Ik heb vervolgens ook post_max_size op 100M, max_execution_time op 30s en memory_limit op 1024M gezet. Maar helaas... zelfde resultaat en niets in de logs.
De inhoud van de request body is een JSON array als volgt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| [ { "vendorId": 1, "currencyId": 1, "cardId": 8990, "cardVariantTypeId": 2, "cardLanguageId": 1, "cardConditionId": 4, "price": 228, "priceDate": "2021-04-24T03:24:12.1510714Z", "vendorProductUrl": "https://store.tcgplayer.com/pokemon/xy-evolutions/ninetales" } ] |
Ik ben de grootte van de request body beginnen verlagen, in de hoop ergens een grens te bereiken waar het wel werkt. Die grens ligt blijkbaar op een 1140 items in de array. Vanaf 1141 items weer dezelfde fout. Dit deed me toch vermoeden dat er ergens een limiet bereikt werd, maar bij 1140 items wordt er 15MB geheugen gebruikt, < 1 MB request body, en een execution time van < 1s...
Om er 100% zeker van te zijn of dit probleem (niet) aan Apache/FCGI ligt, heb ik nogmaals geprobeerd met alle 80000 items in de JSON, maar dan met alle database calls naar MySQL uitgecomment. Succes, dit blijkt te werken.
Mijn focus ligt nu dus op MySQL (8). Mijn vermoeden is dat de database driver ergens op vast loopt zonder exception/error te tonen/loggen. Meer specifiek gebruik ik native queries met Doctrine DBAL, met de PDO driver. Ik verdeel de inserts in batches van 10000 en maak gebruik van MySQL batch inserts (meerdere rows per insert statement).
Na wat experimenteren met de batch size, lijkt het er op dat het niet uitmaakt of de batch size 100 of 10000 is, het loopt altijd vast vanaf 1141 rows, ook al wordt elke batch in een andere transaction gedaan. Voor zij die de betreffende code willen inkijken: https://gist.github.com/e...f052caff3d7e0a634a43cc390 (vanaf regel 105 gebeurt de batch).
Heeft iemand enig idee wat hier exact foutloopt? Zijn er bepaalde MySQL instellingen die hier van toepassing zijn?