2009-07-24 39 views
12

Hi là có một khả năng để thiết lập thời gian giới hạn chỉ với một lệnh hoặc chỉ để một chức năng ví dụ:Giới hạn thời gian thực hiện của một hàm hay lệnh PHP

function doSomething() 
{ 
    //..code here.. 

    function1(); 

    //.. some code here.. 

} 

Tôi muốn thiết lập giới hạn thời gian chỉ để Function1.

Có lối thoát set_time_limit nhưng tôi nghĩ điều này đặt giới hạn thời gian cho toàn bộ tập lệnh. Bất kỳ ai có ý tưởng nào?

+0

Bạn muốn điều gì xảy ra nếu bộ hẹn giờ hết hạn trong khi chức năng 1 vẫn đang chạy? – tialaramex

Trả lời

18

set_time_limit() chạy trên toàn cầu, nhưng nó có thể được thiết lập lại cục bộ.

Đặt số giây mà tập lệnh được phép chạy. Nếu đạt được điều này, tập lệnh sẽ trả về lỗi nghiêm trọng. Giới hạn mặc định là 30 giây hoặc nếu tồn tại , giá trị max_execution_time được xác định trong tệp php.ini.

Khi được gọi, set_time_limit() khởi động lại bộ đếm thời gian chờ từ 0. Trong các từ khác, nếu thời gian chờ là 30 giây mặc định và 25 giây vào thực thi tập lệnh, chẳng hạn như set_time_limit (20), kịch bản sẽ chạy trong tổng số 45 giây trước khi hết giờ.

tôi đã không kiểm tra nó, nhưng bạn có thể thiết lập nó tại địa phương, thiết lập lại khi bạn rời khỏi

<?php 
set_time_limit(0); // global setting 

function doStuff() 
{ 
    set_time_limit(10); // limit this function 
    // stuff 
    set_time_limit(10); // give ourselves another 10 seconds if we want 
    // stuff 
    set_time_limit(0); // the rest of the file can run forever 
} 

// .... 
sleep(900); 
// .... 
doStuff(); // only has 10 secs to run 
// .... 
sleep(900); 
// .... 

set_time_limit() ... Bất kỳ thời gian dành cho hoạt động xảy ra bên ngoài thực hiện của tập lệnh, chẳng hạn như các cuộc gọi hệ thống sử dụng hệ thống(), hoạt động luồng, truy vấn cơ sở dữ liệu, v.v. không được bao gồm khi xác định thời gian tối đa mà tập lệnh đã chạy. Điều này không đúng trên Windows, nơi thời gian đo được là có thật.

+3

Rất đẹp! thanx! nhưng nó sẽ trả về một lỗi nghiêm trọng nếu các tiêu chí thời gian không được đáp ứng. Có cách nào để tránh điều đó không. – Granit

+0

Không thể dừng lỗi nghiêm trọng - vì đó là thời gian chờ. Nếu bạn muốn làm một cái gì đó khác, sau đó bạn sẽ phải xác định đầy đủ hơn những gì bạn đang làm, và thiết kế một hệ thống sẽ thực hiện theo yêu cầu. Nếu bạn đang thực hiện các truy vấn cơ sở dữ liệu mất quá nhiều thời gian, tôi sẽ cố gắng cải thiện truy vấn (và DB cơ bản) để tăng tốc độ truy vấn, thay vì cố gắng sửa lỗi ngoài vấn đề ban đầu. –

+0

Thanx bạn đã giúp tôi tìm đúng thứ. Tôi nghĩ rằng những gì tôi đang tìm kiếm là max_input_time Bạn có biết nếu nó trả về cũng là lỗi nghiêm trọng nếu thời hạn không được đáp ứng? – Granit

9

Bạn cần tự mã hóa nếu bạn muốn hàm 1 trả lại khi hết thời gian.

function doStuff($seconds) 
{ 
    $finish=time()+$seconds; 

    $done=false; 
    $timeout=false; 

    while (!$done && !$timeout) 
    { 
     //do stuff here, set $done to true if you complete 

     //out of time? 
     $timeout=time() >= $finish; 

    } 

    return $done; //let caller know if we completed 
} 

Tất nhiên, "công cụ" bạn cần lặp lại để bạn có thể tiếp tục kiểm tra thời gian đã trôi qua và thoát nếu cần.

Nếu bạn muốn thực hiện thời gian chờ của một chức năng tùy ý và có điều khiển được trả lại cho bạn, điều đó không được hỗ trợ. Nếu bạn thực sự cần phải làm điều này, hãy thiết kế nó như một quá trình riêng biệt. Sau đó, bạn có thể đóng quá trình nếu quá trình này có vẻ mất quá nhiều thời gian.

+0

Thanx cho câu trả lời nhưng nhìn vào acenario này hàm doStuff ($ giây) { $ finish = time() + $ giây; $ done = false; $ timeout = false; trong khi (! $ Done &&! $ Timeout) { // làm công cụ ở đây, đặt $ thành true nếu bạn hoàn thành // hết thời gian? $ result = anotherFunction(); chức năng này là một chức năng php standart mà không thể được sửa đổi và phải mất quá nhiều để thực hiện trong trường hợp của tôi. $ timeout = time()> = $ kết thúc; } trả lại $ đã hoàn thành; // cho người gọi biết nếu chúng tôi hoàn thành } – Granit

+0

Thanx cho câu trả lời nhưng hãy nhìn vào acenario này function doStuff($seconds) { $finish=time()+$seconds; $done=false; $timeout=false; while (!$done && !$timeout) { //do stuff here, set $done to true if you complete //out of time? $result = anotherFunction(); this function is a standart php function which can not be modified and it takes too much to execute in my case. $timeout=time() >= $finish; } return $done; //let caller know if we completed } Granit

+4

Bạn không thể có chức năng tùy ý thoát sau một thời gian nhất định. Nếu bạn thực sự cần phải làm điều này, hãy thiết kế nó như một quá trình riêng biệt. Sau đó, bạn có thể đóng quá trình nếu quá trình này có vẻ mất quá nhiều thời gian. –

0

tôi không nghĩ rằng điều này là có thể, nhưng tại sao bạn sẽ làm điều này? Nếu một kịch bản bao giờ bị gián đoạn tôi có thể không muốn bạn muốn nó. Điều này sẽ giống như một sự bảo vệ của chính bạn (chỉ trong trường hợp bạn tải lên một vòng lặp vô tận hoặc một cái gì đó sẽ mất nhiều giờ), nhưng nếu kịch bản của bạn mất nhiều thời gian, bạn nên cho nó thời gian cần thiết hoặc thay đổi kịch bản để nó chạy nhanh hơn (đối với một số crons ok của nó để mất một lúc, nhưng nếu một kịch bản bình thường được gọi là khá thường mất nhiều thì giới hạn thời gian mặc định, bạn có thể phải đối mặt với một số vấn đề hiệu suất nghiêm trọng)

+0

Cho phép nói rằng tập lệnh của tôi lấy dữ liệu từ cơ sở dữ liệu và mỗi hàng nó cố gắng làm điều gì đó với hàng đó như doSomething (hàng) nhưng đôi khi điều này có thể mất quá nhiều thời gian. Vì vậy, tôi cần một cái gì đó như thế nào khi điều này DoSomething không được hoàn thành trong 5 phút để tiếp tục với hàng khác. Nếu bằng cách nào đó tôi có thể thực hiện một chức năng như: chức năng doSomething() { // mã ở đây kết quả trả về; } Nhưng nếu chức năng này không thể hoàn thành trong 5 phút để trả về false chẳng hạn! – Granit

+0

ah ok, trong trường hợp đó dính với câu trả lời của paul dixon – Flo

3

Không, không thể: max_execution_time được sử dụng làm biện pháp bảo mật, để tránh các tập lệnh lỗi (như vòng lặp vô hạn) phá hủy máy chủ; nhưng nó không có ý định làm việc trên cơ sở đơn vị chức năng.

Và thực tế là nó kết thúc bằng một lỗi nghiêm trọng chắc chắn là không tốt cho người dùng dù sao ...

1

Tôi sử dụng lệnh exec để chạy shellscript tạo ra xuất từ ​​ứng dụng bên ngoài. Nếu tập lệnh chạy quá lâu, max_execution_time được tiếp cận và người dùng sẽ không bao giờ biết điều gì đã xảy ra. Giới hạn chức năng như vậy sẽ giúp tôi xác định xem kết thúc có gần và gửi một số lỗi thân thiện với người dùng hay không.

6
$endtime=time()+10; 

while(time()!=$endtime){ 

    echo "."; 
}