Tôi đã lập trình một trang web sử dụng:PHP lỗi lập trình seg
- Zend Framework 1.11.5 (hoàn thành MVC)
- PHP 5.3.6
- Apache 2.2.19
- CentOS 5.6 Virtuozzo i686 trên vps
- cPanel WHM 11.30.1 (xây dựng 4)
- Mysql 5.1.56-log
- 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"
" 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ụ. –
Và có lẽ trong trường hợp này, wrapper FCGI phải đổ backtrace. – hakre
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? –