я имею миллиона (1000000) домены список.
+----+--------------+--------------------------+
| Id | Domain_Name | Correct_URL |
+----+--------------+--------------------------+
| 1 | example1.com | http://www.example1.com |
| 2 | example2.com | https://exmple2.com |
| 3 | example3.com | https://www.example3.com |
| 3 | example4.com | http://example4.com |
+----+--------------+--------------------------+
ID
а также Domain_Name
колонка заполнена.Correct_URL
столбец пуст.Вопрос : Мне нужно заполнить Correct_URL
колонка.
Проблема, с которой я сталкиваюсь, заключается в том, как найти префиксную часть перед доменом. Это может либо http://
или же http://www.
или же https://
или же https://www.
Как мне найти то, что сверху 4, используя PHP? Обратите внимание, что мне нужно запустить код для всех 1 000 000 доменов …. Поэтому я ищу самый быстрый способ проверить это …
Вы могли бы использовать cURL
метод:
$url_list = ['facebook.com','google.com'];
foreach($url_list as $url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_exec($ch);
$real_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
echo $real_url;//add here your db commands
}
Это займет несколько раз, потому что это последний переадресованный URL. если вы только хотите проверить, является ли его http
или же https
Вы можете попробовать это:
$url_list = ['facebook.com','google.com'];
foreach($url_list as $url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_exec($ch);
$real_url = curl_getinfo($ch, CURLINFO_REDIRECT_URL);
echo $real_url;//add here your db commands
}
На самом деле нет другого способа, кроме как сделать HTTP-запрос на каждую из возможностей и посмотреть, получите ли вы ответ.
Пока ты утверждаешь «Это может быть либо http: //, либо HTTP: // WWW. или https: // или https: // WWW.», реальные домены могут предоставлять ноль, некоторые или все или те (а также различные другие), и они могут отвечать на запросы OK или перенаправлениями или ошибками аутентификации и т. д.
HTTP и HTTPS не являются атрибутами веб-приложения; это протоколы связи, обрабатываемые конечной точкой (веб-сервером или брандмауэром приложения и т. д.).
Как и при любом сетевом обмене данными, необходимо проверить хост (в данном случае «www» — хост) и порт (не обязательно, но чаще всего) порта 80 и 443 соответственно. Это исследование — крик, затем вы ждете и посмотрите, есть ли служба, которая слушает с другой стороны.
По известному URL вы можете позвонить в версии http и / или https с помощью get_headers
Из их можно определить, доступен ли https, перенаправляет ли http на https и так далее.
Подробности можно найти здесь: http://php.net/manual/en/function.get-headers.php
Поэтому мне пришлось создать систему, аналогичную той, в которой мы проверяем предоставленные пользователем URL-адреса.
В конце концов, вам нужно установить порядок приоритетов, рекомендуемый порядок — HTTPS над HTTP и WWW без, так что вы получите список приоритетов, например:
Как и все остальные, вам необходимо проверить их с помощью cURL.
foreach($domainRows as $domainRow){
$scheme_list = ['https://www.','https://', 'http://www.', 'http://'];
$bestUrl = false;
foreach($scheme_list as $scheme){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $scheme.$domainRow['Domain_Name']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_exec($ch);
$real_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
if($real_url){
$bestUrl = $scheme.$domainRow['Domain_Name']
break;
}
}
if($bestUrl){
// you have the best URL to use as $bestUrl save it to your DB Row
}else{
// the site is not responding to any URL's do you need to do something here?
}
}
Или, основываясь на ответе Александра Холмана, о котором я полностью забыл get_headers
ты можешь сделать
foreach($domainRows as $domainRow){
$scheme_list = ['https://www.','https://', 'http://www.', 'http://'];
$bestUrl = false;
foreach($scheme_list as $scheme){
$res = get_headers($scheme.$domainRow['Domain_Name']);
// if you want to allow redirects remove/alter this part as it blocks them.
if($res && isset($res[0])){
$statusParts = explode(" ", $res[0]);
if($statusParts[1] == "200"){
$bestUrl = $scheme.$domainRow['Domain_Name'];
break;
}
}
//end of status check
//replace with below to allow all responses from server including 404
/*if($res){
$bestUrl = $scheme.$domainRow['Domain_Name'];
break;
}*/
}
if($bestUrl){
// you have the best URL to use as $bestUrl save it to your DB Row
}else{
// the site is not responding to any URL's do you need to do something here?
}
}
Этот код будет проверяться в порядке приоритета, и первый соответствующий ему код прекратит тестирование для других, и если он не найдет работающую систему, он сообщит вам об этом.
Благодаря Supun Praneeth, как я взял и дополнил там код, чтобы лучше соответствовать вашим потребностям.