2012-06-29 36 views
5

Đây không phải là một trong những câu hỏi thường gặp nếu giấc ngủ được tính cho thời gian chờ hoặc các nội dung tương tự. Ok, đây là vấn đề: Tôi đã đặt max_execution_time cho PHP là 15 giây và lý tưởng là điều này sẽ hết thời gian khi vượt qua giới hạn đã đặt, nhưng không. Apache đã được khởi động lại sau khi thay đổi tệp php.ini và một ini_get ('max_execution_time') là tất cả đều ổn. Đôi khi, tập lệnh chạy tối đa 200 giây, điều này thật điên rồ. Tôi không có giao tiếp cơ sở dữ liệu nào cả. Tất cả các kịch bản hiện đang tìm kiếm các tập tin trên hệ thống tập tin Unix và trong một số trường hợp chuyển hướng lại đến một trang JSP khác. Không có sleep() trên script.PHP max_execution_time không định thời gian ra

tôi tính toán tổng thời gian thực hiện của kịch bản PHP như thế này:

Vào lúc bắt đầu của kịch bản tôi đặt:

$_mtime = microtime(); 
$_mtime = explode(" ",$_mtime); 
$_mtime = $_mtime[1] + $_mtime[0]; 
$_gStartTime = $_mtime; 

và thời gian kết thúc ($ _ gEndTime) được tính tương tự.
Tổng thời gian được tính trong một chức năng tắt máy mà tôi đã đăng ký:

register_shutdown_function('shutdown'); 
............. 
function shutdown() 
{ 
    .............. 
    .............. 
    $_total_time = $_gEndTime - $_gStartTime; 
    .............. 
    switch (connection_status()) 
    { 
    case CONNECTION_NORMAL: 
     .... 
     break; 
     .... 
    case CONNECTION_TIMEOUT: 
     .... 
     break; 
     ...... 
    } 
} 

Lưu ý: Tôi không thể sử dụng $ _SERVER [ 'REQUEST_TIME'] vì phiên bản PHP của tôi là không tương thích. Điều đó thật tệ - tôi biết.

1) Vâng, câu hỏi đầu tiên của tôi rõ ràng là tại sao kịch bản PHP của tôi thực thi ngay cả sau khi giới hạn thời gian chờ đã đặt?
2) Apache có chỉ thị Thời gian chờ là 300 giây nhưng nhị phân PHP không đọc cấu hình Apache và điều này không phải là vấn đề.
3) Có khả năng có gì đó đang gửi PHP vào chế độ ngủ không?
4) Tôi có tính thời gian thực hiện sai không? Có cách nào tốt hơn để làm điều này?


Tôi bị bối rối vào thời điểm này. PHP Wizards - xin vui lòng giúp đỡ.

Chỉnh sửa: Tôi vừa phát hiện ra rằng các hoạt động của luồng không phải là nguyên nhân với một vài nhật ký. Độ trễ chỉ là ngẫu nhiên trong tập lệnh ngay cả khi không có hoạt động truyền trực tuyến nào được thực hiện. Chuyển ngữ cảnh có thể chỉ là lý do. Nhưng tôi vẫn không có câu trả lời rõ ràng. Tôi nhìn lên Real max_execution_time for PHP on linux nhưng Im không chắc chắn tôi muốn thử điều đó. Bất cứ một đề nghị nào khác?

+0

Tôi tin rằng các hoạt động của hệ thống tệp cũng không được tính trong các phép tính giới hạn thời gian. – lonesomeday

+1

Bạn biết đấy, bạn có thể sử dụng 'microtime (true)' để lấy lại 'float' ngay lập tức ... – deceze

+0

@lonesomeday: Bạn có chắc chắn về điều đó không? –

Trả lời

7

max_execution_time chỉ giới hạn kịch bản thời gian thực hiện bản thân - thời gian cpu của kịch bản của bạn. nếu bối cảnh hệ điều hành chuyển sang một quy trình khác và dành thời gian ở đó, nó cũng sẽ không được tính. Vì vậy, đo lường thời gian thực thế giới và mong đợi một thời gian chờ sau 30 giây sẽ không đúng bất kỳ thời điểm nào. Và tất nhiên, nó không quan tâm đến bất kỳ system, exec hoặc thời gian mạng cũng

+2

Thật vậy .. Ngay cả khi chờ truy vấn DB hoặc xử lý luồng dữ liệu bị bỏ sót khỏi phương trình – Johan

+0

đúng, quên đề cập đến công cụ db;) cảm ơn bạn! – poncha

+0

Tôi không có bất kỳ hệ thống nào, các cuộc gọi exec cũng không phải tôi gọi bất kỳ mã bên ngoài nào. Các hoạt động của hệ thống tệp có được tính trong giới hạn max_execution_time không? Giả sử, một fopen() –

0

Nếu bạn cần để thời gian chờ sau một thời gian nhất định (theo ý kiến) tại sao không gọi

$startscript = microtime(); 

//do some stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 


    // do more stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 

    // do more stuff 

if (microtime() - $startscript > 1500) 
{ 
    dotimeout(); 
} 

Bạn nhận được các jist. Không phải là rất đẹp nhưng có thể làm việc.

+0

Điều này có thể hoạt động khi tôi biết nơi nào sự chậm trễ nhất định xảy ra. Nhưng trong trường hợp của tôi, sự chậm trễ là ngẫu nhiên. Vì vậy, ví dụ: nếu séc đầu tiên được chuyển và microtime() - $ startcript là bất kỳ giá trị nào <1500 và nếu sự chậm trễ xảy ra ngay trước khi kiểm tra lần thứ hai được gọi, thì lại là cùng một câu chuyện. Dù sao cũng cảm ơn bạn...! –

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