Nguyên nhân không chạy được file php trong php

- Đối với các thay đổi cấu hình PHP trong file php.ini hoặc .htaccess không có tác dụng tại Hosting Vinahost

    3.2 Cấu hình trong mã nguồn website
- Đối với từng bộ mã nguồn có thể điều chỉnh cấu hình trong mã nguồn để hiển thị Error log ra ngoài website dễ dàng cho việc phán đoán lỗi. Một số mã nguồn thông dụng nhất hiện nay có thể cấu hình để ghi lại và hiển thị lỗi như sau:

Joomla  
- Đăng nhập trang quản trị: Site >> Global Configuration >> Server >> Error Reporting: Chọn Maximum
- Hoặc có thể điều chỉnh trong file configuration.php của mã nguồn, cấu hình biến $error_reporting sử dụng các giá trị sau:

-1: Tắt thông báo lỗi
30709: Hiển thị tất cả các lỗi ngoại trừ warnings và notices (cấu hình tương đương E_ALL & ~(E_NOTICE|E_WARNING) )
30711: Hiển thị tất cả các lỗi bao gồm warnings, không bao gồm notices (cấu hình tương đương  E_ALL & ~E_NOTICE )
30719: Hiển thị tất cả các lỗi bao gồm warnings và notices, không bao gồm E_STRIC (cấu hình tương đương  E_ALL &~ E_STRIC)
32767: Hiển thị tất cả các lỗi, warning, notices và các lỗi "strict standards" (ví dụ:  “Strict Standards: Non-static method … on line XX”) (cấu hình tương đương E_ALL )


- Với mục đích kiểm tra lỗi liên quan đến phiên bản PHP, phần cấu hình này nên sử dụng giá trị 32767  để hiển thị tất cả các lỗi bao gồm gợi ý của PHP về việc các hàm mà mã nguồn đang sử dụng có tương thích / phù hợp với phiên bản PHP mà hệ thống đang sử dụng hay không.

Ví dụ:
public $error_reporting = '32767:';
public $log_path = '/home/xxx/public_html/joomla/logs'; #Đường dẫn lưu file log

- Tùy thuộc vào phiên bản PHP máy chủ đang sử dụng mà cấu hình hiển thị tất cả các lỗi E_ALL khác nhau như sau:

32767 nếu là PHP 5.4.x trở lên
30719 nếu là PHP 5.3.x
6143 nếu là PHP 5.2.x
2047 nếu là các phiên bản PHP thấp hơn


Wordpress
- Thay đổi một số giá trị trong file wp-config.php như sau:

/**  Bật WP_DEBUG mode */
define('WP_DEBUG', true);

/**  Bật chức năng lưu file log ở đường dẫn sau /wp-content/debug.log  */
define('WP_DEBUG_LOG', true);

/**  Hiển thị  các lỗi và warnings  */
define('WP_DEBUG_DISPLAY', true);
@ini_set('display_errors',1);

Magento
- Cấu hình trong phần quản lý: Admin >> Configuration >> Developer >> Log Settings >> Enabled = Yes
- Phân quyền 777 cho folder var/log để lưu log tại 2 file sau:

var/log/system.log
var/log/exception.log


4. Kiểm tra thông báo lỗi
- Khi sử dụng ngồn ngữ PHP để lập trình website (hoặc mã nguồn có sẵn) thì thường mã nguồn đó chỉ chạy tốt trên một môi trường PHP nhất định (phổ biến nhất là PHP 5.2, PHP 5.3), khi chạy trên môi trường Hosting có phiên bản PHP không phù hợp thì các hàm PHP trong mã nguồn website sẽ không còn được hỗ trợ và hiển thị một số lỗi dạng như sau:

Your server is running PHP version 5.1.6 but WordPress 3.8.2 requires at least 5.2.4.
Undefined variable: xxx in \home\userhosting\public_html\path-to-file\abc.php on line 12
Fatal error: Call to undefined method xxx
Deprecated: Assigning the return value of new by reference is deprecated in xxx on line 136

Nguyên nhân không chạy được file php trong php

- Tại bước cấu hình 3.1 Cấu hình Hosting nếu bật tùy chọn log_errors = On thì hệ thống sẽ tự sinh file thông báo lỗi error_log tại đường dẫn sau: /home/username/public_html/error_log.

Nguyên nhân không chạy được file php trong php
- Có thể kiểm tra file này để xem chi tiêt thông báo lỗi.
Nguyên nhân không chạy được file php trong php
- Ngoài ra tùy thuộc vào cấu hình của từng mã nguồn để kiểm tra file thông báo lỗi khác nếu có.

5. Xử lý lỗi
- Để xử lý lỗi sai phiên bản PHP có thể dùng cách thay đổi mã nguồn (sử dụng hàm khác) hoặc thay đổi PHP version trên Hosting, đối với Hosting tại Vinahost có thể thao tác một cách dễ dàng như sau:

Nguyên nhân không chạy được file php trong php

- Kiểm tra lại thao tác đổi phiên bản PHP đã thành công hay chưa bằng cách tạo một file info.php trong thư mục gốc của website (thư mục /home/username/public_html) có nội dung như sau:

Sau đó truy cập trực tiếp bằng trình duyệt thông qua đường dẫn http://your-websites.com/info.php

Tham khảo: 

- http://codex.wordpress.org/Debugging_in_WordPress
- https://wiki.magento.com
- http://docs.joomla.org/J3.x:Global_configuration

- http://php.net/manual/en/errorfunc.constants.php 

Ở bài trước chúng ta đã tìm hiểu qua về ngoại lệ cũng như các cách xử lý ngoại lệ trong PHP. Tiếp tục series học PHP căn bản, bạn sẽ tìm hiểu về lỗi (Error), những loại lỗi có trong PHP và phương pháp xử lý lỗi hiệu quả cho code PHP của bạn.

Nguyên nhân không chạy được file php trong php

Xử lý lỗi (Error) Trong PHP

Lỗi là gì?

Vào một ngày đẹp trời nào đó bạn truy cập và sử dụng website hoặc ứng dụng của bạn và thấy nó hoạt động không đúng theo mong muốn của bạn thì đó chính là lỗi.

Việc xử lý lỗi (Error) trong PHP là một phần quan trọng. Nếu code của bạn thiếu phần kiểm tra lỗi, chương trình của bạn sẽ không chuyên nghiệp và có thể gặp rủi ro về bảo mật.

Phân loại lỗi

Chúng ta sẽ chia ra 3 loại lỗi như sau:

Lỗi cú pháp (syntax error)

  • Xuất hiện khi ta viết code.
  • Được thông báo khi ta thực thi trang.
  • Nguyên nhân: viết sai hoặc thiếu cú pháp.

Lỗi thực thi

  • Xảy ra khi ta thực thi trang.
  • Khó xác định hơn lỗi cú pháp.
  • Nguyên nhân: Mở một tập tin không tồn tại, chia cho 0, truy xuất bảng không tồn tại trong cơ sở dữ liệu,…

Lỗi luận lý

  • Xảy ra khi ta thực thi trang
  • Được thể hiện dưới những hình thức hoặc những kết quả không mong đợi.
  • Nguyên nhân: sai lầm trong giải thuật.

Vậy tại sao phải xử lý lỗi

Việc website của bạn có lỗi là một vấn đề rất cần quan tâm. Lỗi là điều không mong muốn và gây khó chịu hoặc tạo một số hiểu cho người dùng. Có thể làm mất dần lượt truy cập từ khách.

Không những thế lỗi trong PHP nếu không giải quyết sớm sẽ đem lại rất nhiều vấn đề về bảo mật, dễ bị hacker tấn công,..

Chính vì vậy mà ta cần phải xử lý lỗi trong thời gian thật sớm để tránh gây khó chịu cho người dùng cũng như tăng tính bảo mật thêm cho website.

Tìm hiểu về các cấp độ lỗi trong PHP

Thông thường, khi có sự cố ngăn tập lệnh chạy đúng, công cụ PHP sẽ gây ra lỗi. Mỗi lỗi được biểu thị bằng một giá trị nguyên và hằng số liên quan. Bảng sau liệt kê một số cấp độ lỗi phổ biến:

Cấp độ lỗiGiá trịMô tảE_ERROR1Một lỗi Runtime nghiêm trọng, không thể được phục hồi. Việc thực thi kịch bản được dừng lại ngay lập tứcE_WARNING2Một cảnh báo runtime. Nó không trí mạng và hầu hết các lỗi có xu hướng rơi vào loại này. Việc thực thi kịch bản sẽ không dừng lại.E_NOTICE8Một thông báo runtime. Cho biết rằng tập lệnh gặp phải lỗi có thể xảy ra, mặc dù tình huống cũng có thể xảy ra khi chạy tập lệnh bình thườngE_USER_ERROR256Một thông báo lỗi do người dùng tạo ra. Điều này giống như một E_ERROR, ngoại trừ nó được tạo bởi tập lệnh PHP bằng cách sử dụng hàm trigger_error () chứ không phải là PHP engineE_USER_WARNING512Một thông điệp cảnh báo không trí mạng do người dùng tạo ra. Điều này giống như một E_WARNING, ngoại trừ nó được tạo bởi tập lệnh PHP bằng cách sử dụng hàm trigger_error () chứ không phải PHP engineE_USER_NOTICE1024Một thông báo thông báo do người dùng tạo. Điều này giống như một E_NOTICE, ngoại trừ nó được tạo bởi tập lệnh PHP bằng cách sử dụng hàm trigger_error () chứ không phải PHP engineE_STRIC2048Không hoàn toàn là một lỗi, nhưng được kích hoạt bất cứ khi nào PHP gặp mã có thể dẫn đến sự cố hoặc chuyển tiếp không tương thíchE_ALL8189Tất cả các lỗi và cảnh báo, ngoại trừ E_STRICT trước PHP 5.4.0.

Để tìm hiểu thêm, bạn có thể xem tại trang chủ của PHP tại đây

PHP Engine gây ra lỗi bất cứ khi nào nó gặp sự cố với tập lệnh của bạn, nhưng bạn cũng có thể tự kích hoạt lỗi để tạo ra nhiều thông báo lỗi thân thiện với người dùng hơn.

Xử lý lỗi cơ bản với hàm die() trong PHP

Die statements – hàm 

<?php
  $denominator = 0;
  echo 2 / $denominator;
0 là hàm kết hợp giữa echo và hàm thoát lại với nhau. Nó phù hợp khi chúng ta muốn hiển thị một tin nhắn đến người dùng và ngừng lại kịch bản thực thi khi gặp lỗi.

Ví dụ:

<?php
  $denominator = 0;
  if ($denominator == 0) {
    die("Number is zero.");
  } else {
    echo 2 / $denominator;
  }
?>

Bây giờ khi chạy file, nếu biến $denominator có giá trị bằng 0 thì hàm die sẽ xuất ra thông báo lỗi được ta định sẵn đến cho người dùng. Còn nếu biến này có giá trị khác 0 thì phép chia sẽ tiếp tục được thực thi.

Giả sử nếu ta không sử dụng hàm die mà thực hiện code chay như bên dưới các bạn sẽ nhận được một hộp báo lỗi cực xấu đến người dùng:

<?php
  $denominator = 0;
  echo 2 / $denominator;

Nguyên nhân không chạy được file php trong php

Dĩ nhiên là thông báo lỗi này không được thân thiện cho lắm. Nên người dùng sẽ không hiểu là lỗi gì. Họ chỉ biết là họ đang có trải nghiệm tệ.

Hàm die() được sử dụng ở trên chỉ đơn giản hiển thị thông báo lỗi tùy chỉnh và chấm dứt tập lệnh hiện tại . Tuy nhiên, đơn giản là dừng tập lệnh không phải lúc nào cũng đúng. Chúng ta hãy xem xét các hàm PHP thay thế để xử lý lỗi khác.

Tạo một trình xử lý lỗi tuỳ chỉnh PHP

Hàm này phải có khả năng xử lý tối thiểu hai tham số (mức lỗi và thông báo lỗi) nhưng có thể chấp nhận tối đa năm tham số

Cú pháp:

error_function_name(error_level, error_message, error_file, error_line, error_context)
ParameterDescriptionerror_function_nameTên của hàm xử lý lỗi.error_levelBắt buộc. Chỉ định mức báo cáo lỗi cho lỗi do người dùng định nghĩa. Phải là một số giá trị. Xem bảng bên dưới để biết các mức báo cáo lỗi có thể xảy ra.error_messageBắt buộc. Chỉ định thông báo lỗi cho lỗi do người dùng định nghĩa.error_fileTùy chọn. Chỉ định tên file mà lỗi có thể xảy ra.error_lineTùy chọn. Chỉ định dòng của file mà lỗi có thể xảy ra.error_contextTùy chọn. Chỉ định một mảng chứa mọi biến và giá trị của chúng, được sử dụng khi lỗi xảy ra.

Ví dụ, xử lý lỗi trong PHP:

<?php
function calcDivision($dividend, $divisor){
    if($divisor == 0){
        trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING);
        return false;
    } else{
        return($dividend / $divisor);
    }
}
?>

Trong đó E_USER_WARNING là cấp độ báo cáo lỗi và mình đã liệt kê ở phần trên các bạn có thể lướt lên để xem lại.

Ví dụ 2: tạo một trình xử lý lỗi tuỳ chỉnh:

<?php
function customError($errno, $error_msg) {
    echo "<b>Error:</b> [$errno] <br>";
    echo "<b>Error Description:</b> $error_msg<br>";
    echo "Ending Script";
    die();
  }

Ta đã tạo được một hàm xử lý thông báo lỗi, giờ ta cần thiết lập tuỳ chỉnh ra màn hình cho nó.

Thiết lập trình xử lý lỗi tuỳ chỉnh PHP

Chúng ta sẽ sử dụng custom error handlers để thiết lập trình xử lý lỗi thông qua hàmset_error_handler()

Cú pháp:

set_error_handler("customError");

Trong đó customError là tên của hàm xử lý lỗi.

Từ ví dụ 2 ở phần tạo trình xử lý lỗi, ta sẽ thiết lập tiếp như sau:

<?php
function customError($errno, $error_msg)
{
    echo "<b>Error:</b> [$errno] <br>";
    echo "<b>Error Description:</b> $error_msg <br>";
    echo "Ending Script";
}
set_error_handler("customError");
echo (5 / 0);

Kết quả xuất ra màn hình là:

Nguyên nhân không chạy được file php trong php

Như bạn thấy đó, custom error handlers cho phép chúng ta tùy chỉnh tin nhắn thông báo lỗi cho thân thiện và rõ ràng hơn chứ không phải một bảng lỗi màu cam xấu xí nữa.

Ghi nhật ký lỗi

Đôi khi bạn cần báo cáo lại lỗi cho leader hoặc muốn tạo nhật ký lỗi đã từng gặp trong quá trình làm việc của bạn. Bạn cũng có thể ghi nhật ký chi tiết lỗi vào file text như sau:

<?php
function calcDivision($dividend, $divisor){
    if($divisor == 0){
        trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING); //kích hoạt lỗi
        return false;
    } else{
        return($dividend / $divisor);
    }
}
//hàm xuất lỗi
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    $message .= "Error: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
    $message .= "Variables:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 3, "C:/wamp64/www/demo/log/app_errors.log");
    die("There was a problem, please try again.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "This will never be printed.";
?>

Gửi lỗi qua Email

Bạn cũng có thể gửi e-mail với các chi tiết lỗi bằng cách sử dụng cùng hàm error_log().

<?php
function calcDivision($dividend, $divisor){
    if ($divisor == 0){
        trigger_error("calcDivision(): The divisor cannot be zero", E_USER_WARNING); //kích hoạt lỗi
        return false;
    } else{
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    $message .= "Error: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
    $message .= "Variables:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 1, "[email protected]"); //thay đổi gmail ở đây.
    die("There was a problem, please try again. Error report submitted to webmaster.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "This will never be printed.";
?>

Sử dụng try catch để dò lỗi

Áp dụng từ bài học trước về cách xử lý ngoại lệ thì tương tự trong bài này chúng ta có thể dò lỗi thông qua việc sử dụng try catch như sau:

<?php
try{
 // Khối xử lý, đoạn muốn bắt lỗi
}
catch(Exception $ex)
{
 echo "<p>Lỗi hiện tại: " . $e->getMessage() . "</p>"; //xuất thông báo về lỗi
}
?>

Nếu dòng nào trong khối lệnh có khả năng tạo ra lỗi thì hàm getMessage() sẽ đảm nhận nhiệm vụ xuất thông tin lỗi ra màn hình.

Tổng kết

Khi lập trình với những dự án nhỏ hoặc các bài tập demo, đồ án cuối khóa, đồ án cuối môn học, có thể bạn không cần các khối try catch để bắt lỗi.

Tuy nhiên, khi vào công ty hoặc làm các dự án lớn, khi hệ thống vận hành tốt thì không sao. Khi hệ thống gặp lỗi nào đó hoặc khách hàng report lỗi thì lúc đó bạn sẽ thấy mệt mỏi với việc dò từng dòng code. Đó là khi bạn sẽ thấy xử lý lỗi và ngoại lệ là những điều cực kỳ quan trọng.

Mỗi bài viết về kiến thức học PHP của mình đều có thể chưa hoàn toàn đầy đủ, cho nên mong các bạn hãy tra google khi tham khảo và mong bạn có thể gửi lại comment bổ sung bên dưới để mình có thể hoàn thiện lại bài viết hơn. Cảm ơn các bạn!

Nếu các bạn cảm thấy Website TanHongIT.Com thật sự hữu ích mình mong các bạn có thể chia sẻ những bài viết đến cho cộng đồng cùng thao khảo nhé. Cảm ơn các bạn !!!

Các bạn có bất kì thắc mắc cần được hỗ trợ hay yêu cầu các phần mềm, thủ thuật, khoá học,… thì cứ để lại comment bên dưới bài viết hoặc liên hệ qua fanpage của TanHongIT để được hỗ trợ nhé! Mình sẽ cố gắng chia sẻ cho các bạn mọi thứ cần thiết nhất!