Wanneer een proces is voltooid (ofwel omdat het wordt afgesloten of omdat het wordt beëindigd met een signaal), worden alle bestanden en verbindingen die het open houdt automatisch gesloten door het besturingssysteem. Het is niet schoon gesloten, door het MySQL-protocol te gebruiken voor het sluiten van verbindingen (ervan uitgaande dat er een is). Het wordt eenvoudig op het TCP/IP-niveau neergezet en de server aan de andere kant ontdekt net dat hij met een gesloten deur praat. Dat gebeurt niet altijd meteen, soms duurt het even voordat de server merkt dat de gesprekspartner weg is. Wanneer dit gebeurt, beschouwt het de verbinding als verbroken en ruimt het de dingen op zijn kant op.
Niet doen open de MySQL-verbinding in het bovenliggende proces voordat u fork()
gebruikt . fork()
dupliceert de gegevensstructuren die worden gebruikt om de lokale kant van de verbinding te beheren en de resultaten zijn onvoorspelbaar. Sterker nog, wanneer het kind voltooit (hoe dan ook), sluit het de verbinding (of verbreekt het besturingssysteem het), sluit de MySQL-server ook het einde en ontdekt het bovenliggende proces dat het met niemand praat.
Sluit de MySQL-verbinding in het bovenliggende proces voordat u fork()
. gebruikt open vervolgens, indien nodig, afzonderlijke verbindingen in het bovenliggende en in het onderliggende proces.
Wikkel ook alle MySQL-communicatie met de server in het bovenliggende proces tussen:
pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD));
en
pcntl_sigprocmask(SIG_UNBLOCK, array(SIGCHLD));
Anders, wanneer een onderliggend proces is voltooid, wordt het bovenliggende proces op de hoogte gebracht met de SIGCHLD
signaal. Een ontvangen signaal hervat het uit de slaapstand (als het toevallig is gestopt in een sleep()
bellen wanneer het signaal binnenkomt). De MySQL-bibliotheek gebruikt sleep()
als onderdeel van het MySQL-protocol voor communicatie met de server. Als zo'n sleep()
forceert eerder dan het zou moeten (vanwege een ontvangen signaal), de MySQL-bibliotheek raakt in de war en meldt uiteindelijk vreemde fouten (zoals "MySQL-server is verdwenen") die eigenlijk niet correct zijn.
Bekijk dit antwoord voor een gedetailleerde uitleg.