PHP 优化获取网站标题速度:使用 Curl 和 File_get_contents 并行
使用多线程的方式同时进行 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 变量的值。
原文地址: https://www.cveoy.top/t/topic/o7Rv 著作权归作者所有。请勿转载和采集!