0); // Check results foreach ($handles as $port => $ch) { $err = curl_errno($ch); // CURLE_COULDNT_CONNECT (7) = port closed, others might mean open or filtered if ($err !== CURLE_COULDNT_CONNECT) { $openPorts[] = $port; } curl_multi_remove_handle($multiHandle, $ch); curl_close($ch); } curl_multi_close($multiHandle); } } else { // Sequential fallback foreach ($ports as $port) { $fp = @fsockopen($ip, $port, $errno, $errstr, $timeoutSec); if ($fp !== false) { $openPorts[] = $port; fclose($fp); } } } sort($openPorts); return $openPorts; } }