2012-06-28 21 views
7

Tôi có một trang web có tập lệnh tùy chỉnh chạy trên dịch vụ lưu trữ VPS. Tất cả các kịch bản đi ra ngoài thông qua index.php sử dụng mod_rewrite và .htaccess cho các URL thân thiệnLàm thế nào để theo dõi kịch bản PHP chạy một quy trình nhất định?

Something trong kịch bản của tôi được tạo ra sử dụng CPU cao, như hiển thị: CPU usage

Khi tôi đi và strace một quá trình nhất định tôi nhận được điều này mà tôi không hiểu:

setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={90, 0}}, NULL) = 0 
    rt_sigaction(SIGPROF, {0x7a6b8f, [PROF], SA_RESTORER|SA_RESTART, 0x2af8ae8742f0}, {0x7a6b8f, [PROF], SA_RESTORER|SA_RESTART, 0x2af8ae8742f0}, 8) = 0 
    rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0 

Điều này được lặp lại liên tục trong một vòng lặp vô hạn.

Điều tôi cần biết là cách theo dõi tập lệnh PHP chính xác gây ra sự cố này. Bất kỳ đề xuất?

+1

Bật ghi nhật ký lỗi. Đặt thời gian thực hiện tối đa. Hãy nhìn vào nhật ký lỗi mà kịch bản không hoạt động. Có thể tạo trình xử lý lỗi của riêng bạn có thể đổ chi tiết yêu cầu trong trường hợp lỗi thời gian chờ được kích hoạt, vì vậy bạn có thể bắt đầu tái tạo điều này bằng trình gỡ lỗi từ xa. – hakre

+0

Bạn đang sử dụng API nào? CGI? – hakre

Trả lời

2

Sử dụng hàm getmypid() trong tập lệnh của bạn. Chỉ cần xuất tệp này vào tệp nhật ký hoặc thứ gì đó để xem tập lệnh nào.

EDIT: Sử dụng các thiết lập auto_prepend_file cấu hình để tự động bao gồm đoạn này trong tất cả các file của bạn:

php_value auto_prepend_file append.php 
+0

Vấn đề là anh ta không biết kịch bản nào là ... – Josh

+0

Tất nhiên là không. Tôi giả sử anh ta đang cố gắng tìm ra điều này bằng cách gỡ lỗi các kịch bản của mình. Anh ta không nói rằng anh ta không thể chỉnh sửa kịch bản của mình. Tôi đề nghị OP chỉnh sửa các kịch bản của mình để lưu ý những gì PID từng kịch bản được sử dụng để giúp đỡ trong nỗ lực truy tìm của mình. – davidethell

+1

Vì vậy, bạn đang đề nghị anh ấy thêm nó vào mọi tệp PHP? ĐƯỢC. Tôi nghĩ tôi hiểu ý anh là gì. Nếu anh ta làm cho mỗi bản ghi script '__FILE__' * và *' getmypid() 'thì đây là một câu trả lời hợp lệ. – Josh

6

Nếu bạn có thể nhận the PECL proctitle package vào PHP của bạn cài đặt, bạn có thể sử dụng để làm cho index.php set title quá trình của nó vào tên của tập lệnh mà nó được gửi đến. (Tiêu đề quá trình thay đổi có thể hoặc không thể hiển thị trong các bộ hiển thị bảng quá trình cụ thể; sử dụng ps nếu tất cả các lỗi khác không thành công.)

+1

Rất hay: D tìm hiểu điều gì đó mới mẻ mỗi ngày. – Leigh

+0

Đó là một thủ thuật tiện lợi! Tôi sẽ cần nhớ điều đó. – Josh

+0

@chaos làm thế nào để tôi biết nếu điều đó có sẵn trên máy chủ của tôi? nếu không, làm thế nào để tôi cài đặt nó, và nếu nó được cài đặt .. làm thế nào để tôi sử dụng nó? –

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