2013-06-18 39 views
5

Nếu tôi đưa tệp vào php. Nếu có bất kỳ lỗi nghiêm trọng nào trong php đó thì có cách nào để bỏ qua điều đó không.Có cách nào để bỏ qua lỗi nghiêm trọng từ tệp bao gồm trong php không?

<?php 
    include "somefile.php"; 
    echo "OK"; // Is there any way to print this OK If there is any fatal error on somefile.php 
?> 

Tôi cần phải bao gồm tệp somefile.php này. Nó có thể trả về lỗi nghiêm trọng cho một số máy chủ lưu trữ. Tôi muốn bỏ qua tệp này cho các máy chủ đó.

Vui lòng tư vấn cho tôi.

+0

Tôi cần phải bao gồm tập tin mà đôi khi nó có thể trở lại lỗi nghiêm trọng đối với một số máy chủ. – SarwarCSE

+0

sử dụng 'require' thay vì bao gồm. –

+0

"nó có thể trả về lỗi nghiêm trọng cho một số máy chủ" - loại tử vong nào? Tại sao chính xác nó xảy ra? – zerkms

Trả lời

3

Với điều này, bạn có thể xác định chức năng tiếp tục của riêng bạn sẽ tiếp quản trong trường hợp có lỗi nghiêm trọng. Điều này sử dụng register_shutdown_function() để chặn lỗi nghiêm trọng.

Cách sử dụng:

function my_continuation_func($filename, $arg2) { 
    // On fatal error during include, continue script execution from here. 
    // When this function ends, or if another fatal error occurs, 
    // the execution will stop. 
} 

include_try('my_continuation_func', array($filename, $arg2)); 
$data = include($filename); 
$error = include_catch(); 

Nếu một lỗi nghiêm trọng xảy ra (như một lỗi phân tích cú pháp), thực hiện kịch bản sẽ tiếp tục từ my_continuation_func(). Nếu không, include_catch() trả về true nếu có lỗi trong khi phân tích cú pháp.

Mọi đầu ra (như echo 'something';) từ include() được coi là lỗi. Trừ khi bạn đã bật đầu ra bằng cách chuyển true làm đối số thứ ba cho include_try().

Mã này sẽ tự động xử lý các thay đổi thư mục hoạt động có thể có trong chức năng tắt máy.

Bạn có thể sử dụng điều này cho bất kỳ số lượng bao gồm, nhưng lỗi nghiêm trọng thứ hai xảy ra không thể bị chặn: việc thực hiện sẽ dừng lại.

Chức năng để được bao gồm:

function include_try($cont_func, $cont_param_arr, $output = false) { 
    // Setup shutdown function: 
    static $run = 0; 
    if($run++ === 0) register_shutdown_function('include_shutdown_handler'); 

    // If output is not allowed, capture it: 
    if(!$output) ob_start(); 
    // Reset error_get_last(): 
    @user_error('error_get_last mark'); 
    // Enable shutdown handler and store parameters: 
    $params = array($cont_func, $cont_param_arr, $output, getcwd()) 
    $GLOBALS['_include_shutdown_handler'] = $params; 
} 

function include_catch() { 
    $error_get_last = error_get_last(); 
    $output = $GLOBALS['_include_shutdown_handler'][2]; 
    // Disable shutdown handler: 
    $GLOBALS['_include_shutdown_handler'] = NULL; 
    // Check unauthorized outputs or if an error occured: 
    return ($output ? false : ob_get_clean() !== '') 
     || $error_get_last['message'] !== 'error_get_last mark'; 
} 

function include_shutdown_handler() { 
    $func = $GLOBALS['_include_shutdown_handler']; 
    if($func !== NULL) { 
     // Cleanup: 
     include_catch(); 
     // Fix potentially wrong working directory: 
     chdir($func[3]); 
     // Call continuation function: 
     call_user_func_array($func[0], $func[1]); 
    } 
} 
2

Gây tử vong có nghĩa là gây tử vong ... Không có cách nào để khôi phục từ lỗi nghiêm trọng.

0

chỉnh sửa: Tôi đã bỏ lỡ từ gây tử vong. Như đã nêu, bạn không thể khôi phục từ lỗi nghiêm trọng. Nếu nó chỉ là một ngoại lệ, câu trả lời vội vàng viết dưới đây sẽ hoạt động.

Bao gồm một mô-đun php cũng giống như mã được chèn nội tuyến, do đó, một tuyên bố đơn giản try-catch nên làm việc:

<?php 
    try { 
     include "somefile.php"; 
    } catch (Exception $e) { 
     echo 'Caught exception: ', $e->getMessage(), "\n"; 
    } 
    echo "OK"; 
?> 
+0

Sẽ không hoạt động đối với các lỗi nghiêm trọng ... chỉ ngoại lệ và không có cách nào để ném ngoại lệ lên một lỗi nghiêm trọng. – Orangepill

+2

Lỗi nghiêm trọng không phải là ngoại lệ. – sectus

+0

Vâng, tôi phải hiểu rõ điều đó. Những nhận xét này là chính xác. –

0

Cố gắng thiết lập một set_error_handler() chức năng mà không chết trên gây tử vong lỗi, nhưng thay vào đó Apache đã gặp sự cố. Nói cách khác, PHP cần phải chết để hệ thống không.

Xem trang này LINK

1

PHP sẽ không chịu đựng được với lỗi nghiêm trọng. Tốt nhất để kiểm tra tệp được bao gồm và giải quyết nó. Thực ra, bạn có thể thử xem register-shutdown-function, nhưng không nên chạy trốn khỏi các sự cố của bạn.

0

Lỗi nghiêm trọng có nghĩa là có điều gì đó nghiêm trọng sai với mã bao gồm. Như @Orangepill cho biết không có cách nào để ngăn chặn thông báo lỗi nghiêm trọng này xuất hiện. Xin vui lòng đi qua mã hóa của bạn và tìm lỗi.

1

Bạn có thể sử dụng register_shutdown_function.

<?php 
function echoOk() 
    { 
    echo "OK"; 
    } 

register_shutdown_function(function() 
     { 
     $error = error_get_last(); 
     // to make sure that there is any fatal error 
     if (isset($error) && 
      ($error['type'] == E_ERROR 
      || $error['type'] == E_PARSE 
      || $error['type'] == E_COMPILE_ERROR 
      || $error['type'] == E_CORE_ERROR)) 
      { 
      echoOk(); 
      } 
     }); 

include "somefile.php"; 

echoOk(); 

Nhưng bạn chỉ có thể làm điều đó một lần. Bất kỳ lỗi nghiêm trọng nào khác sẽ ngừng thực thi.

0

Vâng, có. Nó có thể được thực hiện thông qua một đơn giản câu lệnh if

You Have:

<?php 
    include "somefile.php"; 
    echo "OK"; // Is there any way to print this OK If there is any fatal error on 
?> 

Hãy thử này:

<?php 
    if(include "somefile.php"){ 
      // echo do something if success 
    }else{ 
      echo "OK"; 
    } 
+0

Điều này không hoạt động nếu somefile.php chứa ' mgutt

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