这种情况发生在我们中的最佳人选身上。
特别是当处理没有内置调试功能(如断点和监视变量)的语言时,这些错误会困扰开发人员。调试代码、警报和 Response.Writes 会出现在生产代码中。
如何将 JavaScript、PHP 或 VBScript 中的调试问题与功能代码分离?如何确保这些调试更改永远不会进入生产环境?
这种情况发生在我们中的最佳人选身上。
特别是当处理没有内置调试功能(如断点和监视变量)的语言时,这些错误会困扰开发人员。调试代码、警报和 Response.Writes 会出现在生产代码中。
如何将 JavaScript、PHP 或 VBScript 中的调试问题与功能代码分离?如何确保这些调试更改永远不会进入生产环境?
define("DEBUG", true);
if (DEBUG) {
echo "Debug Method";
}
对于 JavaScript 来说,情况类似。
define()
,但至少它根本不是JS的意图。 - KingCrunch一种方法是使用环境变量。在您的服务器配置中,您可以设置一个环境变量来指示是否启用调试模式。生产服务器将配置为 false,而开发服务器则为 true。这样,您在代码中所做的就是检查环境变量:
在 PHP 中:
if (getenv('DEBUG_MODE')) {
var_dump($foo);
}
这样一来,就不会忘记关闭它,因为它会自动关闭。但是如果你真的需要在生产环境中打开它,只需切换开关...
有几种方法可以在生产环境中隐藏调试代码,但很少有方法可以删除它(当编译器无法自动删除它时)。
我通过以下方式隐藏调试代码:
我通过在部署前搜索特殊注释来删除它:
alert("false") //TODO:REMOVE DEBUG CODE
我的同事还建议:
alert
来检查调试变量。(可能会有副作用?)alertDebug
方法来检查调试变量。(是否有人会记得它?)检查 firebug 是否正在运行
if(window.console && window.console.firebug)
{
alert("you are using firebug");
}
define ('DEBUG', 1);
if (DEBUG == 1) {
// echo some sensitive data.
}
DEBUG
,则此代码不会执行调试代码。
if (DEBUG)
的问题在于,如果未定义该常量,则它将假定字符串“DEBUG”,这将被评估为 true。如果您使用为调试目的指定的语言特性,则此类情况往往会发生得更少:
assert( is_string($param1) );
不会影响生产代码。
function debug(...$stuff){
var_dump($stuff);
return true; //always return true so assert will always pass it.
}
assert(debug("This code will not even be processed on production server. "));
这是最安全的方法,但不太灵活。
我经常使用的一种方法是检查主机名或客户端IP地址。
因此,我有一个检查主机名的函数,如下所示:
function onTestServer(){
$SERVER_NAME = $_SERVER["SERVER_NAME"];
if(substr($SERVER_NAME,-5)==="te.st") return true;//all *.te.st domains are test servers
if (strpos($SERVER_NAME, ".localhost")!==false) return true; //all *.localhost domains are test servers
return false;
}
然后我有自己的vardump、debug和die语句,类似于这样,在生产环境中不会执行:
function varDump($stuff){
if (!onTestServer()) return;
echo "<pre>";
var_dump($stuff);
echo "</pre>";
}
那么你只需要使用自定义的varDump()函数,这样只有你能看到它。
我的调试函数更加复杂,可以显示可展开的信息树等。但基本原则是相同的。如果在本地主机上,则执行vardumps等操作,否则不会显示任何内容。
当测试时总想看到额外的信息,但又不想在部署到服务器之前删除所有vardumps时,这个功能非常方便。
我还会检查客户端IP地址,并且如果客户端IP地址是我的话,在实际生产服务器上显示错误和信息。
function getIp()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
function onTestClient(){
$office_ip = "xxxx.xxxx.xxxx.xxxx";
$test_client_ips = array($office_ip,"any other ip you want");
$client_ip = getIp();
if (in_array($client_ip,$test_client_ips)) return true;
return false;
}
如果您需要在没有本地测试环境的情况下从便携式计算机对现场站点进行快速更新的测试,那么这将非常方便。只需将当前IP添加到列表中,然后使用此类功能:
function die_dev($message){
if (onTestServer() || onTestClient()) die($message);
}
if (onTestClient()){
//show a completely different interface/webpage html js etc
} else {
//show the original content that is currently live
}
我在调试代码时遵循三条规则
第一,让源代码看起来很糟糕,通过添加注释、缩进和空格来使其更易于阅读。
第二,使用打印语句输出变量的值,以便在运行时检查它们是否正确。
第三,使用调试器逐步执行代码,以便可以跟踪程序的执行过程并找到错误。
not indenting it from the left margin
egregiously violating the coding standard
putting in extra whitespace above and below
设置一个全局调试开关,并
have it alter an obvious output if it is ON, and
make the debug code compilation depend on that switch being ON (i.e., so the code won't compile if the global switch is OFF)
破坏明显的输出,例如:
delete something really important
put up 99/99/99, for the date
comment out the "File Load" function
delaying the splash-screen
etc.
这三条规则对我来说非常有效。
我所做的是用PHP编程。
define ("DEBUG", true);
function op (){
if ( !DEBUG ) return true;
$args = func_get_args();
foreach ( $args as $var ){
if ( is_object ( $var ) or is_array ( $var ) ){
print "<br /><pre>";
print_r ( $var );
print "</pre>";
}
else{
print "<br />" . $var;
}
}
return true;
}
// On places to check
op ($array, $var);
在 JavaScript 中,我也会做同样的事情
function calert(message){
if (!debug) return;
alert (message);
}