AILapTrinh.comAI Lập Trình
Gỡ lỗi cùng AI

Chạy được trên máy mình mà lỗi trên máy chủ: quy trình so môi trường cùng AI

Vì sao mã chạy tốt ở máy mình lại hỏng khi lên máy chủ: phiên bản, biến môi trường, đường dẫn, quyền tệp, múi giờ, xuống dòng. Cách so và hỏi AI.

Developer sitting on a plastic stool at a sidewalk cafe in Hue, laptop open with blank screen, phone face down beside it, rainy street softly blurred, back to camera

Khi mã chạy tốt trên máy bạn mà hỏng trên máy chủ, gần như chắc chắn mã không đổi, môi trường mới là thứ khác. Việc của bạn là tìm ra điểm khác đó: phiên bản ngôn ngữ, thư viện, biến môi trường, đường dẫn, quyền tệp, múi giờ, hay một dịch vụ mà máy chủ không gọi tới được.

Đây là loại lỗi mà AI dễ đoán trật nhất, vì nó không thấy cả hai máy. Bài này đưa ra một quy trình so môi trường có hệ thống, danh sách những khác biệt hay gặp nhất, và cách đưa thông tin cho AI để nó suy luận trên dữ liệu thật thay vì đoán theo trường hợp phổ biến.

Vì sao loại lỗi này khó với cả người lẫn AI

Máy của lập trình viên và máy chủ thường khác nhau ở rất nhiều thứ cùng lúc: hệ điều hành, phiên bản ngôn ngữ, cách cài thư viện, người dùng chạy tiến trình, cấu hình máy chủ web, dữ liệu trong cơ sở dữ liệu. Bất kỳ điểm nào cũng có thể là nguyên nhân, và triệu chứng thường mơ hồ: trang trắng, lỗi 500, một tác vụ chạy nền lặng lẽ không làm gì.

Trên máy chủ, bạn thường không có trình gỡ lỗi, không được thêm lệnh in tuỳ tiện, và nhật ký có khi không ghi đủ. Người hỏi AI vì thế hay chỉ có một câu mô tả kiểu “lên máy chủ thì lỗi 500”. Với chừng đó thông tin, AI sẽ liệt kê một danh sách dài các khả năng chung chung, cái nào cũng có lý mà không cái nào giúp bạn đi tiếp.

Cách thoát là đổi câu hỏi. Thay vì hỏi “vì sao lỗi”, bạn đi thu thập sự khác biệt giữa hai môi trường, rồi hỏi AI “trong những khác biệt này, cái nào có thể gây ra triệu chứng này”. Câu hỏi thứ hai có dữ liệu cụ thể, và AI làm rất tốt việc suy luận trên dữ liệu cụ thể.

Mười khác biệt hay gặp nhất giữa máy mình và máy chủ

Bảng dưới liệt kê những khác biệt hay gây lỗi nhất, kèm triệu chứng thường thấy. Không phải danh sách đầy đủ, nhưng đi lần lượt qua bảng này giải quyết được phần lớn trường hợp.

Khác biệtTriệu chứng hay gặp
Phiên bản ngôn ngữ (PHP, Python, Node.js)Lỗi cú pháp ở cú pháp mới, hàm không tồn tại, cảnh báo đã bỏ
Phiên bản thư việnHàm đổi tên, tham số đổi thứ tự, kết quả trả về đổi kiểu
Thiếu phần mở rộng hoặc gói hệ thốngLỗi gọi hàm không xác định, xử lý ảnh hay mã hoá không chạy
Biến môi trường, tệp cấu hìnhKết nối nhầm cơ sở dữ liệu, khoá rỗng, chế độ gỡ lỗi bật hay tắt khác nhau
Phân biệt chữ hoa chữ thường trong tên tệpKhông tìm thấy tệp hay lớp, chỉ xảy ra trên Linux
Quyền tệp và người dùng chạy tiến trìnhKhông ghi được tệp tải lên, không tạo được thư mục đệm
Múi giờ và ngôn ngữ hệ thốngNgày lệch, sắp xếp tiếng Việt sai, định dạng số khác
Ký tự xuống dòng kiểu WindowsKịch bản Bash báo lỗi lạ, thường kèm ký tự \r
Giới hạn tài nguyênHết bộ nhớ, quá thời gian chạy, tệp tải lên quá cỡ
Mạng và tường lửaGọi dịch vụ ngoài bị treo, chứng chỉ không tin cậy, DNS không phân giải

Hai dòng đáng để ý đặc biệt với người dùng Windows và macOS: hệ thống tệp ở hai hệ điều hành này mặc định không phân biệt chữ hoa thường, còn Linux thì có. Mã gọi tệp Header.php trong khi tệp tên header.php vẫn chạy êm trên máy bạn và chỉ hỏng khi lên máy chủ Linux.

Quy trình so môi trường có hệ thống

Thay vì đoán, thu thập thông tin hai bên theo cùng một danh sách, đặt cạnh nhau rồi mới đọc. Làm một lần, lưu lại kịch bản, lần sau chỉ cần chạy lại.

  1. Tái hiện lỗi trên máy chủ và lấy nhật ký lỗi đầy đủ. Lỗi 500 trên trình duyệt chỉ là triệu chứng; nguyên nhân nằm trong nhật ký lỗi của ngôn ngữ hoặc của máy chủ web.
  2. Ghi phiên bản ngôn ngữ ở cả hai nơi, chẳng hạn php -v, python3 --version, node --version. Lưu ý máy chủ web có thể dùng bản khác với bản bạn gọi ở dòng lệnh.
  3. Xuất danh sách thư viện ở cả hai nơi: pip freeze, npm ls với độ sâu 0, composer show. So bằng lệnh diff thay vì so bằng mắt.
  4. So danh sách biến môi trường cần thiết, chỉ so tên biến và việc có giá trị hay không, không in giá trị bí mật ra màn hình.
  5. Kiểm người dùng đang chạy tiến trình và quyền của các thư mục ứng dụng cần ghi.
  6. Ghi múi giờ, ngôn ngữ hệ thống, giới hạn bộ nhớ và thời gian chạy ở cả hai nơi.
  7. Đặt hai bản thu thập cạnh nhau, đánh dấu những dòng khác.

Có thể nhờ AI viết một kịch bản Bash nhỏ thu thập các mục trên, chạy được ở cả hai máy, xuất ra tệp chữ. Yêu cầu rõ trong câu lệnh: kịch bản chỉ đọc, không sửa gì, không in giá trị của biến chứa chữ KEY, SECRET, PASSWORD. Đọc kịch bản trước khi chạy trên máy chủ, như với mọi đoạn mã AI viết.

Đưa cho AI những gì và hỏi thế nào

Khi đã có bản so, cuộc trò chuyện với AI trở nên ngắn và trúng. Dưới đây là các thứ nên dán, đã che dữ liệu, và các câu hỏi gợi ý.

  • Triệu chứng chính xác trên máy chủ và nhật ký lỗi nguyên văn, đã thay tên máy chủ, đường dẫn tuyệt đối có tên người dùng, khoá và chuỗi kết nối bằng ký hiệu.
  • Phần khác biệt giữa hai môi trường, không cần dán toàn bộ danh sách thư viện.
  • Đoạn mã liên quan tới dòng lỗi, nếu nhật ký có trỏ tới.
  • Câu hỏi: “Trong các khác biệt dưới đây, cái nào có thể gây ra lỗi này. Xếp theo khả năng, mỗi cái kèm một cách kiểm trên máy chủ chỉ bằng lệnh đọc.”
  • Câu hỏi: “Đề xuất cách tái hiện đúng môi trường máy chủ trên máy mình, ví dụ bằng một container dùng đúng phiên bản ngôn ngữ đó.”
  • Câu hỏi: “Cú pháp hoặc hàm nào trong đoạn mã này không có ở phiên bản ngôn ngữ đang chạy trên máy chủ.”

Yêu cầu cách kiểm chỉ bằng lệnh đọc là ràng buộc quan trọng. Trên máy chủ thật, bạn không muốn thử nghiệm bằng cách sửa cấu hình theo gợi ý của AI rồi xem chuyện gì xảy ra.

Ba trường hợp điển hình, ví dụ giả định

Mã dùng cú pháp mới hơn bản trên máy chủ. Máy bạn chạy PHP 8, máy chủ chạy PHP 7.4. Một đoạn dùng biểu thức match hay toán tử nullsafe chạy êm ở máy bạn, lên máy chủ báo lỗi cú pháp và cả trang trắng. Kiểm cú pháp bằng đúng phiên bản của máy chủ trước khi triển khai, và khi hỏi AI viết mã, nói rõ phiên bản đích để nó không dùng cú pháp mới.

Kịch bản Bash soạn trên Windows. Kịch bản chạy trên máy chủ báo lỗi kiểu bad interpreter hoặc lệnh không tồn tại có ký tự lạ ở cuối. Nguyên nhân là tệp lưu với kiểu xuống dòng của Windows. Đặt trình soạn thảo lưu kiểu xuống dòng Unix cho tệp kịch bản, hoặc cấu hình git chuẩn hoá xuống dòng cho loại tệp đó.

Ngày báo cáo lệch một ngày. Máy bạn đặt múi giờ Việt Nam, máy chủ đặt UTC. Đơn đặt lúc 6 giờ sáng giờ Việt Nam được ghi là 23 giờ hôm trước theo UTC, nên báo cáo theo ngày lệch. Thống nhất lưu thời gian theo UTC trong cơ sở dữ liệu và chỉ đổi sang giờ Việt Nam khi hiển thị, hoặc khai rõ múi giờ trong cấu hình ứng dụng.

Thư mục tải lên không ghi được. Trên máy bạn, mọi thứ chạy bằng tài khoản của bạn. Trên máy chủ, tiến trình web chạy bằng một người dùng khác không có quyền ghi vào thư mục đó. Sửa quyền đúng cho đúng thư mục, tránh lối tắt mở quyền ghi cho tất cả mọi người.

Thu hẹp khoảng cách để lần sau không gặp lại

Cách bền vững nhất là làm cho máy mình giống máy chủ. Container giúp chạy đúng phiên bản ngôn ngữ và phần mở rộng như máy chủ ngay trên máy cá nhân. Tệp khoá phiên bản thư viện như package-lock.json, composer.lock hay tệp khoá của công cụ quản lý gói Python đảm bảo hai nơi cài cùng bản. Tệp mẫu biến môi trường, chỉ có tên biến mà không có giá trị thật, giúp người mới biết cần khai báo những gì.

Trong tệp hướng dẫn dự án dành cho trợ lý AI, ghi rõ phiên bản ngôn ngữ và hệ điều hành của máy chủ. Nhiều công cụ đọc tệp này ở đầu mỗi phiên làm việc, nên AI sẽ tránh dùng cú pháp quá mới mà không cần bạn nhắc lại. Đây là việc làm một lần, tiết kiệm được nhiều lần sửa vặt về sau.

Cuối cùng, một bước kiểm tự động trong quy trình tích hợp liên tục chạy kiểm thử bằng đúng phiên bản của máy chủ sẽ bắt phần lớn lỗi loại này trước khi chúng lên tới khách. Với nhóm nhỏ chưa có quy trình đó, ít nhất hãy kiểm cú pháp tệp vừa sửa bằng trình thông dịch của máy chủ trước mỗi lần triển khai.

Khi thủ phạm là dữ liệu chứ không phải môi trường

Có những lần bạn so hết mười mục mà không thấy khác biệt nào đáng kể. Lúc đó nên nghĩ tới khác biệt lớn nhất mà bảng so không ghi: dữ liệu. Cơ sở dữ liệu trên máy bạn thường là bản nhỏ, sạch, do chính bạn tạo. Dữ liệu trên máy chủ là dữ liệu thật qua nhiều năm, có dòng thiếu trường, tên khách có ký tự lạ, số tiền âm do một lần nhập sai, ngày tháng ghi theo định dạng cũ trước khi đổi phần mềm.

Ví dụ giả định: trang hồ sơ khách chạy tốt với mọi tài khoản thử, nhưng hỏng với một khách ở Khánh Hòa vì trường ngày sinh của khách này còn lưu dạng chuỗi rỗng từ hệ thống cũ. Lỗi không nằm ở môi trường, cũng không hẳn ở mã mới, mà ở giả định ngầm rằng mọi dòng đều có ngày hợp lệ.

Cách xử lý là tìm đúng bản ghi gây lỗi qua nhật ký, xem cấu trúc của nó, rồi tạo một bản ghi giả có cùng hình dạng trên máy mình để tái hiện. Khi đưa cho AI, mô tả hình dạng dữ liệu, chẳng hạn trường ngày là chuỗi rỗng thay vì giá trị rỗng, chứ không dán bản ghi thật của khách.

Câu hỏi thường gặp

Lỗi 500 trên máy chủ nhưng nhật ký trống thì tìm ở đâu?

Kiểm đúng nhật ký: nhật ký lỗi của ngôn ngữ, của máy chủ web và của trình quản lý tiến trình có thể ở ba nơi khác nhau. Kiểm cấu hình xem việc ghi lỗi có đang bật không, và tiến trình có quyền ghi vào tệp nhật ký không.

Có nên bật chế độ hiển thị lỗi trên máy chủ thật để xem cho nhanh không?

Không nên. Hiển thị lỗi cho khách có thể lộ đường dẫn, cấu trúc mã, thậm chí thông tin kết nối. Ghi lỗi vào nhật ký và đọc nhật ký, hoặc tái hiện trên một máy thử có cấu hình giống máy chủ.

Container có giải quyết hết lỗi khác môi trường không?

Giải quyết được phần lớn khác biệt về phiên bản và phần mở rộng, nhưng không thay thế được dữ liệu thật, mạng thật, giới hạn tài nguyên thật. Một số lỗi chỉ lộ ra với dữ liệu lớn hoặc khi có nhiều người dùng cùng lúc.

Dán nhật ký máy chủ cho AI có an toàn không?

Chỉ an toàn sau khi đã che tên máy chủ, địa chỉ nội bộ, đường dẫn có tên người dùng, khoá, chuỗi kết nối và dữ liệu khách, và chỉ dùng công cụ được công ty cho phép. Dán phần ngắn liên quan thay vì cả tệp nhật ký.

Vì sao chạy lệnh trên dòng lệnh máy chủ thì được mà qua web thì lỗi?

Vì dòng lệnh và máy chủ web có thể dùng phiên bản ngôn ngữ khác nhau, tệp cấu hình khác nhau, người dùng khác nhau và biến môi trường khác nhau. So các thông số đó trong chính tiến trình web thay vì ở dòng lệnh.

Có nên cho tác tử AI quyền vào thẳng máy chủ để tự gỡ lỗi không?

Với máy chủ thật đang phục vụ khách thì không nên cho quyền ghi. Nếu cần, chỉ cấp quyền đọc trên một máy thử có cấu hình giống máy chủ, xem lại từng lệnh nó định chạy, và tự thực hiện thay đổi trên máy thật sau khi đã hiểu rõ.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.

hoặc
Gọi ngay 0926 138 138