Comment traquer les plantages PHP?

J’essaie de retrouver la cause de mes pannes Apache PHP. J’espère qu’il y a une sorte de paramètre, un outil ou quelque chose qui aide à retrouver le code, la configuration ou le problème à l’origine de ces pannes de php.

Dans mon journal des événements Windows, j’ai (montre apache crash, mais causé par php):

Faulting application httpd.exe, version 2.2.21.0, time stamp 0x4e6b3136, faulting module php5ts.dll, version 5.3.8.0, time stamp 0x4e537a04, exception code 0xc0000005, fault offset 0x0000c7d7, process id 0xbf4, application start time 0x01cd45afc42f0b7d. 

L’application utilise Apache, PHP et MySQL sur une machine Windows Server 2008 (xampp).

Ceci est le crash dans mon journal Apache:

 [Fri Jun 08 15:56:34 2012] [notice] Parent: child process exited with status 3221225477 -- Restarting. [Fri Jun 08 15:56:35 2012] [notice] Digest: generating secret for digest authentication ... [Fri Jun 08 15:56:35 2012] [notice] Digest: done [Fri Jun 08 15:56:35 2012] [notice] Apache/2.2.21 (Win32) PHP/5.3.8 configured -- resuming normal operations [Fri Jun 08 15:56:35 2012] [notice] Server built: Sep 10 2011 11:34:11 [Fri Jun 08 15:56:35 2012] [notice] Parent: Created child process 1220 [Fri Jun 08 15:56:35 2012] [notice] Digest: generating secret for digest authentication ... [Fri Jun 08 15:56:35 2012] [notice] Digest: done [Fri Jun 08 15:56:35 2012] [notice] Child 1220: Child process is running [Fri Jun 08 15:56:35 2012] [notice] Child 1220: Acquired the start mutex. [Fri Jun 08 15:56:35 2012] [notice] Child 1220: Starting 150 worker threads. [Fri Jun 08 15:56:35 2012] [notice] Child 1220: Starting thread to listen on port 80. [Fri Jun 08 15:56:35 2012] [notice] Child 1220: Starting thread to listen on port 80. [Fri Jun 08 15:57:37 2012] [notice] Parent: child process exited with status 3221225477 -- Restarting. [Fri Jun 08 15:57:37 2012] [notice] Digest: generating secret for digest authentication ... [Fri Jun 08 15:57:37 2012] [notice] Digest: done [Fri Jun 08 15:57:37 2012] [notice] Apache/2.2.21 (Win32) PHP/5.3.8 configured -- resuming normal operations [Fri Jun 08 15:57:37 2012] [notice] Server built: Sep 10 2011 11:34:11 [Fri Jun 08 15:57:37 2012] [notice] Parent: Created child process 3932 [Fri Jun 08 15:57:38 2012] [notice] Digest: generating secret for digest authentication ... [Fri Jun 08 15:57:38 2012] [notice] Digest: done [Fri Jun 08 15:57:38 2012] [notice] Child 3932: Child process is running [Fri Jun 08 15:57:38 2012] [notice] Child 3932: Acquired the start mutex. [Fri Jun 08 15:57:38 2012] [notice] Child 3932: Starting 150 worker threads. [Fri Jun 08 15:57:38 2012] [notice] Child 3932: Starting thread to listen on port 80. [Fri Jun 08 15:57:38 2012] [notice] Child 3932: Starting thread to listen on port 80. 

Toute reflection sur ce que je devrais essayer, ou des outils / techniques pour remonter à quel code, etc. pourraient être à l’origine de cela?

Puisque Apache (pour Windows) de XAMPP est construit avec winn_nt MPM (multi-thread) + Thread-Safe PHP, il se peut que vous renconsortingez un problème inhérent aux versions supposées de Thread-Safe de PHP (voir ce très bon post pour en savoir plus) information). Cela peut expliquer pourquoi vous ne rencontrez jamais l’erreur lors de l’exécution en mode mono-utilisateur.

S’il vous plaît laissez-nous savoir si la suggestion de Uku Loskit a fait du bien. Sinon, je recommanderais de passer à une configuration PHP Prefork + Non-Thread-Safe dans un environnement multi-utilisateurs.

Comme MPM doit être choisi à la compilation, vous devez soit:

  • comstackr toi-même Apache (techniquement faisable, mais pas mal dans le cou sous Windows, pour autant que je m’en souvienne)
  • trouver une dissortingbution autre que XAMPP, qui est construite avec prefork (je n’en connais pas)

Vous devriez peut-être essayer de lancer PHP avec FastCGI (cette couche supplémentaire isole les threads du serveur en lançant un processus PHP distinct pour chaque thread, et bien plus encore ). Cela devrait vous permettre de vérifier facilement mon hypothèse initiale.

Juste une remarque: je ne vois pas l’intérêt d’installer Apache sur un serveur Windows. Vous voudrez peut-être envisager d’utiliser IIS, éventuellement avec FastGCI (voir les instructions ici ), ou (mieux) passer à une stack basée sur Linux.