【问题标题】:How to catch or prevent calling of exit, die如何捕捉或防止调用退出,死亡
【发布时间】:2014-12-18 00:25:02
【问题描述】:

我使用适用于 Windows 的 QuickBooks。并且 Windows 应用程序调用我的后端,在某些库脚本中它调用 exit 或 die ...所以我无法捕获响应,需要检测退出运行的位置或在退出前捕获输出。 例如

try{
    $lib->run();
} catch on exit ($output) {
    log($output);
}

所以当我启用 QuickBooks_WebConnector_Handlers::HOOK_LOGINSUCCESS 钩子时,也许有人知道它会调用 exit...并且调试器显示它不会在挂钩时进入我的函数...所以它之前就死了。

【问题讨论】:

  • 好的,但我怎样才能捕获输出或调用 exit 的地方?
  • 好的,谢谢,希望它会有所帮助......但主要我需要知道退出的位置......甚至没有输出
  • @OlegPatrushev 我是您正在使用的 QuickBooks 库的作者。具体为什么需要知道出口在哪里;被调用?具体来说,您遇到了什么问题导致您需要知道这一点?你能把你的代码贴出来让我们看看你在做什么吗?

标签: php quickbooks


【解决方案1】:

我是您正在使用的 QuickBooks 库 (https://github.com/consolibyte/quickbooks-php) 的作者。

库调用 exit()/die() 有一个很好的理由——因为如果你在它调用 exit/die 之后做任何事情,你将破坏 SOAP 输出和库的日志记录并破坏你的QuickBooks 集成。库中内置了许多非常多的挂钩点,专门用于让您做任何事情,而不必担心退出或死亡的调用。

根据你所说的,大约有 99.9% 的可能性是你在做一些你不应该在代码中出现的事情,或者你的代码中有 PHP 或 SQL 错误你没有看到。

发布您的代码,并告诉我们为什么您认为您需要赶上退出/死亡的呼叫,我可以编辑我的问题以进一步帮助您。

【讨论】:

  • 很荣幸能与如此重要和有用的库的开发人员交谈。所以首先我想说,虽然库在 packagist.org 下可用,这意味着它可能与 5.4(命名空间等)和我认为的 zf2 兼容,但原则上不是。问题的另一面是有时调试需要很多时间。因为我无法捕捉到退出呼叫或出现问题的地方。另外我不知道为什么,但有时在图书馆倒下后它不会写任何日志,但在意料之中。
  • 例如,如果我使用包含很多属性的 zf2 工厂服务(例如 $service = new Service(); $service->subService = new SubService(); 等),那么这部分代码 $callback 是 $service instance $Driver->log('Calling auth callback [' . $type . ']: ' . print_r($callback, true), null, QUICKBOOKS_LOG_DEVELOP);将记录很多不必要的信息或崩溃而无需记录,也不了解原因、位置等。
  • 我花了很多时间找到这个地方,然后将钩子从类方法更改为简单的函数。我认为库必须改进,开发以兼容 5.4 和 ZF2 等现代框架。感谢关注!
  • Keith,我能问你个问题吗,那么我该如何添加来自后端的响应错误?例如:在我的 importInvoiceResponse() 方法列表中的发票中,如果我检测到其中一些不符合我的规则(丢失、无效参数等),我需要向 Windows 应用程序的客户端显示他添加了无效发票并需要改变一些东西。也许可以使用一些errorInvoiceRequest方法?
  • 它在 ZF2 上运行良好——我们一直在使用它。 PHP 永远不会在不编写某种日志的情况下发生故障——您是否启用了将 PHP 错误记录到文件的功能?你应该。使用 php.net/error_log 将信息写入日志,以便您进行调试。调试应该是快速和简单的,如果不是那么你做错了什么。如果您有更多问题,更适合在我们的支持论坛上提问:consolibyte.com/forum 确保您发布您的代码,以便我们真正为您提供帮助。
【解决方案2】:

在这种情况下,您可以使用此功能:

void register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] )

它将在 PHP 脚本完全退出之前执行一个回调函数
它也可以接受多个混合类型的参数

【讨论】:

  • exit 在这个库中的工作方式类似于抛出异常......甚至不需要输出我需要......因为退出调用作为规则没有消息......我需要找到它所在的地方!
【解决方案3】:

无法阻止exit的执行
提示是编写自己的退出函数,如下例:

customExit($output){
    log($output);
    exit;
}

之后您必须搜索结束替换所有出现的exit PHP 语言结构,并将它们替换为customExit($output) 函数

希望对你有帮助:)

【讨论】:

  • 谢谢,但这并没有什么好处,因为 lib 在 zf2 中的供应商之下,这将在每次作曲家更新及其在 lib 中的大约 100500 次退出调用时被覆盖......所以需要其他任何东西跨度>
猜你喜欢
  • 2011-04-05
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多