PHP-Crashing (seg-fault) unter mod_fcgi, apache

Ich habe Programmierung einer Website mit:

  1. Zend Framework 1.11.5 (komplett MVC)
  2. PHP 5.3.6
  3. Apache 2.2.19
  4. CentOS 5.6 i686 virtuozzo auf vps
  5. CPanel WHM 11.30.1 (bauen 4)
  6. Mysql 5.1.56-Protokoll
  7. Mysqli API 5.1.56

Die Ausgabe begann hier https://stackoverflow.com/questions/6769515/php-programming-seg-fault . Kurz gesagt, PHP gibt mir zufällige Segmentierungsfehler.

[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 

Über Erweiterungen. Wenn ich php mit "–enable-debug" -Flag kompiliere, muss ich diese Zeile deaktivieren:

 zend_extension="/usr/local/IonCube/ioncube_loader_lin_5.3.so" 

Andernfalls akzeptiert der Server keine Anfragen und ich bekomme eine "Die Verbindung mit dem Server wurde zurückgesetzt". Es ist möglich, dass ich auch aus dem gleichen Grund den Eaccelerator deaktivieren muss. Ich weiß immer noch nicht, warum Apache läuft es einige Male und einige andere nicht:

 extension="eaccelerator.so" 

Jedenfalls, nachdem ich httpd läuft, können Seg-Fehler zufällig auftreten. Wenn ich nicht kompiliere php mit "–enable-debug" -Flagge, kann ich DETERMINISTISCH einen PHP-Crash bekommen:

 <?php class Admin_DbController extends Controller_BaseController { public function updateSqlDefinitionsAction() { $db = Zend_Registry::get('db'); $row = $db->fetchRow("SHOW CREATE TABLE 222AFI"); } } ?> 

ABER wenn ich php mit "–enable-debug" -Flag kompiliere, ist es wirklich schwer, diesen Fehler zu bekommen. Ich muss etwas Komplexität hinzufügen, um es zum Absturz zu bringen. Ich muss viele paralell Anfragen für ein paar Sekunden, um einen Absturz zu bekommen:

 <?php class Admin_DbController extends Controller_BaseController { public function updateSqlDefinitionsAction() { $db = Zend_Registry::get('db'); $tableList = $db->listTables(); foreach ($tableList as $tableName){ $row = $db->fetchRow("SHOW CREATE TABLE " . $db->quoteIdentifier($tableName)); file_put_contents( DB_DEFINITIONS_PATH . '/' . $tableName . '.sql', $row['Create Table'] . ';' ); } } } ?> 

Bitte beachten Sie, dass dies das gleiche Skript ist, aber das Erstellen von DDL für alle Tabellen in der Datenbank und nicht für eine. Es scheint, dass wenn PHP schwer geladen ist (mit Erweiterungen und mir viele paralell Anfragen) ist es, wenn ich PHP zum Absturz bekommen.


Über das Starten von httpd mit "-X": Ich habe versucht. Die Sache ist, es ist schon schwer, PHP-Crash mit –enable-Debug zu machen. Mit "-X" -Option (die nur einen Kind-Prozess ermöglicht) kann ich keine parallelen Anfragen machen. Also habe ich nicht in der Lage zu schaffen, um richtige Debug-Backtrace: https://bugs.php.net/bugs-generating-backtrace.php

Meine konkrete Frage ist, was mache ich, um eine Coredump zu bekommen?


 root@GWT4 [~]# httpd -V 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 Compiled using: APR 1.4.5, APR-Util 1.3.12 Architecture: 32-bit Server MPM: Prefork threaded: no forked: yes (variable process count) Server compiled 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" 

    4 Solutions collect form web for “PHP-Crashing (seg-fault) unter mod_fcgi, apache”

    Das Erhalten eines rlimit beinhaltet das Setzen der "Core-Dateigröße" rlimit auf etwas Nicht-Null für den Prozess (es), die Sie Core Dumps aus bekommen möchten. Angesichts der Tatsache, dass du PHP in FCGI laufst, kümmertest du dich nicht wirklich um Apache selbst, es ist nicht segfault; Du möchtest ein Skript haben, um ulimit -c unlimited dann deinen FCGI Server ulimit -c unlimited .

    Ich habe gern eine separate Scratch-Partition für Kerne, also wenn sie ein bisschen groß oder widerspenstig sind, verursachen sie keine Plattenfüllung Probleme anderswo – set /proc/sys/kernel/core_pattern zu etwas wie /var/cores/%e-%p.core

    Muss man ioncube_loader und eaccelerator benutzen? In Bezug auf Eaccelerator, ihre 5.3.x Unterstützung wurde spotty bestenfalls und die meisten 5.3 Benutzer verlassen sich auf APC (die auch besser funktionieren über FCGI sowieso.)

    Wenn du den eaccelerator benutzen musst, machst du ein "make distclean" und dann ihre stehenden INSTALL-Anweisungen (doppelte Überprüfung, dass das Phpize, das du beladen hast, für 5.3.6 und nicht irgendein Rest von einer vorherigen Installation ist)? Ich vermute, das ist die ganze Quelle deiner Hülsenfrüchte und der Apache ist überhaupt nicht der Schuldige.

    Ich fand eine vorübergehende Lösung. Das ist hässlich, aber passt:

    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; 

    }

    Sie müssen $ this -> _ config mit einem echten Verbindungs-Array ersetzen.

    Dieses Skript führt einen beliebigen SQL-Befehl aus, der Zeilen zurückgibt. Jetzt ist die Lösung, die ich nehme. Wenn jemand mir proaktiv helfen will, habe ich immer noch die Quellen. Ich bin auch der Typ, der den PHP-Seg-Fehler mit PHPUnit mit Zend (deterministisch) hat. Ich mache das alles in meinem Job, habe nicht die Ressourcen, um es auszuprobieren. Danke für dein Verständnis.

    Nicht sicher, ob es in diesem Fall hilft, aber ich habe nur ein Kind, finde PID und dann debug es mit Strace

     strace -p PID 
    Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de réseau.