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.
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? –
Đố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 :) –
@ 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