2011-07-20 35 views
6

Tôi đã lập trình một trang web sử dụng:PHP lỗi lập trình seg

  1. Zend Framework 1.11.5 (hoàn thành MVC)
  2. PHP 5.3.6
  3. Apache 2.2.19
  4. CentOS 5.6 Virtuozzo i686 trên vps
  5. cPanel WHM 11.30.1 (xây dựng 4)
  6. Mysql 5.1.56-log
  7. mysqli API 5.1.56

Đột nhiên thực hiện một vài truy vấn "TẠO TẠO TẠO" cho mysql, tôi nhận được thông báo này.

[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 

Tôi đã cố gắng vô hiệu hóa eAccelerator không thành công

[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 

Dòng vấn đề là thế này: $ row = $ db-> fetchRow ("HIỂN THỊ CREATE TABLE 222AFI") ;. Nếu tôi trở lại trước khi nó thực hiện, mọi thứ diễn ra tốt đẹp. $ db là instance của Zend_Db_Adapter_Mysqli. Phần tồi tệ nhất là không xác định. Chương trình có thể vượt qua một số lần và một số khác thì không. Thông thường nó sẽ không vượt qua dòng mà không bị rơi php.

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

Tôi chưa viết thư cho [email protected] vì tôi chưa có https://bugs.php.net/bugs-generating-backtrace.php. Nó có thể là câm, nhưng tôi đã thử biên dịch lại apache với "--enable-debug", (đây là một máy chủ sản xuất). Tuy nhiên "Mô-đun Apache Apache: Chạy httpd -X và truy cập tập lệnh có lỗi" "Phần tôi không làm việc. Máy chủ cho tôi biết cổng 80 đã được sử dụng.

Có ai có thể cho tôi một số lời khuyên không? Nếu tôi đang làm điều gì đó điên rồ, ít nhất một số lựa chọn khác?

Tôi có thể cố gắng biên dịch lại apache lúc nửa đêm, nhưng thật tuyệt khi biết tôi sẽ không phá vỡ bất cứ điều gì. Làm thế nào bạn thấy điều này là rất quan trọng với tôi.

EDIT:

tôi đã biên dịch php với enable-debug. Điều này thật kỳ lạ, nó không bị hỏng như bình thường. Thật khó, 20 lần thử có thể bị treo. Và nếu bắt đầu apache với -X, nó thậm chí còn khó khăn hơn để có được php đâm vì httpd mất quá nhiều thời gian để trả lời.

EDIT2:

Thậm chí nếu đó là sau 20 nỗ lực, tôi có thể làm cho nó sụp đổ nếu tôi bắt đầu httpd mà không cờ -X. Tuy nhiên, tôi mô phỏng một tập lệnh khởi tạo biến $ _SERVER để làm cho Zend tin rằng nó được gọi thông qua trình duyệt. Khi tôi thực thi kịch bản này với "php crash.php" nhiều lần (như 50) mọi thứ diễn ra bình thường. Tôi bắt đầu tin rằng nó có một cái gì đó để làm với các quy trình tái sử dụng php. Tôi đang chạy apache với mod_fcgi 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" 
+1

" máy chủ nói với tôi cổng 80 đã được sử dụng. " Giết quá trình 'httpd' hiện có trước. Điều này có nghĩa là dừng dịch vụ Apache, nếu bạn đã cấu hình nó để chạy như một dịch vụ. –

+0

Và có lẽ trong trường hợp này, wrapper FCGI phải đổ backtrace. – hakre

+0

Tôi giả sử có một cách để loại trừ các tệp khỏi lưu trữ/mã hóa. Tại sao không làm điều đó cho đến khi bạn tìm thấy một giải pháp lâu dài hơn? –

Trả lời

0

bạn có thể chạy phpinfo() trên máy chủ và đăng kết quả cho thread_safety không? nếu apache của bạn không phải là thread an toàn, thì php nên được biên dịch theo cùng một cách.

+0

Xin chào, cảm ơn. PHP được biên dịch với an toàn luồng cũng bị vô hiệu hóa. –

0

Trước tiên, hãy thử viết một ví dụ tối thiểu để tái tạo sự cố, tức làkhông sử dụng khung công tác Zend, Apache, v.v. Chỉ cần một đoạn mã gồm 10 dòng để thiết lập một kết nối cơ sở dữ liệu và đưa ra một truy vấn.

+0

Điều này là khá khó khăn để có được các lỗi trong Zend MVC. Đây là lần thứ hai tôi nhận được một lỗi PHP từ việc làm mọi thứ trong đó. Một cái khác là với PHPUnit bên trong MVC. Đáng buồn là tôi đã bị buộc phải nhìn vào cách giải quyết mà không giải quyết vấn đề thực sự. –

0

Tôi tìm thấy giải pháp tạm thời. Đây là điều xấu, nhưng phù hợp:

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

Bạn sẽ cần phải thay thế $ this -> _ config bằng một mảng kết nối thực.

Tập lệnh này chạy bất kỳ lệnh SQL nào trả về hàng. Bây giờ là giải pháp tôi đang dùng. Nếu ai đó muốn giúp tôi chủ động tôi vẫn có nguồn. Tôi cũng là người có lỗi seg PHP sử dụng PHPUnit với Zend (xác định). Tôi đang làm tất cả điều này trong công việc của tôi, không có các nguồn lực để kiểm tra nó. Cảm ơn vì sự hiểu biết của bạn.

0

Một gợi ý ở đây giúp cố định lỗi phân khúc của tôi cho một dịch vụ web tôi đã đối phó với:

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

"Cách giải quyết là để thiết lập một giá trị cho các tham số 'date.timezone' trong php.ini . Ví dụ:

date.timezone = "America/New_York" danh sách các múi giờ được hỗ trợ có sẵn ở đây - www.php.net/manual/en/timezones.php "

+1

Một giải pháp cho mọi nguyên nhân segfault? Tôi không nghĩ vậy :( – symcbean

Các vấn đề liên quan