使用多线程的方式同时进行 curl 和 file_get_contents 函数的调用,并使用 curl_multi_exec 函数来执行多个 curl 句柄。根据每个请求的返回结果来判断哪个函数先获取到标题,并停止未获取完标题的函数的执行。

下面是一个简单的示例代码:

function getTitle($url) {
    $curlHandle = curl_init();
    curl_setopt($curlHandle, CURLOPT_URL, $url);
    curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curlHandle, CURLOPT_HEADER, true);
    curl_setopt($curlHandle, CURLOPT_NOBODY, true);
    
    $fileHandle = fopen($url, 'r');
    
    $curlMultiHandle = curl_multi_init();
    curl_multi_add_handle($curlMultiHandle, $curlHandle);
    
    $running = null;
    do {
        curl_multi_exec($curlMultiHandle, $running);
    } while ($running);
    
    $contents = stream_get_contents($fileHandle);
    fclose($fileHandle);
    
    preg_match('/<title>(.*)</title>/i', $contents, $title);
    $title = str_replace(array("
", "
", "
", ',', ' '), '', $title[1]);
    
    curl_multi_remove_handle($curlMultiHandle, $curlHandle);
    curl_multi_close($curlMultiHandle);
    
    return $title;
}

$t_url = 'https://example.com';

$curlTitle = '';
$fileGetContentsTitle = '';

$curlHandle = curl_init();
curl_setopt($curlHandle, CURLOPT_URL, $t_url);
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true);

$fileGetContentsTitle = getTitle($t_url);

$curlMultiHandle = curl_multi_init();
curl_multi_add_handle($curlMultiHandle, $curlHandle);

$running = null;
do {
    curl_multi_exec($curlMultiHandle, $running);
    
    $info = curl_multi_info_read($curlMultiHandle);
    if ($info && $info['handle'] === $curlHandle) {
        $curlTitle = getTitle($t_url);
        break;
    }
} while ($running);

curl_multi_remove_handle($curlMultiHandle, $curlHandle);
curl_multi_close($curlMultiHandle);

$title = $curlTitle !== '' ? $curlTitle : $fileGetContentsTitle;

在上面的代码中,我们首先定义了一个getTitle函数,用于获取网站的标题。该函数中,我们使用了 curl 和 file_get_contents 函数来获取网站的内容,并解析出标题。然后,在主程序中,我们同时执行了 curl 和 file_get_contents 函数,并使用 curl_multi_exec 函数来执行多个 curl 句柄。通过判断每个请求的返回结果,来确定哪个函数先获取到标题,并停止未获取完标题的函数的执行。最后,根据哪个函数先获取到标题,来确定最终的 $title 变量的值。

PHP 优化获取网站标题速度:使用 Curl 和 File_get_contents 并行

原文地址: https://www.cveoy.top/t/topic/o7Rv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录