2009-05-04 25 views
5

Gần đây, chúng tôi đã bật APC trên các máy chủ của chúng tôi và đôi khi chúng tôi xuất bản mã mới hoặc thay đổi chúng tôi phát hiện ra rằng các tệp nguồn đã bị thay đổi bắt đầu ném lỗi không được phản ánh trong mã, thường phân tích cú pháp lỗi mô tả mã thông báo không tồn tại. Chúng tôi đã xác minh điều này bằng cách chạy php -l trên các tệp mà nhật ký lỗi nói bị ảnh hưởng. Thông thường, việc tái xuất bản sẽ khắc phục sự cố. Chúng tôi đang sử dụng PHP 5.2.0 và APC 3.01.9. Câu hỏi của tôi là, có ai khác đã gặp phải vấn đề này hay không ai có thể nhận ra vấn đề của chúng ta là gì? Nếu vậy, làm thế nào bạn sửa chữa nó hoặc làm thế nào chúng ta có thể sửa chữa nó?Các vấn đề với APC về xuất bản

Chỉnh sửa: Tôi có lẽ nên thêm một số chi tiết về quy trình xuất bản của chúng tôi. Nội dung đang được đẩy đến các máy chủ sản xuất thông qua rsync từ một máy chủ dàn dựng. Chúng tôi đã bật apc.stat_ctime vì tính năng này giúp mọi thứ hoạt động trơn tru hơn với rsync. apc.write_lock được bật theo mặc định và chúng tôi chưa tắt tính năng này. Ditto cho apc.file_update_protection.

+1

APC là gì (tất cả các APC mà tôi có thể nghĩ là không có ý nghĩa trong ngữ cảnh này)? –

+1

Brian, đó là một bộ nhớ cache opcode để tăng tốc độ thực thi PHP. Tôi đặt một liên kết đến nó trong văn bản câu hỏi nếu bạn muốn biết thêm. –

+0

lộn xộn! điều này cũng xảy ra khi sao chép tệp cục bộ thay vì rsyncing chúng? – stefs

Trả lời

7

Âm thanh như một tệp được xuất bản một phần đang được đọc và được lưu vào bộ nhớ cache dưới dạng bị hỏng. apc.file_update_protection được thiết kế để giúp ngăn chặn điều này.

trong php.ini: apc.file_update_protection integer

apc.file_update_protection thiết đặt một sự chậm trễ trên bộ nhớ đệm thương hiệu mới tập tin. Giá trị mặc định là 2 giây, trong đó có nghĩa là nếu sửa đổi dấu thời gian (mtime) trên tệp cho biết thì chưa đến 2 giây khi truy cập , nó sẽ không được lưu trong bộ nhớ cache. Người không may đã truy cập tệp được viết một nửa này sẽ vẫn thấy sự kỳ quặc, nhưng ít nhất nó sẽ không còn .

Sau câu hỏi đang được chỉnh sửa: Một lý do tôi không thấy các loại sự cố này là tôi đẩy toàn bộ bản sao mới của trang web (với xuất SVN). Chỉ sau khi được hoàn thành đầy đủ nó có thể được hiển thị cho Apache/Mod_php (xem câu trả lời của tôi How to get started deploying PHP applications from a subversion repository?)

Điều khác có thể xảy ra, là nếu bạn đang cập nhật tại chỗ, bạn có thể đang cập nhật các tệp phụ thuộc vào những người khác chưa được tải lên. Rsync chỉ có thể đảm bảo cập nhật nguyên tử cho các tệp riêng lẻ, không phải toàn bộ bộ sưu tập đang được thay đổi/tải lên. Một lý do khác mà tôi nghĩ rằng để tải lên trang web en-mass, và chỉ sau đó đưa vào sử dụng.

0

Không bao giờ thấy trước đó, ngay cả khi tôi là người dùng lớn của APC. Có thể thử kích hoạt tập lệnh làm trống mã APC mỗi khi bạn gửi mã mới trên máy chủ?

0

Khi bạn nhận được tệp có lỗi phân tích cú pháp, hãy sao lưu tệp, sau đó gửi lại. Thực hiện cùng một tệp mà bây giờ hoạt động và thực hiện một sự khác biệt đối với tệp có lỗi phân tích cú pháp.

4

Có vẻ như APC không định dạng trước hoặc nhận được thông tin stat tệp chính xác. Bạn có thể kiểm tra để đảm bảo cấu hình APC apc.stat được đặt chính xác. Một điều khác bạn có thể làm là buộc bộ nhớ cache xóa với apc_clear_cache() khi bạn xuất bản mã mới.

0

ctime nghĩa là thời gian tạo. Bạn sẽ muốn xóa toàn bộ bộ nhớ cache của mình theo cách thủ công mỗi khi bạn cập nhật.

Bạn có thể dễ dàng thực hiện việc này bằng cách đặt tập lệnh apc.php ở đâu đó trên máy chủ của bạn. Kịch bản này cung cấp cho bạn số liệu thống kê bộ nhớ cache và sẽ cho phép bạn xóa toàn bộ bộ nhớ cache.

Tập lệnh đi kèm với APC.

Hopet mình giúp, Evert

0

Đây có thể xảy ra bởi vì có sự không phù hợp giữa mã của bạn, và các phiên bản cache của mã này.

Ví dụ: APC có phiên bản User.php được lưu trong bộ nhớ cache nhưng bạn đã thực hiện thay đổi đối với User.php hoặc dữ liệu mà Người dùng sử dụng. Phiên bản được lưu trong bộ nhớ cache vẫn chạy ngay cả sau khi triển khai của bạn, vì nó chưa hết hạn.

Nếu bạn xóa mục nhập bộ nhớ cache APC khi triển khai, sự cố này sẽ biến mất.

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