2012-11-15 32 views
6

Một khách hàng của tôi đang báo cáo một vấn đề kỳ lạ với một số mã trong hệ thống Magento của họ (Magento là một nền tảng thương mại điện tử được viết bằng PHP). Tôi không có quyền truy cập trực tiếp vào hệ thống để poke xung quanh và gỡ lỗi, vì vậy tôi nghĩ rằng tôi muốn hỏi Stack Overflow nếu bạn đã từng nhìn thấy bất cứ điều gì như thế này.PHP cố gắng Tự động tải Tên Lớp Ngẫu nhiên

Các lỗi họ thỉnh thoảng nhìn thấy là

Warning: include(O1ucm02owqn3iwwcx5osz2m2.php): failed to open stream: 

Với một chồng gọi bao gồm

#0 /Users/theirusername/Sites/project/lib/Varien/Autoload.php(93): mageCoreErrorHandler(2, 'include(O1ucm02...', '/Users/theiruse...', 93, Array) 
#1 /Users/theirusername/Sites/project/lib/Varien/Autoload.php(93): Varien_Autoload::autoload() 
#2 [internal function]: Varien_Autoload->autoload('o1ucm02owqn3iww...') 
#3 [internal function]: spl_autoload_call('o1ucm02owqn3iww...') 
#4 /Users/theirusername/Sites/project/app/code/local/Theirname/Commercebug/Model/Observer.php(191): defined('Mage_Core_Block...') 

Từ đó, tôi có thể suy luận rằng PHP nghĩ nó cần phải khởi tạo một lớp có tên O1ucm02owqn3iwwcx5osz2m2. Tuy nhiên, tôi không thể tìm ra được lý do tại sao PHP có thể thực hiện việc này. Các dòng kích hoạt lỗi (# 4 trong callstack, xung quanh dòng 191 trong Observer.php) nên

if(defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS")) 
{ 
    $path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS; 
} 

Những dòng này dường như không đề cập đến bất kỳ lớp PHP tên O1ucm02owqn3iwwcx5osz2m2 (tôi nói "cần được" vì khách hàng đã tự triển khai mã, tôi đang làm việc với họ để lấy một bản sao để tìm kiếm các vấn đề tiềm ẩn).

Có ai có ý tưởng gì có thể xảy ra không? Đây có phải là một lỗi/vấn đề PHP đã biết với một số phiên bản và/hoặc có ai nhìn thấy một vấn đề như thế này với các trình nạp tự động PHP/defined/hằng số lớp không?

(Tôi đang làm việc với khách hàng của mình để xác định phiên bản PHP họ đang chạy, cũng như nhận bản sao các tệp mà họ đã triển khai để đảm bảo chúng khớp với những gì tôi cho là có.)

+1

Các tiện ích mở rộng của bên thứ ba khác mà họ đang sử dụng là gì? Họ cũng có những module PHP nào khác? Cảm thấy như một số loại tham nhũng. Họ có sử dụng APC hoặc XCache hoặc eAccelerator không? Ngoài ra, nó luôn luôn là cùng một lớp yêu cầu hoặc là nó luôn luôn là một số chuỗi vô nghĩa ngẫu nhiên? –

+2

Xảy ra khi sử dụng Zend Guard Loader bằng bất kỳ cơ hội nào? Có vẻ như quá nhiều lần trong việc thay đổi tên theo thời gian và do đó phá vỡ các kịch bản theo cách bạn mô tả – Jasper

+2

trông giống như phần mềm độc hại đối với tôi –

Trả lời

1

Hàm được định nghĩa() đóng vai trò như một lời khen cho hàm define() cho các hằng số được đặt tên. Tức là, các hằng số được khai báo với define có thể được kiểm tra độc đáo với defined.

Tuy nhiên, mã đó đang kiểm tra class constant, trong khi có thể, ít điển hình hơn. Tôi nghi ngờ rằng việc kiểm tra được kích hoạt tự động load (just as the use of class_exists can trigger autoloading.) Tuy nhiên, giá trị trao tắt đến autoloader thông qua sử dụng các định nghĩa được đọc sai (có lẽ trao khỏi hash of the z-val for the string.)

Tôi tự hỏi nếu sự thay đổi sau đây sẽ có được những điều đang làm việc:

// force PHP to load the class first, then let defined() check for the constant 
if(class_exists("Mage_Core_Block_Template") && defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS")) 
{ 
    $path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS; 
} 

Như Alan đã lưu ý trong nhận xét của mình, Zend Guard cũng có thể gây ra sự cố.

+1

+1 vì hầu hết mọi thứ bạn nói là lời khuyên chính xác và tốt, ngoại trừ "thường là hằng số trong lớp học không thay đổi ". Các kiểm tra tồn tại là có cụ thể bởi vì hằng số đã được thêm vào Magento theo thời gian và sản phẩm của tôi cần hỗ trợ các phiên bản trước có thể không có các hằng số đó. (khá chắc chắn đó là một vấn đề Zend Guard không chơi tốt đẹp với hằng số lớp trong 'định nghĩa') –

+1

Điểm hợp lệ, Alan. Tôi đã cập nhật câu trả lời cho phù hợp.Bản chất không thường xuyên của các loại kiểm tra này là những gì tôi muốn làm nổi bật như một lý do có thể khiến một lỗi như thế này có thể lẻn qua, nhưng, thực sự, ngôn ngữ của tôi ban đầu quá mạnh. – AdamJonR

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