Когда необходимо закрыть завиток и выпустить ресурсы, потребляемые им?
Почему я задаю этот вопрос, довольно просто потому, что мне сказали, что сборщик мусора PHP делает все это, а иногда нет необходимости закрывать соединение с БД или вызывать метод __destruct
для выпуска ресурсов.
Поскольку в этот момент я начал думать о том, где мне нужно позвонить? На данный момент меня интересует этот вопрос, так как я пишу небольшую библиотеку для завивки, и я хотел бы понять, когда мне нужно использовать curl_close()
.
Спасибо всем за обсуждение и объяснение этого.
насколько я понимаю. GC только очищает ресурсы, которые больше не используются / не упоминаются. так как всякий раз, когда переменная завитка выпадает из области видимости, она будет очищена. Но это может произойти только после завершения сценария или всякий раз, когда сеанс уничтожается (в зависимости от области действия).
Но чтобы быть в безопасности, просто следуйте здравому смыслу. Закройте его, когда его больше не нужно.
Результаты за 100 раз curl_exec
(выборка url с curl_exec
кэша):
for ($i = 0; $i < 100; ++$i) { $c = curl_init(); curl_setopt($c, CURLOPT_URL, "http://www.google.com/?rand=" . rand()); curl_exec($c); curl_close($c); }
8,5 секунд
$c = curl_init(); for ($i = 0; $i < 100; ++$i) { curl_setopt($c, CURLOPT_URL, "http://www.google.com/?rand=" . rand()); curl_exec($c); } curl_close($c);
5,3 секунды
Решение: если вы используете тонны вызовов, используйте более быстрый метод в качестве оптимизации. ( источник )
Зависит. В моем случае, поскольку я инициализировал экземпляр curl в своем пользовательском конструкторе CurlClient
$this->ch = curl_init();
И затем используя тот же объект $curlClient
для нескольких вызовов api, закрывая экземпляр
curl_close($this->ch);
повлияет на другие вызовы API. Методы с использованием одного и того же объекта не будут работать, поэтому я не закрываю его.