2011-07-20 122 views
6

我一直在使用的編程網站:PHP編程賽格故障

  1. Zend框架1.11.5(完整的MVC)
  2. PHP 5.3.6
  3. 的Apache 2.2.19
  4. 的CentOS 5.6上VPS的i686的Virtuozzo
  5. 的cPanel WHM 11.30.1(建立4)
  6. Mysql的56年5月1日對數
  7. mysqli的API 56年5月1日

突然對mysql執行一些「SHOW CREATE TABLE」查詢,我得到了這個。

[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 

我試圖禁用eAccelerator在沒有成功

[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 

問題的行是這樣的:$行= $ DB-> fetchRow( 「SHOW CREATE TABLE 222AFI」);.如果我在執行之前返回,一切都會好起來。 $ db是Zend_Db_Adapter_Mysqli的實例。最糟糕的是這不是確定性的。該計劃可以通過一些時間,而其他一些則不通過。通常它不會通過該行而不會崩潰的PHP。

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

我一直沒有給[email protected]因爲我沒有https://bugs.php.net/bugs-generating-backtrace.php。它可能是愚蠢的,但我嘗試用「--enable-debug」重新編譯apache,(這是一個生產服務器)。然而,「PHP的Apache模塊:運行httpd -X,並訪問崩潰PHP的腳本」是我不工作的部分。服務器告訴我端口80已被使用。

任何人都可以給我一些建議嗎? 如果我瘋了,至少還有其他一些選擇?

我可以嘗試在午夜重新編譯Apache,但它會很高興知道我不會破壞任何東西。你如何看待這對我來說非常重要。

編輯

我編譯與--enable-調試PHP。這很奇怪,它不像通常那樣崩潰。很難,20次嘗試可能是一次崩潰。如果用-X啓動apache,則更難以讓PHP崩潰,因爲httpd需要很長時間才能響應。

EDIT2

即使它是20次後的嘗試,我可以使其崩潰,如果我開始的httpd不-X標誌。不過,我模擬了一個腳本,它初始化$ _SERVER變量,以使Zend相信它是通過瀏覽器調用的。當我用「php crash.php」執行這個腳本很多次(比如50)時,一切都正常。我開始相信它與php重用過程有關。我運行的Apache與mod_fcgi和:

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" 
+1

」服務器告訴我端口80已被使用。「先殺死現有的'httpd'進程。這意味着停止Apache服務,如果您將它配置爲作爲服務運行。 –

+0

可能在這種情況下,FCGI包裝必須轉儲回溯。 – hakre

+0

我假設有一種方法可以將文件從緩存/ optcoded中排除。爲什麼不這樣做,直到你找到一個更持久的解決方案? –

回答

0

可以在服務器上運行的phpinfo(),並張貼thread_safety結果呢?如果你的apache不是線程安全的,那麼php應該以相同的方式編譯。

+0

嗨,謝謝。 PHP編譯時也禁用了線程安全。 –

0

首先嚐試編寫一個再現問題的最小示例,即不使用Zend框架,Apache等。只是一個10行左右的腳本,用於設置數據庫連接併發出查詢。

+0

事情是很難從Zend MVC中獲取錯誤。這是我第二次得到一個PHP seg-fault從中做事。另一個是MVC中的PHPUnit。可悲的是,我不得不在解決真正的問題時考慮解決方法。 –

0

我找到了一個臨時解決方案。這很難看,但適合:

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; 
} 

您需要用真正的連接數組替換$ this - > _ config。

該腳本運行任何返回行的SQL命令。現在是我正在採取的解決方案。如果有人希望主動幫助我,我仍然有來源。我也是使用PHPUnit和Zend(確定性地)使用PHP seg-fault的人。我在工作中完成了所有這些工作,沒有足夠的資源來測試它。感謝您的理解。

0

這裏的一個建議,幫助我的固定分段錯誤,因爲我正在處理Web服務:

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

「的解決方法是設置一個值,在php.ini中的參數‘date.timezone’例如:

date.timezone =「美國/紐約」 支持時區的列表在這裏 - www.php.net/manual/en/timezones.php「

+1

每個段錯誤原因的一個解決方案?我不這麼認爲:( – symcbean