生產環境調試需兼顧「錯誤可見」與「用戶無感」。本文提供一套通用的 PHP 調試配置方案,涵蓋錯誤日誌、內存/執行時間限制、斷點調試函數、變量輸出技巧等核心技能。
<?php
// 錯誤報告級別:顯示所有錯誤
ini_set('error_reporting', E_ALL);
// 關鍵:禁止直接輸出到瀏覽器
ini_set('display_errors', 'off');
// 開啟錯誤日誌記錄
ini_set('log_errors', 'on');
// 指定日誌存儲路徑(確保目錄可寫)
ini_set('error_log', 'C:/phpernote/php_error.log');
// 額外:提高資源限制防止誤判
@ini_set('memory_limit', '500M');
@ini_set('max_execution_time', '180');
?>
核心邏輯:開發環境 display_errors=on,生產環境 display_errors=off + log_errors=on。
兩者完全等價,exit() 是 die() 別名。
$file = fopen($filename, 'r') or die("無法打開: $filename");
原理:fopen 成功返回 resource(真值),短路不執行 die();失敗返回 false,執行 die() 輸出信息並終止腳本。
<?php
$site = "https://example.com/";
fopen($site, "r") or exit("無法連接: $site");
?>
<?php
$site = "https://example.com/";
fopen($site, "r") or die("無法連接: $site");
?>
<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);
// 輸出包含類型、長度、值的完整結構
$b = 3.1;
$c = true;
var_dump($b, $c); // 支持多參數
?>
<pre>
<?php
$a = array('a' => 'apple', 'b' => 'banana', 'c' => array('x','y','z'));
print_r($a);
?>
</pre>
輸出:
Array (
[a] => apple
[b] => banana
[c] => Array (
[0] => x
[1] => y
[2] => z
)
)
print_r($var, true) 返回字符串而非輸出reset()支持數組、對象、標量類型的遞歸結構化輸出:
function ss_as_string(&$thing, $column = 0) {
if (is_object($thing)) return ss_object_as_string($thing, $column);
elseif (is_array($thing)) return ss_array_as_string($thing, $column);
elseif (is_double($thing)) return "Double($thing)";
elseif (is_long($thing)) return "Long($thing)";
elseif (is_string($thing)) return "String($thing)";
else return "Unknown($thing)";
}
// 數組遞歸輸出
function ss_array_as_string(&$array, $column = 0) {
$str = "Array(\n";
while (list($var, $val) = each($array)) {
for ($i = 0; $i < $column + 1; $i++) $str .= " ";
$str .= "$var => ";
$str .= ss_as_string($val, $column + 1) . "\n";
}
for ($i = 0; $i < $column; $i++) $str .= " ";
return $str . ")";
}
// 對象遞歸輸出
function ss_object_as_string(&$object, $column = 0) {
if (empty($object->classname)) return "$object";
$str = $object->classname . "(\n";
while (list(, $var) = each($object->persistent_slots)) {
for ($i = 0; $i < $column; $i++) $str .= " ";
global $$var;
$str .= "$var => ";
$str .= ss_as_string($$var, $column + 1) . "\n";
}
for ($i = 0; $i < $column; $i++) $str .= " ";
return $str . ")";
}
掌握基礎調試技巧是進階的前提,善用工具鏈才能事半功倍。