【问题标题】:Trapping PHP script's normal and abnormal termination捕获PHP脚本的正常和异常终止
【发布时间】:2012-06-20 05:40:47
【问题描述】:

我有一个 PHP 脚本有时会耗尽内存(进程耗尽它)并异常终止。我想知道 PHP 中是否有任何功能允许我在脚本终止时运行“清理”操作。我尝试了“关闭处理程序”,但它们似乎没有被调用。

我可以使用“信号处理程序”或“关闭回调”之类的东西吗?我想在脚本退出(正常或异常)时调用一个执行某些操作的函数。

【问题讨论】:

  • 此命令行是 PHP 还是作为 Web 应用程序的一部分运行? PHP 代码是否在任何类型的框架或库中?
  • 您是否考虑过数据库中的一个条目(不确定此脚本运行的频率),该条目表明它已启动并在脚本结束时被删除?只需查看表中的行,您就可以非常轻松地查看所有未能完成的脚本?
  • 这可能会有所帮助 - php.net/manual/en/function.pcntl-signal.php

标签: php event-handling shutdown


【解决方案1】:

PHP 中没有像您希望的那样工作的清理功能。您可以/应该做的是查看您的代码,了解如何最好地进行优化,以便在不耗尽内存的情况下完成您需要的操作。

PHP 有一个内置函数,可以让您获取分配给 PHP 的当前内存量,称为memory_get_usage。使用它,您可以检查 PHP 当前使用了多少内存,并将其与 php.ini 文件中分配的内存量进行比较。当你接近这个时,你可以退后或在另一个线程中继续这个线程。

这里有一些你可以做的事情来调整 PHP,也可能节省一些内存,其中一些你可能已经知道,但如果我遇到同样的问题,我会看看:

  • 尽可能增加php.ini 文件中的内存量,或者尝试使用ini_set 增加PHP 的内存大小。如果您增加内存量,这可能是问题的临时解决方案
  • 使用 unset 函数,因为这将释放/删除变量并恢复 PHP 使用的一些内存
  • 尽可能重用变量,这包括将代码封装在可重用的方法/函数中,以及充分利用 for/foreach/for..in 循环
  • 尽量不要在内存中长时间存储大量数据(文本或二进制)
  • 编写一个服务来卸载内存或处理器密集型操作,这样您的主代码就不会超时执行
  • 使用排队,这样您就不会被绑定到一个线程或脚本超时,以便处理您需要的一切。也许rabbitMQ 或其他软件包对您有用

PHP 应该能够处理大量数据和大量转换,但您可以采取任何措施来提高效率。

希望这会有所帮助, 利亚姆-

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多