PHP programmation seg faute

J’ai programmé un site en utilisant:

  1. Zend Framework 1.11.5 (MVC complet)
  2. PHP 5.3.6
  3. Apache 2.2.19
  4. CentOS 5.6 i686 virtuozzo sur vps
  5. cPanel WHM 11.30.1 (build 4)
  6. Mysql 5.1.56-log
  7. Mysqli API 5.1.56

Faire soudainement une requête “SHOW CREATE TABLE” à mysql, je l’ai eu.

[Wed Jul 20 17:35:23 2011 ] [notice] EACCELERATOR(5827): PHP crashed on opline 138 of fetch_fields() at /usr/lib/php/Zend/Db/Statement/Mysqli.php:235 

J’ai essayé de désactiver eaccelerator sans succès

 [Wed Jul 20 17:45:34 2011] [warn] [client 190.78.208.30] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server [Wed Jul 20 17:45:34 2011] [error] [client 190.78.208.30] Premature end of script headers: index.php [Wed Jul 20 17:45:34 2011] [error] mod_fcgid: process /usr/local/cpanel/cgi-sys/php5(11562) exit(communication error), get unexpected signal 11 [Wed Jul 20 17:45:34 2011] [warn] [client 190.78.208.30] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server [Wed Jul 20 17:45:34 2011] [error] [client 190.78.208.30] Premature end of script headers: index.php 

La ligne problématique est la suivante: $ row = $ db-> fetchRow (“SHOW CREATE TABLE 222AFI”);. Si je reviens avant d’exécuter, tout se passe bien. $ db est une instance de Zend_Db_Adapter_Mysqli. Le pire est que ce n’est pas déterministe. Le programme peut passer quelques fois et d’autres pas. Normalement, il ne passera pas la ligne sans planter php.

 fetchRow("SHOW CREATE TABLE 222AFI"); } } ?> 

Je n’ai pas écrit à [email protected] parce que je n’ai pas le https://bugs.php.net/bugs-generating-backtrace.php . C’est peut-être bête, mais j’ai essayé de recomstackr Apache avec “–enable-debug”, (c’est un serveur de production). Cependant, “Module PHP Apache: lancez httpd -X, et accédez au script qui plante PHP” Est-ce la partie que je ne travaille pas. Le serveur me dit que le port 80 est déjà utilisé.

Quelqu’un peut-il me donner des conseils? Si je fais quelque chose de fou, au moins quelques autres options?

Je peux essayer de recomstackr Apache à minuit, mais ce serait bien de savoir que je ne casserai rien. Comment vous voyez cela est très important pour moi.

EDIT :

Je dois comstackr php avec –enable-debug. C’est bizarre, il ne plonge pas comme il le ferait normalement. Il est difficile, de 20 tentatives, peut-être un crash. Et si vous lancez apache avec -X, il est encore plus difficile de faire planter php car httpd prend trop de temps pour répondre.

EDIT2 :

Même si c’est après 20 tentatives, je peux le faire planter si je lance httpd sans l’option -X. Cependant, j’ai émulé un script qui initialise les variables $ _SERVER pour faire croire à Zend qu’il est appelé via un navigateur. Lorsque j’exécute ce script avec “php crash.php” plusieurs fois (comme 50), tout se passe normalement. Je commence à croire que cela a quelque chose à voir avec les processus réutilisés php. Je lance apache avec mod_fcgi et:

 Server version: Apache/2.2.19 (Unix) Server built: Jul 20 2011 19:18:58 Cpanel::Easy::Apache v3.4.2 rev9999 Server's Module Magic Number: 20051115:28 Server loaded: APR 1.4.5, APR-Util 1.3.12 Comstackd using: APR 1.4.5, APR-Util 1.3.12 Architecture: 32-bit Server MPM: Prefork threaded: no forked: yes (variable process count) Server comstackd with.... -D APACHE_MPM_DIR="server/mpm/prefork" -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=128 -D HTTPD_ROOT="/usr/local/apache" -D SUEXEC_BIN="/usr/local/apache/bin/suexec" -D DEFAULT_PIDLOG="logs/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_LOCKFILE="logs/accept.lock" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf" 

s’il vous plaît jeter un oeil à https://bugs.php.net/bug.php?id=55414 , quelqu’un a finalement eu avec elle. La solution partielle est mieux mise en œuvre que la mienne.

pouvez-vous exécuter un phpinfo () sur le serveur et publier le résultat pour thread_safety? Si votre apache n’est pas thread-safe, php devrait être compilé de la même manière.

Commencez par écrire un exemple minimal qui reproduit le problème, c’est-à-dire ne pas utiliser le framework Zend, Apache, etc.

J’ai trouvé une solution temporaire. C’est moche, mais correspond:

 public function selectCmd($q){ $charsFrom = array("\\a", "\\t", "\\n", "\\v", "\\f", "\\r", "\\\\", "\\0", "\\\"", "\\\'", "\\b"); $charsTo = array("\a", "\t", "\n", "\v", "\f", "\r", "\\", "\0", "\"", "\'", "\b"); exec('echo ' . escapeshellarg($q) . ' | mysql' . ' -h ' . escapeshellarg($this->_config['host']). ' -u ' . escapeshellarg($this->_config['username']). ' -p' . escapeshellarg($this->_config['password']). ' ' . escapeshellarg($this->_config['dbname']), $output); $colNames = explode("\t", array_shift($output)); foreach ($colNames as &$colName){ $colName = str_replace($charsFrom, $charsTo, $colName); } unset($colName); $rowSet = array(); foreach ($output as $line){ $row = array(); $rawRow = explode("\t", $line); for ($i = 0; $i < count($rawRow); ++ $i){ $row[$colNames[$i]] = str_replace($charsFrom, $charsTo, $rawRow[$i]); } $rowSet[] = $row; } return $rowSet; } 

Vous devrez remplacer $ this -> _ config par un tableau de connexions réel.

Ce script exécute toute commande SQL qui renvoie des lignes. Pour l'instant, c'est la solution que je prends. Si quelqu'un souhaite m'aider de manière proactive, j'ai toujours les sources. Je suis aussi le gars qui a le défaut de seg-PHP en utilisant PHPUnit avec Zend (de manière déterministe). Je fais tout cela dans mon travail, je n'ai pas les ressources pour le tester. Merci de votre compréhension.

Une suggestion ici a permis de corriger mon erreur de segmentation pour un service Web avec lequel je traitais:

http://kb.zend.com/index.php?View=entry&EntryID=436

“La solution consiste à définir une valeur pour le paramètre ‘date.timezone’ dans php.ini. Par exemple:

date.timezone = “America / New_York” La liste des fuseaux horaires pris en charge est disponible ici – http://www.php.net/manual/en/timezones.php