2012-03-18 37 views
7

Tôi có một Tập lệnh PHP, nó cần thời gian thực hiện ít nhất 1000 giây để hoàn thành.Tập lệnh PHP kết thúc trước khi hết thời gian chờ mà không có lỗi

Kết thúc sau khoảng 265 giây mỗi lần không có lỗi. Vì tôi đang sử dụng vòng lặp tôi đã thử nghiệm số lần lặp lại và nó độc lập với điều đó, tiếp tục loại trừ khả năng xảy ra lỗi trong vòng lặp.

Tôi đã đặt max_execution_time thành 10800 trong php.ini và việc thay đổi memory_limit không ảnh hưởng đến kết quả.

Vui lòng trợ giúp! Tôi đã gãi đầu thật kỹ!

+1

Mã của bạn làm gì? Bạn có chắc là không có lỗi nào được ném không? Bạn đã đặt hiển thị lỗi thành E_ALL chưa? Bạn đã không loại bỏ bất kỳ lỗi nào với toán tử '@'? –

+0

Chắc chắn nó không có lỗi. Bạn có nhìn vào tệp nhật ký không? – Neysor

+1

là bạn đang chạy điều này từ một dòng lệnh, cron job, máy chủ web, khác? bạn đã thử phương pháp gọi khác chưa? – dldnh

Trả lời

0

Bạn đã kiểm tra tệp nhật ký của mình chưa? Nếu bạn gặp lỗi 6 hoặc lỗi phân đoạn. Sau đó, kịch bản của bạn là thực sự đâm php mà không hiển thị bất kỳ lỗi nào trên trình duyệt (nếu nó là trình duyệt và không phải cli).

Nếu bạn đang sử dụng apache trên Unix, bạn nên tìm nhật ký này trong /var/log/apache2/error.log.

Nếu không, bạn có thể xác định đường dẫn của tập tin log trong .htaccess bởi thêm dòng này:

php_value error_log "/path/to/somewhere/convenient/php_errors.log" 

Thay đổi đường dẫn đến nơi nào đó mà httpd của bạn có quyền ghi và nơi bạn có quyền đọc.

+1

Nhật ký lỗi mới có trống không ... – 7HUND3RX

+0

Hmm vâng tôi đoán lỗi Phân đoạn sẽ vẫn còn trong tệp nhật ký máy chủ HTTP. Vì php đã bị lỗi. Bạn đã thử tìm kiếm vào nhật ký lỗi apache? hoặc bạn đang sử dụng máy chủ HTTP nào? –

+1

Tệp nhật ký máy chủ không được cho phép trên Plesk tôi đã được cung cấp. Nhà cung cấp dịch vụ lưu trữ đã xác nhận rằng đó là do giới hạn tài nguyên tối đa được phép sử dụng bởi một tập lệnh duy nhất. Cảm ơn bạn rất nhiều vì đã dành thời gian và trợ giúp! – 7HUND3RX

0

Hãy cho:

set_time_limit(0); 

vào đầu của kịch bản. để việc thực thi mã sẽ không hết thời gian trừ khi nó được hoàn thành.

+0

Tôi nghĩ anh ấy đã nói rằng anh ấy đã loại bỏ thời gian chờ. –

+0

Không giúp được .. Không có cách nào chạy qua toàn bộ thời gian 10800 giây. – 7HUND3RX

+0

@AshishAgrawal hiển thị mã của bạn được đề cập. – mithunsatheesh

0

Lỗi này cũng xảy ra với tôi. Một trong các hàm PHP của tôi đã chết mà không có bất kỳ lỗi nào được gửi tới stderr, stdout, cũng như bất kỳ tệp nhật ký nào khác.

Điều gì đã xảy ra là tôi đang sử dụng tập lệnh trợ giúp PHP được viết bởi một số nhà phát triển khác đã đặt giới hạn bộ nhớ thành 512MB một nửa thông qua hoạt động của chương trình của tôi. Module phụ bị nhiễm độc tốt bằng cách thiết lập các thiết lập nhật ký lỗi thành im lặng tại một số điểm giữa đường thông qua việc xử lý tập lệnh của tôi.

Bạn có thể chứng minh điều này có xảy ra với bạn hay không bằng cách in ra các cài đặt hệ thống php có sẵn cho tập lệnh PHP của bạn trên MỌI lần lặp của vòng lặp. Khi các subscript đã làm các hành động bẩn, động cơ PHP ném một phù hợp sau khi thu gom rác chạy tại một điểm ngẫu nhiên trong tương lai, sau đó chết ngay lập tức mà không có lỗi. Đó là một lỗi trong bộ thu gom PHP khi các mô-đun phụ gây rối với các thiết lập hệ thống khi bộ thu gom rác đang thực hiện công việc của nó.

Giải pháp: Chỉnh sửa mô-đun trợ giúp php và đảm bảo chúng không chỉnh sửa cài đặt hệ thống, vì bộ thu gom rác đang thực hiện công việc. Các thông dịch viên PHP sẽ freak ra và chết mà không có bất kỳ lỗi hoặc đầu ra tại một khoảng thời gian ngẫu nhiên sau khi ngộ độc của các biến hệ thống PHP.

0

Mở PHP, cách duy nhất để che giấu lỗi từ các bản ghi ngay cả khi display_errorserror_reporting được chỉ định đúng là sử dụng Error Control Operators,

ví dụ: đoạn mã sau sẽ nâng cao một Fatal error nhưng một "ẩn" một, nó sẽ không xuất hiện trên nhật ký hoặc trên trình duyệt.

@echo "forgetting the last quote; 

Vì vậy, thiết lập giá trị display_errors sang On và error_reporting tùy theo phiên bản PHP bạn đang sử dụng (thấy sự khác biệt here), và kiểm tra xem bạn đang sử dụng một biểu tượng "@" trên mã của bạn.

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