通常我E_ALL会看到PHP可能会对我的代码说些什么来尝试改进它.
我刚刚注意到一个错误常数E_STRICT,但从未使用或听说过它,这是一个用于开发的好设置吗?手册说:
运行时通知.允许PHP建议对代码进行更改,以确保代码的最佳互操作性和向前兼容性.
所以我想知道我是否使用最好的error_reporting水平E_ALL或者是否会E_STRICT是最好的?或者还有其他我尚未学习的组合吗?
编辑自2015年1月24日起:现在无法使用其他受信任的证书颁发机构.问答没有过时:
WinQual仍然拒绝签名:

当我们已经确定它是有效的数字签名时:

为了完整起见,我将离开其他人所做的编辑; 只是想指出他是多么的错.他可以忍受这种耻辱:
编辑截至2014年:现在可以使用其他受信任的证书颁发机构.问题和答案已经过时.
在2005年,我尝试与Microsoft建立WinQual帐户,因此我可以选择通过Windows错误报告(WER)自动提交的(如果有)故障转储文件.我不被允许拥有我的崩溃转储,因为我没有Verisign证书.相反,我有一个由Verisign子公司生成的更便宜的产品:Thawte.
您加入的方法是:您对它们提供的示例exe进行数字签名.这证明您是签署应用程序的同一签名者,他们从野外获得了崩溃转储.
在密码学上,需要私钥来在可执行文件上生成数字签名.只有该私钥的持有者才能为匹配的公钥创建签名.生成该私钥的人并不重要.这包括从以下位置生成的证书:
然而,Microsof的WinQual只接受Verisign生成的数字证书.甚至Verisign的子公司也不够好(Thawte).
任何人都可以想到微软不想接受代码签名证书的任何技术,法律或道德原因吗?WinQual网站说:
为何Winqual会员资格需要数字证书?
数字证书有助于保护您的公司免受那些试图冒充您的员工或者对您的公司进行欺诈行为的个人的侵害.使用数字证书可以证明用户或组织的身份.
某种程度上,Thawte数字证书不安全吗?
两年后,我向WinQual发送了提醒通知,我一直在等待能够进入崩溃堆.WinQual团队的回应是:
你好,
感谢您的提醒.我们已通知相关人员这仍是请求.
2008年,我在微软支持论坛上提出这个问题,回复是:
我们目前只接受VeriSign证书.我们没有压倒性的要求来支持其他类型的证书.
接受其他类型的证书不是"设置"可能意味着什么?
如果签署WinQual.exe测试应用程序的密钥的指纹与签署可执行文件的指纹相同,那就是你遇到的崩溃转储:它已被证明 - 它们是我的崩溃转储,将它们交给我.
并不像是有一个特殊的API来检查Verisign数字签名是否有效,而不是所有其他数字签名.无论谁生成密钥,有效签名都有效.
微软可以自由地不信任签名者,但这与身份不同.
所以这是我的问题,任何人都可以想到为什么WinQual没有设置为支持数字签名的任何实际原因?
一个人认为答案是他们只是懒惰:
不是我知道,但我认为运行winQual系统的团队是一个现场团队,而不是一个开发团队 - 就像在个性和技能组合中一样,旨在维护现有系统.我可能错了.
他们不想做改变它的工作.但是,任何人都可以想到任何需要改变的事情吗?无论生成密钥的是什么,它都是相同的逻辑:"指纹是否匹配".
我错过了什么?
很高兴听到其他开发者的故事.这样我知道我并不孤单,这个问题可以作为微软改变的工具.即使我最初的意图是一个抱怨的咆哮,为了保持这个有效的StackOverflow问题,我正在寻找技术原因,为什么微软只能接受Verisign证书.
加密API并不关心颁发证书的公司名称是什么:它只关心签名者链返回受信任的根.
特别是微软可能没有使用已建立的加密基础设施,但仅限于Verisign?
如果有人可以指向任何博客条目,程序经理或开发人员解释原因,我或许会满意.
人们似乎忽略了我的问题.Windows已经具有代码基础结构,以确保根权限信任数字签名证书.这是我们签名的可执行文件上的数字签名的屏幕截图.
您可以看到我们的证书是由Thawte的代码签名机构证书签署的,而证书又由Thawte签署:
替代文字http://i34.tinypic.com/2hi2cr8.jpg
默认情况下,"thawte"证书随Windows发布:
替代文字http://i38.tinypic.com/ydfr.jpg
该Thawte完美服务器CA是够好的了,Windows和Internet Explorer的每个副本已经信任它.并且已经有一个已建立的API来检查证书是否有效(即信任).
当Winqual的人来了,他们将不得不去他们的出路,以避免检查正确的方式,而是推出自己的解决方案,硬编码只威瑞作为一个受信任的根.为什么他们会不顾一切 …
我知道error_reporting(0);,和ini_set('display_errors', false);,但没有出现在WordPress的通知:
注意:第359行/var/www/vhosts/treethink.net/subdomains/parkridge/httpdocs/wp-includes/formatting.php中的数组到字符串转换
它只是出现在WordPress的,而不是在该网站的任何其他页面.
我检查了phpinfo(),一切都已设置,以便不显示错误.为什么这个仍然出现?
以下是生成错误的行:
function wp_check_invalid_utf8( $string, $strip = false ) {
$string = (string) $string;
Run Code Online (Sandbox Code Playgroud)
我确实在wordpress中改变了一些东西,改变了画廊的工作方式.但不是这个函数,我也不认为我改变了对这个函数的任何调用.除了出现的通知,一切似乎都运行得很好,我只需要隐藏这个错误.
我正在尝试在Laravel 4 beta上创建一个应用程序,但我无法调试它,因为它没有显示任何错误,display_errors是on,error_reportingis E_ALL和debug => true(config/app.php).当我尝试public/index.php对它执行错误时显示解析错误,但是当我在路由器上执行此操作时,它只显示一个空白页面(白屏死机).我怎样才能解决这个问题?
谢谢
我正在开展一个相当大的项目(多个团队),所以我无法完全控制代码.不幸的是,error_reporting在整个代码中的许多地方都发生了变化.当我到达代码中的某个点时,我想查看当前设置的错误报告.反正有没有完成这个?
即使error_reporting设置为0,数据库错误仍会打印到屏幕上.是否有某个设置我可以更改以禁用数据库错误报告?这适用于CodeIgniter v1.6.x.
编辑:回复:修复错误 - 嗯,是的.我想修复错误.我从错误日志中收到错误通知,而不是我的访问者看到打印到屏幕上的错误通知.这对任何人都没有帮助,并且会损害我系统的安全性.
编辑2:将error_reporting设置为0不会影响CodeIgniter的内置错误记录类写入错误日志.
我希望PHP在屏幕上显示解析错误.我得到的是一个空白页面.没有任何内容写入服务器的错误日志文件.
我的设置:PHP5.2.9/IIS 6(不是Apache!).
我的PHP.INI:
error_reporting=E_STRICT
display_errors = On
display_startup_errors = On
log_errors = On
error_log = "C:\Program Files\Zend\ZendServer\logs\php_error.log"
Run Code Online (Sandbox Code Playgroud)
如何记录或显示在屏幕上的解析或致命错误?
谢谢,Temuri
更新:使用不同的开关后,它看起来是一个IIS特定的问题.有什么想法吗?
我正在使用PHP-FPM运行nginx.我处理php文件的nginx配置如下所示:
location ~ \.php$ {
set $php_root /home/me/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $php_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
Run Code Online (Sandbox Code Playgroud)
现在,我有一个简单的php文件,如下所示:
<?php
ech "asd"
asd""
?>
Run Code Online (Sandbox Code Playgroud)
是的,有一个明显的错误.当我尝试访问php文件,而不是跟踪语法错误时,我总是得到HTTP 500内部服务器错误.我尝试使用error_reporting(-1);但仍然总是返回HTTP 500.如何让PHP打印确切的错误而不是返回通用HTTP 500?
PHP的mkdir函数只返回true和false.问题是它何时返回false.
如果我在启用错误报告的情况下运行,我会在屏幕上看到错误消息.我还可以在Apache日志中看到错误消息.但我想抓住消息的文本并用它做其他事情(例如通过IM发送给我自己).我如何获得错误文本?
更新:遵循艾曼的想法,我来到这里:
function error_handler($errno, $errstr) {
global $last_error;
$last_error = $errstr;
}
set_error_handler('error_handler');
if (!mkdir('/somedir'))
echo "MKDIR failed, reason: $last_error\n";
restore_error_handler();
Run Code Online (Sandbox Code Playgroud)
但是,我不喜欢它,因为它使用全局变量.想要更清洁的解决方案吗?
我正在寻找一种报告C库中错误的可靠方法.考虑一个简单的队列示例:
struct queue *q = malloc(sizeof(*q));
if (NULL == q) {
/* malloc failed. now what ? */
return NULL; /* maybe ? */
}
Run Code Online (Sandbox Code Playgroud)
好的,所以对于那个示例,返回NULL不是有效的,所以返回它以指示错误是有意义的.但
void *get_data()
{
/* stuff */
/* Error detected. NULL is a valid return, now what ? */
/* stuff */
}
Run Code Online (Sandbox Code Playgroud)
更重要的是,一旦我们发出错误信号,如何信号什么是错误?我已经考虑过了,并没有一个令人满意的解决方案.
使用errno或其他一些全局对象不是我想做的事情(也许这些函数可以从多个线程调用等).
我想让客户端提供一些可以在调用后检查的"状态"对象,但这会使API变得非常难看.
那么你对这个主题的看法是什么?你如何以干净的方式报告错误?