PHP会强制显示错误的原因是什么,无论你告诉它禁用什么?
我试过了
error_reporting(0);
ini_set('display_errors', 0);
Run Code Online (Sandbox Code Playgroud)
没有运气.
E_ALL等于8191(0001 1111 1111 1111)E_STRICT等于2048(0000 1000 0000 0000)使用按位OR组合它们:
1 1111 1111 1111
1000 0000 0000
Run Code Online (Sandbox Code Playgroud)
我们得到与原始值完全相同的值E_ALL:
1 1111 1111 1111
Run Code Online (Sandbox Code Playgroud)
什么是做的点error_reporting(E_ALL | E_STRICT),如果我们可以简单做error_reporting(E_ALL)来获得同样的事情?
是否error_reporting(0);有错误记录(到文件)任何影响,还是只是禁止在屏幕上显示错误?
谢谢.
有哪些更好的方法可以避免isset()应用程序逻辑中的大量内容,并且在需要时保留查看调试消息(E_NOTICE)的能力?
首先推定:E_NOTICE不是错误,它是用词不当,实际上应该是E_DEBUG.然而,虽然这对于未设置的变量(PHP仍然是脚本语言)是正确的,但是一些文件系统函数等也会抛出它们.因此,需要开发 E_NOTICEs.
然而,并非所有调试通知都是有用的,这就是为什么在整个应用程序逻辑中引入isset()和@ 是一个常见的(不幸的)PHP习惯.isset/empty肯定有很多有效的用例,但总的来说它似乎是语法盐,实际上可能阻碍调试.
这就是我目前使用error_reporting书签和哑开/关开关的原因:
// javascript:(function(){document.cookie=(document.cookie.match(/error_reporting=1/)?'error_reporting=0':'error_reporting=1')})()
if (($_SERVER["REMOTE_ADDR"] == "127.0.0.1")
and $_COOKIE["error_reporting"])
{
error_reporting(E_ALL|E_STRICT);
}
else {/* less */}
Run Code Online (Sandbox Code Playgroud)
然而,这仍然让我有一个问题,即一旦启用就有太多通知来搜索.作为解决方法,我可以使用@ error suppress运算符.与isset()不同,它不会完全终止调试选项,因为自定义错误处理程序仍然可以接收抑制的E_NOTICE.因此,将预期的调试通知与潜在问题分开可能会有所帮助.
然而,这同样令人不满意.因此问题.有没有人使用或知道更复杂的PHP错误处理程序.我在想象:
当然,某些框架必须已经有这样的用户错误处理程序.
哦,我有人请帮助改写这个.冗长的解释失败了.
我正在做一些PHP的东西,而不是它是调试模式.所以我就是我们
error_reporting(E_ALL);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试访问字符串的任何字符时,由于错误报告而导致错误.
$sentence = "Hello World";
$sentence[0] //Uninitialized string offset: 0
Run Code Online (Sandbox Code Playgroud)
编辑:
public static function prepareSentence($sentence)
{
$sentence = trim($sentence);
if ($sentence[0] == '"') //Uninitialized string offset: 0
$sentence = substr($sentence, 1, strlen($sentence));
if ($sentence[strlen($sentence) - 1] == '"')
$sentence = substr($sentence, 0, -1);
if ($sentence[0] == '"' || $sentence[strlen($sentence) - 1] == '"')
return self::prepareSentence($sentence);
return $sentence;
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能在开发模式下工作.我需要error_reporting(E_ALL);
提前致谢.
我在Windows 2008 R2服务器和Windows 7 64位上安装了PHP 5.2.10和PHP 5.2.14(x86非线程安全的Win32版本).
出于某种原因,PHP 5.2.14拒绝显示错误消息.
即使我设置了以下设置,php.ini如果我使用5.2.14,也不会报告任何错误:
error_reporting = E_ALL
display_errors = On
Run Code Online (Sandbox Code Playgroud)
即使在使用php.exe故意语法错误从命令行运行测试脚本时,也会发生这种情况:
C:\ PHP>
php test.php
PHP正在使用正确的php.ini文件,因为我可以在运行时看到我的设置发生变化php.exe -i.
我还注意到php.exe在PHP 5.2.14中启动非常慢.
当我在同一台机器上使用PHP 5.2.10执行相同的测试集时,我收到错误消息报告就好了.
这两个php.ini文件都是库存(基于php.ini-recommended),但修改了error_reporting和display_errors设置.
当使用AirBrake或ExceptionNotifier等工具发送延迟的作业时,获取错误报告的正确方法是什么?
我试图创建自己的延迟作业类,但由Mailer.welcome()(或类似)创建的邮件对象未正确序列化.我也尝试error(job, exception)在PerformableMailer和PerformableMethod类中添加一个方法,但是我认为通常与序列化相关的错误更多.我为序列化尝试了psych和sych.
error-reporting delayed-job ruby-on-rails-3 airbrake exception-notifier
我想将代码从PHP 5.2迁移到5.4.到目前为止这个工作正常,只是我使用的所有代码都广泛使用了一个没有任何初始化的成员的对象,如:
$MyObject->MyMember = "Hello";
Run Code Online (Sandbox Code Playgroud)
这会产生警告:"从空值创建默认对象"
我知道解决方案是使用:
$MyObject = new stdClass();
$MyObject->MyMember = "Hello";
Run Code Online (Sandbox Code Playgroud)
但是在我的所有代码中改变这一点将是很多工作,因为我在不同的项目中多次使用它.我知道,这不是很好的风格,但遗憾的是,我无法在接下来的几周内将其添加到我的所有代码中.
我知道我可以将php error_reporting设置为不报告警告,但我希望能够仍然获得其他警告和通知.启用或禁用E_STRICT似乎不会影响此警告.那么有没有办法禁用此警告?!
首先,让我说我理解我所描述的问题是如何以及为什么会发生的.我是计算机科学专业,我理解溢出/下溢和签名/无符号算术.(对于那些不熟悉该主题的人,Apple的安全编码指南会简要讨论整数溢出.)
我的问题是关于在检测到这种错误后报告和恢复,更具体地说是在Objective-C框架的情况下.(我编写和维护CHDataStructures.)我有一些集合类,它们分配用于存储对象的内存并根据需要动态扩展.我还没有看到任何与溢出相关的崩溃,可能是因为我的测试用例主要使用了理智的数据.但是,给定未经验证的值,事情可能会很快爆炸,我想阻止它.
我已经确定了至少两种可能发生这种情况的常见情况:
-initWithCapacity:.简单的部分是检测是否会发生溢出.(例如,在尝试分配length * sizeof(void*)字节之前,我可以检查是否length <= UINT_MAX / sizeof(void*),因为未通过此测试将意味着产品将溢出并可能分配比预期更小的内存区域.在支持它的平台上,checkint.h API是另一种选择.)更难的部分是确定如何优雅地处理它.在第一种情况下,呼叫者可能更好地(或至少在思维模式中)处理故障.第二种情况可能发生在代码中将对象添加到集合中的任何位置,这可能是非常不确定的.
那么,我的问题是:在这种情况下,当整数溢出发生时,"好公民"Objective-C代码如何表现?(理想情况下,由于我的项目是一个与Cocoa中的Foundation基本相同的框架,我想建模它的行为方式以获得最大的"阻抗匹配".我发现的Apple文档中没有提及太多所有这一切.)我认为,无论如何,报告错误是给定的.由于添加对象的API(可能导致方案2)不接受错误参数,我可以做些什么来帮助解决问题,如果有的话?在这种情况下,真正考虑的是什么?如果我能做得更好,我不愿意故意编写容易崩溃的代码......
memory-management error-reporting objective-c integer-overflow
我看不到任何PHP错误.我已经尝试了我可以找到的每个技巧来打开错误报告,但没有任何作用.
display_errors已打开且error_logging已打开,但当我查看任何有错误的页面时,我得到一个空白页面.
/var/log/php.log不存在.
如果我设置了本地日志文件,则无法创建任何内容.
我一直在测试的文件是
<?php
ini_set('display_errors',1);
error_reporting(E_ALL|E_STRICT);
ini_set('error_log','script_errors.log');
ini_set('log_errors','On');
$a=
phpinfo();
?>
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?