有没有办法通过增强的错误日志消息或输出变量确定运行时使用的CORE PHP DIRECTIVES值的值?这与每个错误的phpinfo()输出相同.
一个基本的例子是error_reporting变量.如果/etc/php.ini值设置为x,并且phpinfo()声明该php.ini文件实际上是ini变量的预期来源.但是如果用户在代码中对该变量实现运行时调整,我们是否能够在抛出错误时输出error_reporting变量.
例如当php.ini文件有E_ALL&〜E_STRICT但日志文件中报告了E_STRICT错误时,有一种方法可以增强输出到日志文件,显示所有系统变量的"堆栈跟踪"可能通过添加到httpd日志的错误ID来激活或至少修改它们的源,以及报告的每个错误的源,该错误ID对应于在错误发生时显示那些运行时设置的可选文件.
我确实认识到可以使用try/catch,但我不相信可以在实际中实现混合第三方代码的大型部署.
这样的机制是否存在于PHP中,或者是否有人开发过(google说不太可能)?通过将变量设置的相关性与错误消息相关联来加速代码库的合并,这对于许多其他错误情况可能是有价值的.
我希望我只是看着这个错误,并且有一个简单的解决方法,我很想念.
谢谢!
在PHP中,如果您尝试实例化一个新的SoapClient,并且无法访问WSDL(服务器关闭或其他),则会抛出PHP致命错误:
致命错误:SOAP-ERROR:解析WSDL:无法从" http://example.com/servlet/app/SomeService?wsdl "加载:无法加载外部实体" http://example.com/servlet/app/SomeService?wsdl "
据我所知,PHP中的致命错误无法恢复.
有什么方法可以退缩吗?这种致命错误能否以某种方式避免?
编辑:我应该说我在PHP 5.2上运行,如果它有任何区别.
我收到了这个令人讨厌的错误Fatal error: Out of memory (allocated 18087936) (tried to allocate 77824 bytes).奇怪的是,它是17,25 mb(分配),它试图分配76 kb.内存限制为128MB,正如您所看到的那样,它甚至都不接近.VPS在那一刻得到了约400mb的免费撞击.它只发生在我发布的东西而不是所有的时间.我发现它很奇怪,并不知道是什么导致它.如果您需要任何其他信息,请与我们联系.
我需要一种方法来捕获PHP致命错误(还有通知和警告)并使用Monolog记录它们.
我发现Monolog 1.6+有ErrorHandler :: register()方法,但我无法弄清楚如何在Symfony2(生产)应用程序中使用它,以及如何在config.yml中正确配置它.
当我们的网站遇到内部服务器错误时,我正在尝试收集信息.我们有许多应用程序从未设置正确的错误日志记录,当出现问题时,我们的客户端不会向我们提供最佳信息.我想做的是,当500发生时,我想收集有关问题发生位置的数据,例如:
我使用以下配置在我们的服务器(IIS 7)上设置了自定义错误页面:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="500" />
<error statusCode="500" path="/error.php?code=500" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
在那个页面上,我只是var_dump-ing $ _POST和$ _GET,看看这些内容是否有任何内容进入错误页面,但事实并非如此.我对500错误的目标是:
有没有办法收集这些数据并让自定义错误页面看到它?
error.php:
switch($ErrorCode){
case '500':
var_dump($_REQUEST, $_POST, $_GET);
echo "internal server error";
break;
}
Run Code Online (Sandbox Code Playgroud)
在所有情况下,$ _POST都是空的,即使我提交了一个表单来获取此错误并且$ _GET包含此内容(这是有道理的):
array(2) {
["code"]=>
string(3) "500"
["500;http://icom-sbs/test_php"]=>
string(0) ""
}
Run Code Online (Sandbox Code Playgroud)
4/19更新
我玩了一些想法,主要是在会话变量中存储有用的数据.我试图将一些表单数据存储在测试页面上的会话变量中,该变量会产生错误,但它永远不会进入会话.看起来服务器检测到页面上会发生错误,因此它甚至不会在页面上执行任何代码并立即执行错误页面.
我为404,403等自定义错误文档设置了apache指令,以及500.但是,遇到致命错误时,PHP显示空白页而不是触发apache 500响应.
我不需要显示错误详细信息或类似的内容,因为它们当前在apache error_logs中正确记录,因此我认为它与error_reporting或display_errors没有任何关系,两者都设置正确.
这里有一些类似的问题,但没有找到满足我需要的答案.基本上,在类似语法错误的情况下,我想看到apache 500错误页面,而不是空白页面.这不是可以在PHP中捕获和处理的东西,因为语法错误是无法捕获的.
这似乎已在php 5.2.4中修补/修复,如下所示:http://www.mail-archive.com/internals@lists.php.net/msg28557.html
但是,我们使用的是PHP 5.2.17,目前升级是不可行的.有没有人有任何解决方案/解决方法可能会导致任何PHP语法/致命错误在apache中触发500错误?
我们都知道这个错误:
Fatal error: Out of memory (allocated 32016932) (tried to allocate 25152 bytes)
Run Code Online (Sandbox Code Playgroud)
有办法处理这个错误吗?也许是执行的函数调用?这不是真正的堆栈溢出,它是系统强加的限制.人们会认为这里会有一点灵活性.我在本地缓存大量数据进行处理,但我有一个垃圾收集功能.我已经有功能设置来检查内存使用情况和可用内存是否超过一定限度,但我有时会错过.如果我可以在这个"致命"错误上调用我的函数......那么,在一个理想的世界中,程序应该能够恢复.
我的php.ini设置是memory_limit = 500M.
有什么想法吗?
非常感谢所有对此发表评论的人,但感谢@Wrikken提出的出色建议.
这是我最终做的事情:
declare(ticks=1);
register_tick_function('TickFunction');
function TickFunction() {
if(memory_get_usage()>220000000) // 220M
{
GlobalDataStore::CheckMemory(); // my garbage collection function
}
}
Run Code Online (Sandbox Code Playgroud)
我的php.ini内存限制设置远远高于我想要运行的内存限制,并且tick函数负责内存监控并根据需要释放内存.
我有一个PHPUnit测试套件,由于没有找到类定义,目前正在导致致命错误.最终,这是测试代码本身的失败以及开发人员在提交代码之前未能证明测试本身.
然而,这样的事情确实时有发生,如果在发生致命错误时(无论谁最终负责),测试只是标记为失败,测试套件的其余部分仍然是执行.
我已经阅读过关于--process-isolation开关的信息,据我所知,应该注意这一点.由于每个测试都在一个单独的过程中运行,如果孩子由于致命错误而死亡,父母仍然可以继续运行.实际上,这在类似问题的答案中明确说明:https://stackoverflow.com/a/5340151/84762,它显示了我希望自己看到的确切输出类型.
但是,无论是否使用--process-isolation标志,我似乎都得到完全相同的输出:
没有过程隔离
[kogi@phagocyte ~]$ /usr/bin/phpunit --colors --verbose --coverage-html "target/coverage" ~/app/zend/tests/application/
PHP Fatal error: Class 'Rmd_Database_OldObject' not found in /home/kogi/app/zend/private/models/translate/Poll.php on line 9
PHP Stack trace:
PHP 1. {main}() /usr/bin/phpunit:0
PHP 2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:46
PHP 3. PHPUnit_TextUI_Command->run() /usr/share/pear/PHPUnit/TextUI/Command.php:130
PHP 4. PHPUnit_Runner_BaseTestRunner->getTest() /usr/share/pear/PHPUnit/TextUI/Command.php:150
PHP 5. PHPUnit_Framework_TestSuite->addTestFiles() /usr/share/pear/PHPUnit/Runner/BaseTestRunner.php:96
PHP 6. PHPUnit_Framework_TestSuite->addTestFile() /usr/share/pear/PHPUnit/Framework/TestSuite.php:419
PHP 7. PHPUnit_Util_Fileloader::checkAndLoad() /usr/share/pear/PHPUnit/Framework/TestSuite.php:358
PHP 8. PHPUnit_Util_Fileloader::load() /usr/share/pear/PHPUnit/Util/Fileloader.php:79
PHP 9. include_once() /usr/share/pear/PHPUnit/Util/Fileloader.php:95
PHP 10. require_once() /home/kogi/app/zend/tests/application/translate/PollTest.php:11
Fatal …Run Code Online (Sandbox Code Playgroud) php error-handling continuous-integration phpunit unit-testing
我正在尝试在Symfony中配置电子邮件日志记录.我按照食谱进行了操作,但我遇到致命错误的问题.
这些错误未记录在prod模式中.我发现当我添加Debug::enable();到app.php时,会记录错误,但是我仍然没有收到电子邮件.
以下是相关配置:
mail:
type: fingers_crossed
action_level: critical
handler: buffer
buffer:
type: buffer
handler: swift
swift:
type: swift_mailer
from_email: %error_mail_from%
to_email: %error_mail_to%
subject: %error_mail_subject%
level: debug
Run Code Online (Sandbox Code Playgroud) 我有一个方法接受类型的参数,string但他们也可以null.我怎么能抓住这个致命错误?
Fatal error: Uncaught TypeError: Argument 5 passed to Employee::insertEmployee() must be of the type string, null given,
在以下代码中:
public function insertEmployee(string $first_name, string $middle_name, string $last_name, string $department, string $position, string $passport)
{
if($first_name == null || $middle_name == null || $last_name == null || $department == null || $position == null || $passport == null) {
throw new InvalidArgumentException("Error: Please, check your input syntax.");
}
$stmt = $this->db->prepare("INSERT INTO employees (first_name, middle_name, last_name, department, …Run Code Online (Sandbox Code Playgroud) php ×8
apache ×3
logging ×2
monolog ×2
symfony ×2
fatal-error ×1
iis ×1
php-5.2 ×1
phpunit ×1
soap ×1
soap-client ×1
unit-testing ×1
wordpress ×1