在PHP中,在curl_init之后引发异常安全吗

在PHP中,在curl_init之后引发异常安全吗,php,Php,最好举例说明: public function runRequest() { $ch = curl_init(); //.... Set Curl Options .... $response = curl_exec($ch); if ($response === false) throw new Exception('Boom! A feck, didnt close $ch'); curl_close($ch); } 只是想知道这

最好举例说明:

public function runRequest()
{
    $ch = curl_init();
    //.... Set Curl Options ....
    $response = curl_exec($ch);

    if ($response === false)
        throw new Exception('Boom! A feck, didnt close $ch');

    curl_close($ch);
}
只是想知道这安全吗?我们会妥善处理$ch吗

如果没有,我可以将$ch更改为类变量,并在析构函数中销毁


想法?提前感谢

在引发异常之前,您需要关闭句柄

if (!$response)
{
    curl_close($ch);
    throw new Exception('Boom! No response...');
}
当您抛出异常时,它将停止执行该部分中的任何代码,并冒泡到您捕获它的位置,否则您将得到:

Fatal error: Uncaught exception
另一方面,如果你不关上把手,问题就没那么大了。只是不要养成这样的习惯


然而,再次查看您的代码,您的异常没有意义。在这种情况下,您将关闭它…

您将希望在引发异常之前关闭句柄

if (!$response)
{
    curl_close($ch);
    throw new Exception('Boom! No response...');
}
当您抛出异常时,它将停止执行该部分中的任何代码,并冒泡到您捕获它的位置,否则您将得到:

Fatal error: Uncaught exception
另一方面,如果你不关上把手,问题就没那么大了。只是不要养成这样的习惯

然而,再次查看您的代码,您的异常没有意义。在这种情况下,您将关闭它…

$ch将超出范围,因此有资格进行垃圾收集。当这种情况发生时,资源将被正确地释放和关闭。至少在脚本执行结束时,所有资源都将被正确处置。因此,实际上没有必要手动关闭资源;但将资源使用率保持在尽可能低的水平是一种好的做法,尤其是对于长时间运行的脚本

PHP5.5特性try..catch..finally,它允许您始终关闭此类资源,即使在引发异常的情况下也是如此。但我刚刚意识到这并不适用于这种情况。

$ch将超出范围,因此有资格进行垃圾收集。当这种情况发生时,资源将被正确地释放和关闭。至少在脚本执行结束时,所有资源都将被正确处置。因此,实际上没有必要手动关闭资源;但将资源使用率保持在尽可能低的水平是一种好的做法,尤其是对于长时间运行的脚本


PHP5.5特性try..catch..finally,它允许您始终关闭此类资源,即使在引发异常的情况下也是如此。我刚刚意识到这并不适用于这种情况。

+1,这真的很有用,特别是5.5的东西,谢谢!我可以假设将Curl封装在它自己的类上,并让超出范围的处理析构函数,或者这会是过度杀戮吗?@angeloverkill。正如我所说,当资源超出范围时,它们已经被自动释放,将这个已经存在的功能包装到另一个类中是毫无意义的。回答得很好。至于overkill,我更喜欢使用已经制作好的面向对象的curl包装器。目前的系统使用起来非常烦人。对于Codeigniter f.ex。Phil Sturgeo提供了一款出色的卷发火花。另外,请查看-摆脱对卷发的烦人依赖。+1,这真的很有用,特别是5.5的东西,谢谢!我可以假设将Curl封装在它自己的类上,并让超出范围的处理析构函数,或者这会是过度杀戮吗?@angeloverkill。正如我所说,当资源超出范围时,它们已经被自动释放,将这个已经存在的功能包装到另一个类中是毫无意义的。回答得很好。至于overkill,我更喜欢使用已经制作好的面向对象的curl包装器。目前的系统使用起来非常烦人。对于Codeigniter f.ex。Phil Sturgeo提供了一款出色的卷发火花。另外,请查看-摆脱对卷发的烦人依赖。为什么它没有意义?因为您的异常被抛出,说您没有关闭$ch,但是它前面的if语句没有检查您是否关闭了$ch:exception描述是描述性的,以使我的观点得到理解,但它会引发响应失败。因此,我想知道如果我抛出一个异常而不关闭curlah,PHP会正确清理吗?啊,是的,它会清理得很好:你不必担心,它是自动的。为什么没有意义?因为抛出异常是为了说你没有关闭$ch,但是它前面的if语句没有检查您是否关闭了$ch:exception描述是描述性的,以使我的观点得到理解,但它会引发响应失败。因此,我想知道如果我抛出一个异常而不关闭curlah,PHP会不会正常清理。啊,是的,它会清理得很好:你不必担心,它是自动的。