2010-01-18 20 views
7

Tôi có một tập lệnh PHP dường như ngừng chạy sau khoảng 20 phút.Tập lệnh PHP ngừng chạy tùy ý mà không có lỗi nào

Để cố gắng tìm ra lý do tại sao, tôi đã tạo một kịch bản rất đơn giản để xem nó sẽ chạy bao lâu mà không có bất kỳ mã phức tạp nào gây nhầm lẫn cho tôi.

Tôi thấy rằng cùng một điều đã xảy ra với vòng lặp vô hạn đơn giản này. Tại một số điểm giữa 15 và 25 phút chạy, nó dừng lại mà không có bất kỳ thông báo hoặc lỗi nào. Trình duyệt nói "Xong".

Tôi đã ở trên tất cả mọi thứ có thể duy nhất tôi có thể nghĩ:

set_time_limit (session.gc_maxlifetime in the php.ini) 
memory_limit 
max_execution_time 

Điểm rằng kịch bản được dừng lại là không phù hợp. Đôi khi nó sẽ dừng lại ở 15 phút, đôi khi 22 phút.

Xin vui lòng, mọi trợ giúp sẽ được đánh giá cao.

Nó được lưu trữ trên máy chủ 1and1. Tôi liên lạc với họ và họ không cung cấp hỗ trợ cho các lỗi gây ra bởi các nhà phát triển.

+0

Bạn có thể để đẻ trứng một quá trình riêng biệt sử dụng 'exec()'. Cố gắng giữ một tập lệnh chạy trong hơn 30 phút bằng cách gọi trình duyệt trực tiếp là sự điên rồ thuần túy. –

+0

Bạn có quyền truy cập vào lỗi và truy cập nhật ký từ máy chủ không? Họ có thể cung cấp cho bạn thêm thông tin về những gì đang xảy ra trong trường hợp này. Ngoài ra - bạn có thể tái tạo sự cố cục bộ không? Điều đó có thể cung cấp cho bạn một số tùy chọn khác như xa như gỡ lỗi đi. – objectified

+0

Không, tôi không có quyền truy cập vào nhật ký. Đó là một điều khiến tôi phát điên. Tôi đã tạo một tệp csv đăng nhập lỗi PHP tùy chỉnh, nhưng không có lỗi PHP hữu ích: -/ Tôi chưa thử nghiệm nó cục bộ vì phải mất nhiều thời gian để tìm hiểu. Tôi hình dung nếu nó chạy đúng, thì đó là một số thiết lập máy chủ tối nghĩa mà tôi không biết, hoặc nếu nó dừng lại, thì đó là một số vấn đề trình duyệt tối nghĩa mà tôi không biết. Dù bằng cách nào nó cũng không giúp được gì nhiều. Tôi sắp thử lời khuyên của James ở trên, mặc dù, điều đó có vẻ hữu ích. Bất kỳ ý tưởng nào khác mặc dù trong thời gian chờ đợi? – RobHardgood

Trả lời

0

Tôi đánh giá cao nhận xét của mọi người. Đặc biệt là James Hartig, bạn đã rất hữu ích và gửi cho tôi trên con đường bên phải. Tôi vẫn không biết vấn đề là gì. Tôi đã nhận nó để chạy trên máy chủ bằng cách sử dụng SSH, chỉ bằng cách sử dụng lệnh exec() cũng như ignore_user_abort(). Nhưng nó vẫn sẽ hết thời gian. Vì vậy, tôi chỉ phải chia nhỏ thành những phần nhỏ sẽ chạy trong khoảng 2 phút và sử dụng các biến/mảng phiên để lưu trữ nơi tôi đã dừng lại. Tôi rất vui khi được thực hiện với dự án khá đơn giản này ngay bây giờ và tôi cực kỳ tức giận với 1and1. Oh well ...

+1

Vâng, bạn nhận được những gì bạn phải trả cho. 1 & 1 là giá rẻ vì nó hút. –

3

Tại thời điểm nào đó, trình duyệt của bạn hết thời gian chờ và ngừng tải trang. Nếu bạn muốn kiểm tra, hãy mở dòng lệnh và chạy mã trong đó. Tập lệnh sẽ chạy vô thời hạn.

+0

Đó là những gì tôi đang nghĩ! Không có cách nào để ngăn trình duyệt thực hiện điều đó? Và tô màu cho tôi một chút, nhưng gói hosting 1and1 của tôi là rẻ nhất mà không hỗ trợ SSH ... và theo như tôi biết, đó là cách duy nhất để truy cập php thông qua dòng lệnh, phải không? – RobHardgood

+0

Vâng, đó là cơ bản là cách duy nhất. Tôi có thể hỏi tại sao bạn muốn tải vô thời hạn? Hầu hết các trình duyệt (bên cạnh thiết bị di động) sẽ ổn khi bạn liên tục gửi dữ liệu cho chúng. –

+0

Vòng lặp vô hạn của tôi chỉ để thử nghiệm. Kịch bản tôi đang thực sự cố gắng sửa chữa các nhu cầu chạy trong khoảng 30 hoặc 40 phút, nhưng nó vẫn dừng lại sau 20. Tôi đã cố gắng tìm ra lý do tại sao với kịch bản này. Nó lặp lại một đoạn văn bản ngắn sau mỗi vài giây. Đó không phải là loại dữ liệu mà trình duyệt cần để giữ phiên mở? – RobHardgood

3

có bạn xem là đơn giản chạy script từ dòng lệnh, ví dụ:

php script.php 

và có kịch bản tuôn ra một thông điệp tất cả vì vậy thường xuyên đến nỗi nó vẫn chạy:

<?php 

while (true) { 
    doWork(); 
    echo "still alive..."; 
    flush(); 
} 
+0

Tôi đang cố gắng này ngay bây giờ ... Cảm ơn – RobHardgood

+0

Vâng, điều này đã không hoạt động hoặc – RobHardgood

+0

Hãy thử tăng thời gian thực hiện tối đa của bạn bằng cách sử dụng ini_set ini_set ('max_execution_time', 300); // 5min – AndrewMurphy

1

Tôi nghĩ những gì bạn cần phải tìm ra là thời gian chính xác mà nó dừng lại (bạn có thể thiết lập một thời gian ban đầu và tiếp tục bán phá giá trong thời gian hiện tại trừ đi ban đầu). Có điều gì đó ở phía máy chủ đang dừng tệp. Ngoài ra, hãy cân nhắc thực hiện kiểm tra để đảm bảo thời gian thực hiện là 0. Nếu bạn muốn, hãy đặt giới hạn thời gian thành 30 và sau đó là MỌI vòng lặp bạn thực hiện, tiếp tục đặt ở mức 30. Mỗi lần bạn gọi set_time_limit, số lượt truy cập đặt lại và điều này có thể cho phép bạn bỏ qua các giới hạn thực tế. Nếu điều này vẫn không hoạt động, có điều gì đó trên máy chủ của 1and1 có thể giết chết tập lệnh.

Ngoài ra, bạn đã thử ignore_user_abort chưa?

0

Tôi nghĩ điều này là do một số quá trình theo dõi giết chết "quy trình zombie" để cho phép tài nguyên cho người dùng khác.

Chạy toán tử bằng cách sử dụng "2> & 1" để ghi nhật ký mọi thứ, bao gồm cả tiêu chuẩn.

Trong đầu ra của tôi, tôi cố gắng bắt này:

... 
script.sh: line 4: 15932 Killed     php5-cli -d max_execution_time=0 -d memory_limit=128M myscript.php 

Vì vậy, một cái gì đó (một lực lượng bên ngoài, không biết PHP chính nó) là giết chết quá trình của tôi!

Tôi sử dụng IdWebSpace là tuyệt vời BTW nhưng tôi nghĩ rằng hầu hết các nhà cung cấp lưu trữ chia sẻ áp đặt cơ chế kiểm soát tài nguyên/quy trình này chỉ để được lành mạnh.

2

trong những trường hợp như vậy, tôi bật tất cả các cài đặt phát triển trong php.ini, tất nhiên trên máy chủ phát triển. Điều này hiển thị nhiều thông báo hơn, bao gồm cảnh báo không dùng nữa.

Theo kinh nghiệm của tôi về gỡ lỗi dài chạy script php, nguyên nhân phổ biến nhất là thất bại cấp phát bộ nhớ (Fatal error: Được phép kích thước bộ nhớ của byte xxxx kiệt sức ...)

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