2011-12-17 30 views
8

Khi di chuyển một tập lệnh PHP từ PHP 5.2 lên PHP 5.3, tôi đã vấp phải vấn đề sau: Mục đích chung của tập lệnh là khai phá dữ liệu. Tôi có một thủ tục bên trong thêm dữ liệu vào máy chủ MySQL. Vì nó thực sự lặp đi lặp lại, tôi đã viết lại nó (một lúc trước) để sử dụng MySQLi, trong các câu lệnh được chuẩn bị cụ thể, vì có tổng cộng 3 truy vấn có thể thực hiện. Dù sao, bây giờ, trên máy chủ PHP 5.3, kịch bản bị rơi trên dòng sau:PHP lạ Seg-lỗi trên mysqli_stmt_bind_result

mysqli_stmt_bind_result($prepCheck, $id1); 

đâu $prepCheck được tạo ra với $prepCheck = mysqli_prepare($con, $checkQuery) or die("Error");. Truy vấn chạy tốt trên máy chủ MySQL ($ checkQuery, có nghĩa là) và mã PHP cũng đang hoạt động trên máy chủ trước đó.

Chạy tập lệnh với strace không tiết lộ bất kỳ điều gì, vì điều cuối cùng trong đó là gọi hệ thống cho echo "Execute";, là 29936 19:44:18 write(1, "Execute\n", 8) = 8.

Đối tượng kết nối không phải là FALSE, và thậm chí nếu có, nó sẽ thất bại với một lỗi khác, đúng không?

Đây là phần lạ nhất: Quy trình này không bị lỗi khi tôi chạy tập lệnh, giới hạn số lượng trang đã truy cập và tập lệnh hoàn tất thành công. Tuy nhiên, khi tôi đặt giới hạn cao hơn, nó không thành công, luôn là trong lần gọi đầu tiên đến quy trình này và chính xác trên dòng này.

Nếu có ai có bất kỳ đề xuất nào có thể gây ra điều này, chúng sẽ được đánh giá cao.

Tôi có thể dán mã nếu ai đó cần xem ảnh lớn hơn, nhưng quy trình này rất dài và nhàm chán đến chết (có thể đó là lý do tập lệnh bị lỗi :).

Đây là cách tập lệnh bắt đầu: error_reporting(E_ALL); ini_set('display_errors', '1');. Không có lỗi nào được báo cáo bên cạnh 'huyền diệu' Segmentation fault. Tôi không sử dụng APC.

Không chắc chắn nó có liên quan hay không, nhưng tôi đang sử dụng CLI để chạy tập lệnh chứ không phải giao diện web.

Phiên bản PHP là 5.3.8, phiên bản MySQL là 5.1.56. Giới hạn bộ nhớ được đặt thành 64MB.

EDIT: Quy trình bị lỗi + một số mã khác được tải lên tại đây: http://codepad.org/KkZTxttQ. Toàn bộ tập tin là rất lớn và xấu xí, và tôi tin rằng không liên quan, vì vậy tôi không đăng nó ngay bây giờ. Dòng đó là thất bại là 113.

+0

Bạn đã thử cài đặt lại php-cli chưa? Có điều gì đáng ngờ trong nhật ký lỗi không? (Bạn thậm chí có một bản ghi lỗi cho cli)? Bạn có APC? –

+0

Đối với câu hỏi của bạn, theo thứ tự: Tôi sẽ thử cài đặt lại php-cli, chưa thử; Việc ghi nhật ký được đặt ở mức tối đa và chỉ "Lỗi phân đoạn" xuất hiện trước sự cố, tôi sẽ thêm điều này vào câu lệnh của câu hỏi và không, tôi không có APC. Cảm ơn bạn thời gian :) –

+0

@ K.Steff 'thủ tục là rất dài và nhàm chán đến chết (có thể đó là lý do tại sao kịch bản là không :). - ROFL :) tuy nhiên nó có lẽ sẽ là một ý tưởng để hiển thị cho chúng tôi mã , đặc biệt vì đây là một vấn đề âm thanh lạ lùng như vậy. Hãy chắc chắn rằng bạn bao gồm mã cho cơ chế hạn chế có thể "sửa" vấn đề bằng cách hạ thấp nó, tôi nghi ngờ chìa khóa là ở đâu đó. Nếu bạn không thể đăng tất cả ở đây một cách hợp lý, hãy thử [codepad] (http://codepad.org/). Và, một cách lâu dài (IMHO) nguyên nhân phổ biến nhất của SIGSEGV là một vòng lặp vô hạn hoặc đệ quy hàm vô hạn. – DaveRandom

Trả lời

1

Một câu trả lời cho câu hỏi của riêng tôi, vì tôi đã giải quyết vấn đề này, và không có câu trả lời khác ...

tín dụng đi vào @ jap1968 cho trỏ đến tôi đến function mysqli_stmt_error (mà tôi cho rằng tôi sẽ không cần, vì tôi có error_reporting(E_ALL)).

Vấn đề là MySQL đã có một cấu hình mặc định rất lạ: đặc biệt

connect_timeout = 10 
wait_timeout = 30 

này gây ra các máy chủ MySQL để đóng kết nối chỉ sau 30 giây (mặc định là hơn một nửa giờ, theo trang web MySQL). Điều này lần lượt, gây ra các chức năng mysqli_stmt_bind_result thất bại với một lỗi phân đoạn.

+1

Bạn đã báo cáo lỗi phân đoạn trong trình gỡ lỗi PHP chưa? – hakre

+0

Thành thật mà nói tôi đã không nhận ra đó là một lỗi trong PHP. Bây giờ tôi nghĩ, nó có lẽ sẽ phản ứng theo một cách khác, vì vậy không, tôi đã không nhưng tôi sẽ tìm kiếm nó, và nếu mất tích, tôi sẽ báo cáo nó –

+0

Đó sẽ là thực sự loại yo u. Cũng có thể muốn tìm hiểu xem điều này vẫn còn segfault với một phiên bản hiện tại. Tôi chỉ chạy qua câu hỏi của bạn ngày hôm nay nếu không tôi đã nhận xét rằng đã sớm hơn. Hãy cho tôi biết nếu bạn cần trợ giúp. – hakre

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