如果它只是“避免生产中的调试”,那么使用内置的 assert() 函数。
这完全避免了您的调试消息被处理,并防止您可能在其中进行的任何计算消耗内存或处理能力。
assert 在生产中被完全忽略。
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() 函数,因此只有您可以看到它。
我的调试功能要复杂得多,并显示可扩展的信息树等。但基本原理是相同的。如果在 localhost 上执行 vardumps 等,则不显示任何内容。
如果您总是想在测试时看到额外的信息,但又不想在部署到服务器之前删除所有的 vardump,这真的很方便。
如果客户端 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
}