2011-01-01 10 views
20

Kể từ khi tôi cài đặt APC cho PHP với PECL tôi nhận được đôi khi các lỗi này: Cannot redeclare class xxxPHP với APC: lỗi Fatal: Không thể redeclare lớp

xxx thay đổi bất cứ lúc nào. Tôi có thể vô hiệu hóa APC nhưng APC cải thiện hiệu suất tuyệt vời! Có một lỗi đã biết hoặc tôi có thể làm điều gì đó khác để ngăn chặn các lỗi này không? Tôi đang sử dụng Ubuntu 8.04 LTS với PHP 5.2.4.


Edit/Cập nhật (từ bình luận):

tôi sử dụng Zend Framework Autoloader và những lỗi không bao giờ xảy ra trước khi tôi kích hoạt APC. Một vài phút trước, tôi nhận được ví dụ rằng lỗi: Fatal error: require(): Cannot redeclare class zend_db_adapter_abstract in /paths/app/lib/Zend/Db/Select.php on line 27

+1

đọc được thông báo lỗi nói chung. Không bao gồm tệp đã nói hai lần. Sử dụng 'include_once'. Hoặc thất bại, bọc tất cả các định nghĩa trong 'if (! Class_defined (" xxx ")) {' – mario

+0

Ngoài việc chỉ sử dụng include_once, hãy thử và kiến ​​trúc lại ứng dụng để sử dụng tính năng tự động nạp lớp, để PHP sẽ chỉ bao gồm các tệp Khi cần thiết. Đồng thời gắn với những thứ thông thường, như một lớp cho mỗi tệp, v.v. – Rob

+1

ý của bạn là gì với xxx? xxx thực sự là lớp bạn muốn tải? –

Trả lời

1

Vâng, đây là một vấn đề đã biết với apc rằng nó kết hợp lên include_once directivse được gọi là tương đối từ các vị trí khác nhau.

Vì vậy, nếu bạn làm include_once myclass.php và sau đó trong thư mục con làm include_once ../myclass.php apc có thể kết hợp và nghĩ các tệp khác nhau của nó và tải tệp đó hai lần.

Tuy nhiên điều này được khắc phục trong các phiên bản sau.

Nếu bạn có thể xem chi tiết mã của mình cho lớp được tải hai lần, bạn có thể kiểm tra xem lớp học đã được tải với class_defined hoặc một số nội dung có thể gọi hay không.

Bạn cũng có thể sử dụng chỉ thị apc.filter để ngăn chặn một số tệp nhất định khỏi việc lưu giữ ong.

+0

Xem nhận xét của tôi ở trên. – Poru

+0

cũng vấn đề vẫn như cũ. nâng cấp phiên bản apc của bạn và/hoặc khung công tác zend hoặc bạn phải vá khuôn khổ zend của bạn, có các giải pháp có sẵn trên trình theo dõi vấn đề zend hoặc bạn có thể bắt ngoại lệ trong ứng dụng của bạn. –

2

Hmmm, có vẻ là một common issue:

Những gì tôi chỉ nhận thấy từ thông báo lỗi cụ thể của bạn là bạn đã viết zend_db_adapter_abstract trong tất cả các- chữ thường. Một vấn đề với các lược đồ đặt tên khung và các trình nạp tự động đáng lo ngại là chúng giữ các tệp trong trường hợp hỗn hợp và mong đợi nó như vậy. Nếu mã của bạn đã cố gắng khởi tạo theo cách này, trình tải tự động có thể không tìm thấy nó. APC có thể đặc biệt hơn ở đây vì nó ghi đè include_once nội bộ, có thể có tác dụng phụ.

Giải pháp sẽ là điều chỉnh bộ nạp tự động Zend và lưu danh sách các tên tệp được tải xuống và (tên tuyệt đối và được rút gọn) để kiểm tra bằng chứng thay cho include_once.

Nếu không, hãy thử xdebug-ing quá mức. Nếu không có quyền truy cập vào thiết lập của bạn, tất cả những gì chúng tôi có thể làm là đoán ở đây.

12

Tôi đã gặp vấn đề tương tự với một loạt thư viện PHP ngay sau khi tôi bật APC. Sau khi rất nhiều tóc kéo tôi thấy rằng thiết lập apc.include_once_override = 0 xóa mọi thứ. Vẫn đang theo dõi nhưng chưa có sự cố xảy ra (trước đó tôi có thể gây ra lỗi bằng cách xóa bộ nhớ cache apc).

12

Sự kết hợp của configs sau cố định nó cho tôi:

apc.include_once_override = 0 
apc.canonicalize = 0 
apc.stat = 0 

Nếu không có tất cả 3, tôi liên tục nhận được lỗi, nhưng với cả ba tôi dường như không còn nhận được lỗi :) !

+0

Ba điều này không làm việc cho tôi không may (APC 3.1.13 và PHP 5.4.24 CentOS 6.5). Với WordPress nó là lớp Walker_Page mà nó tuyên bố đang được redeclared, mặc dù các tập tin là hoàn toàn không được gọi lên nhiều hơn một lần. Tôi sẽ đào sâu hơn và xem những gì tôi có thể tìm thấy. – Jason

+0

Xin lỗi Jason, điều này đã làm việc với một số phiên bản cũ hơn của APC và PHP. Tôi biết chắc chắn rằng phiên bản PHP mà tôi đang làm việc tại thời điểm đó không có phiên bản mới hơn 5.3. * – Peter

3

Lỗi này xảy ra khi sử dụng số AWS SDK của Amazon cho PHP2 trong tập lệnh php chạy dưới cron. Một giải pháp là để vô hiệu hóa apc qua -d apc.enabled=0 như hình dưới đây:

/usr/bin/php -d apc.enabled=0 /path/to/myshelljob.php 

Đối more info.