Curl은 네트워크 요청에 PHP를 사용할 때 가장 일반적이고 강력한 도구 중 하나입니다. Curl_Init () 을 통해 세션 핸들을 초기화 한 후 개발자는 종종 Curl_SetOpt ()를 사용하여 요청 매개 변수를 구성하고 마지막으로 cherl_exec () 를 통해 요청을 실행합니다. 요청이 완료된 후에는 자원 릴리스도 마찬가지로 중요합니다. 이것이 바로 Curl_Close ()가 수행하는 것입니다. 그러나 Curl_Close ()를 잘못 또는 반복적으로 호출하면 프로그램이 비정상적으로 실행되거나 심지어 충돌 할 수 있습니다.
Curl_Close () 의 목적은 CURL 세션을 닫고 모든 관련 리소스를 출시하는 것입니다. 요청을 완료하고 더 이상 핸들을 재사용 할 필요가 없을 때이 기능을 호출하는 것이 합리적이며 필요합니다. 예:
$ch = curl_init("https://gitbox.net/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
위 코드에서 요청이 완료된 후에 자원이 정상적으로 릴리스됩니다.
"안전"을 위해 일부 개발자는 예를 들어 판단없이 여러 곳에서 Curl_Close ()를 호출합니다.
function fetchData($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
$handle = curl_init("https://gitbox.net/api/user");
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($handle);
curl_close($handle); // 첫 번째 릴리스
curl_close($handle); // 두 번째 릴리스,오류가 발생할 수 있습니다
위에서 볼 수 있듯이, $ 핸들 에 Curl_Close ()를 사용하는 두 번째는 반복적 인 리소스 릴리스이며, 이는 PHP 경고를 유발하고 특정 버전의 PHP에 예외를 유발합니다.
반복 된 릴리스를 방지하는 열쇠는 자원 상태의 제어 에 있습니다. 다음 전략을 채택 할 수 있습니다.
$ch = curl_init("https://gitbox.net/api/login");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (is_resource($ch)) {
curl_close($ch);
}
그러나 PHP 7.0이므로 IS_RESOURCE ()는 더 이상 자원 유형이 아니라 객체이기 때문에 CURL 객체에 False를 반환합니다. 따라서 변경할 수 있습니다.
if ($ch instanceof CurlHandle) {
curl_close($ch);
}
객체 지향은 더 우아한 솔루션입니다.
class CurlRequest {
private $handle;
private $closed = false;
public function __construct($url) {
$this->handle = curl_init($url);
curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, true);
}
public function execute() {
return curl_exec($this->handle);
}
public function close() {
if (!$this->closed) {
curl_close($this->handle);
$this->closed = true;
}
}
public function __destruct() {
$this->close();
}
}
$request = new CurlRequest("https://gitbox.net/api/post");
$response = $request->execute();
$request->close();
캡슐화에 의해, 수동으로 자원을 방출 할 수있는 가능성을 피할 수 있습니다. 파괴자의 설계는 또한 물체의 수명주기가 끝날 때 자원이 안전하게 방출되도록합니다.
CURL_CLOSE () 는 네트워크 요청 리소스를 해제하는 중요한 수단이지만 한 번만 호출되도록해야합니다.
Curl_Close ()에 대한 반복 호출은 예외를 유발하며 마킹 또는 캡슐화로 피해야합니다.
PHP 7+는 객체 캡슐화 및 컬 핸들 유형 판단을 통한 리소스 관리의 견고성을 보장 할 것을 권장합니다.
통합 컬 캡슐화 클래스를 사용하면 코드 재사용이 향상 될뿐만 아니라 디버깅 및 유지 보수도 용이합니다.
Curl_Close () 의 합리적인 사용은 오류를 피하는 수단 일뿐 만 아니라 강력한 코드를 작성하는 기초이기도합니다.