2010-03-06 18 views
6

Tôi nhận được một trang web PHP lớn mà tôi sắp sửa quản lý. Nó chứa hàng trăm tệp PHP riêng biệt, nhưng tôi cho rằng chỉ có một nửa là thực sự được sử dụng. Hầu hết trong số đó có thể bị xóa.Làm cách nào để biết tệp PHP nào thực sự được sử dụng và tệp nào không?

Nhưng điều cuối cùng tôi thực sự muốn thực hiện là xem xét mã của từng tệp và kiểm tra xem liên kết của nó có được bao gồm, bắt buộc ... v.v. cho người khác hoặc cho dù nó có thể được xóa một cách an toàn.

Bạn có biết liệu có công cụ nào có khả năng thực hiện việc này không?

+0

Câu hỏi hay, hãy nhớ rằng bạn có thể không bắt tất cả các tệp. Bởi vì bạn có thể bao gồm các tệp động và các tệp được bao gồm có thể phụ thuộc vào trạng thái của các biến. – Thirler

+0

Tôi không thấy lý do tại sao câu hỏi này được đặt ở chế độ không có chủ đề, trong khi http://stackoverflow.com/questions/1811421/determining-which-php-source-files-are-not-used câu hỏi này không phải. Hơn nữa, tôi tìm thấy hầu hết các câu trả lời dưới đây hữu ích và tôi đánh dấu một trong đó làm việc cho tôi tốt nhất như là một câu trả lời. – NumberFour

+0

Hãy thử cái này cũng: http://php.net/inclued –

Trả lời

8

Hãy xem phpxref, Nó có thể làm những gì bạn cần.

Tham chiếu chéo Các lớp, hàm, biến, hằng số PHP và yêu cầu/bao gồm việc sử dụng.

+3

Điều đó sẽ không xử lý lời gọi qua ** eval **. Nó cũng sẽ không xử lý các nhóm tệp tham chiếu lẫn nhau, nhưng không có tham chiếu nào từ bên ngoài. –

0

Có nhiều cách để đạt được điều này, nhưng tất cả sẽ liên quan đến một số công việc thủ công.

Bạn có thể cài đặt và sử dụng trình gỡ rối (như Xdebug) tốt nhất có thể hiển thị cho bạn đường dẫn mà PHP di chuyển khi bạn nhấp qua chúng.

Cách khác là viết tập lệnh khớp với 'bao gồm', 'include_once', 'require', 'require_once'. Có thể kiểm tra 'eval' và 'fopen', 'file_get_contents' v.v. Đảm bảo bạn đã kiểm tra/sao lưu.

+0

Và tôi vừa nhận ra - any href = file.php cũng là một trận đấu có thể! Vì vậy, cách tiếp cận tập lệnh/grep cũng nên xem xét điều đó. – MattW

2

Có một cái nhìn tại phpdcd

phpdcd là một Chết Mã Detector (DCD) cho mã PHP. Nó quét một dự án PHP cho tất cả các hàm và phương thức đã khai báo và báo cáo các dự án đó là "mã chết" mà không được gọi ít nhất một lần.

Nhưng đừng mong đợi bất kỳ kỳ quan nào từ nó.

2

Sự cố khi phân tích mã bằng công cụ tự động là bạn có thể tìm thấy các lô tệp liên kết với nhau, nhưng lô tệp không bao giờ được sử dụng. Ngược lại, có thể có một tệp được truy cập trực tiếp, nhưng không sử dụng các tệp khác, cũng như không được bao gồm bởi bất kỳ tệp nào khác.

Thông thường những gì tôi làm, trong tuyệt vọng, là thêm ghi nhật ký vào từng tệp. Viết đơn giản __FILE__ vào tệp nhật ký khi tệp được truy cập. Điều này làm thêm chi phí trên bảng. Nhưng sau một khoảng thời gian nhất định, bạn có danh sách các tệp của bạn thực sự được truy cập và sử dụng.

Bạn cũng có thể phân tích tệp nhật ký một cách thường xuyên và xóa nhật ký khỏi các tệp bạn biết được sử dụng, giảm chi phí khi bạn thực hiện. Cuối cùng, bạn có thể tìm kiếm các tệp vẫn có mã đăng nhập của bạn để xem những tệp nào chưa được sử dụng.

+0

Phạm vi kiểm tra về cơ bản sẽ thêm tất cả ghi nhật ký này cho bạn. Tự động. Xem câu trả lời của tôi. –

0

Bạn có thể sử dụng __construct methode và ghi nhật ký nếu nó được sử dụng. Bạn không thể đặt __construct methode sau khi tạo một cá thể. Vì vậy, thêm chúng theo cách thủ công;

class Someclass{ 
private $clsName; 
public function __construct(){ 
$this->clsName = get_class($this); 
YourStaticLogger::yourlogFunction("whatever you want to log" . $this->clsName); 
} 
//other things 
} 

Bạn chỉ có thể theo dõi các lớp được gọi. Đó là những gì tôi sẽ làm.

+0

Đây là câu trả lời giống như "thêm ghi nhật ký vào từng tệp". –

+0

tốt đẹp nhưng nó sẽ không hoạt động cho các lớp trừu tượng và các lớp cha được mở rộng bởi các lớp con vì lớp con sẽ ghi đè lên __construct methode của lớp cha và sẽ chỉ có một __construct chạy cho mỗi cá thể. – eyurdakul

1

Nếu bạn sử dụng công cụ phủ sóng thử nghiệm, nó sẽ cho biết công cụ nào được sử dụng chắc chắn, cho bất kỳ chức năng nào của phần mềm bạn đã thực hiện.(Rõ ràng, càng có nhiều bạn tập thể dục phần mềm, phần mềm càng được thực hiện bởi phần không chết.). Điều này bao gồm bất kỳ tệp nào có thể truy cập thông qua liên kết html bên ngoài; tất nhiên, bạn phải tập thể dục liên kết đó vì nó là một phần của chức năng ứng dụng của bạn.

Sau đó, bạn có thể kiểm tra những nội dung được nói không được sử dụng để quyết định trường hợp thực sự là gì.

SD PHP Test Coverage tool của chúng tôi sẽ chấp nhận danh sách tất cả các tệp bạn muốn kiểm tra và cho phép bạn dễ dàng thu thập dữ liệu kiểm tra đó. Nó cung cấp một báo cáo tóm tắt cho thấy các tập tin có bất kỳ bảo hiểm nào cả; những người có bảo hiểm 0% là những người có khả năng đã chết.

+0

Nó có bao gồm các tập lệnh PHP được bao gồm không? Điều gì về những người được gọi thông qua một hành động AJAX? Tôi lấy nó để tìm mã chết trong một tập lệnh cụ thể, sử dụng một công cụ như một @Pekka hoặc @gordon được đề xuất sẽ thích hợp hơn sau đó. – Eldros

+0

@Eldros: Việc tập lệnh được gọi (bao gồm, thông qua AJAX) không quan trọng. Công cụ được đặt trong một tệp trong danh sách dự án, sẽ thông báo nếu tập lệnh được gọi và cũng sẽ thông báo sự vắng mặt * của lời gọi của tập lệnh. –

+0

@Eldros: Cái gọi là công cụ "phân tích tĩnh" để xác định câu trả lời bằng cách kiểm tra chỉ mã nguồn không có khả năng chính xác. Người ta có thể lắp ráp một tên phương thức tại thời gian chạy và sử dụng eval để gọi nó; rất ít kỹ thuật phân tích tĩnh (không kể đến các kỹ thuật cụ thể được liệt kê bởi những người khác dưới dạng câu trả lời) có thể xác định điều này; để họ có thể nói với bạn điều gì đó không được sử dụng ngay cả khi nó thực thi thường xuyên; họ có thể cho bạn biết một cái gì đó được sử dụng ngay cả khi nó không bao giờ thực hiện. Ngược lại, công cụ kiểm tra sẽ luôn cho bạn biết chính xác nếu có gì đó * được sử dụng * như được chứng minh bằng cách thực hiện. –

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