Как использовать & quot; запасной вариант & quot; метод для PHP curl (HTTPS)?

Добрый день,

ситуация: Я улучшаю код в веб-приложении для мониторинга на основе PHP, которое проверяет работоспособность других веб-приложений / служб.

Цель: мы используем CURL в качестве основного метода для получения заголовков, чтобы обеспечить доступность отслеживаемого приложения через коды возврата HTTP. Это прекрасно работает на данный момент. Однако мы пытаемся создать «запасной» метод, в котором, если ответ HTTP-кода CURL от отслеживаемого приложения находится за пределами наших определенных переменных (т. Е. Http-код 404), тогда PHP будет использовать PING-подобную функцию, чтобы проверить, есть любой ответ по тому же адресу (например, веб-сервер все еще «работает» (занимает данный порт), но не обслуживает надлежащие заголовки).

проблема: Наш резервный метод (stream_socket_client) работает для незащищенных сайтов, так как мы можем просто определить «hostname: port», который ОБА могут использовать curl и stream_socket_client. Однако, если мы хотим отслеживать защищенный сайт (HTTPS), curl требует, чтобы протокол HTTPS был определен до хоста, что приведет к сбою функции нашего резервного метода (stream_socket_client), так как он использует только формат host: port.

Так, например:

$ URL: https://example.com:443 (это превратит «ХОРОШИЙ» ответ CURL, но ответ down_socket_client)

$ URL: example.com:443 (это будет возвращать «UP» stream_socket_client ответ, но «DOWN» CURL ответ)

Итак, если мы использовали https://example.com:443 как наш URL, так и веб-сервер перестал отвечать на запросы, но все еще работает на этом порту, оба не удастся, потому что HTTP определены.

Это упрощенная версия нашего текущего кода:

« `

            $url = "example.com:80";

function curl($url) {$handle = curl_init($url);
curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($handle, CURLOPT_HEADER, true);
curl_setopt($handle, CURLOPT_NOBODY, true);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($handle, CURLOPT_URL, $url);

$response = curl_exec($handle);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);if($httpCode >= 200 && $httpCode < 400 || $httpCode == 401 || $httpCode == 405) {

echo "CURL GOOD, $httpCode";
echo "STATUS: GREEN";
}

else {

$fp = stream_socket_client("$url", $errno, $errstr);

if (!$fp) {
echo "CURL BAD, PING DOWN";
echo "STATUS: RED";
}

else {
echo "CURL BAD PING UP";
echo "STATUS: YELLOW";
}
}

curl_close($handle);

};
?>

« `

Итак … есть идеи, как использовать запасной метод, чтобы проверить, открыт порт или нет? Я не должен придерживаться PHP, могу использовать JS, но предпочел бы PHP.

Спасибо!

РЕДАКТИРОВАТЬ 1:

Благодаря @ drew010 я знаю, что в конечном итоге мне нужно использовать fsockopen. Тем не менее, мне нужно использовать parse_url (), который затем может передать «стерильный» URL в fsockopen для проверки «ping».

Тем не менее, я не уверен, как раздеть ТОЛЬКО протокол и оставить порт и дополнительный путь (если определен). Я также не уверен, как передать стерильный URL в функцию fsockeopn, чтобы использовать для проверки. Пока у меня есть код ниже, но я знаю, что мне не хватает некоторого кода. Любая помощь будет оценена!

Код ниже разбирает http://example.com на example.com.

function parseurl($url) {
$url = 'http://example.com:80';
$host = parse_url($url, PHP_URL_HOST);

//this works for stripping protocol and "wwww" but need to leave port and sub path if defined.

if (!$host)
$host = $url;

if (substr($host, 0, 4) == "www.")
$host = substr($host, 4);
if (strlen($host) > 50)
$host = substr($host, 0, 47) . '...';
return $host;
}// How to pass steril URL to PING function??

function ping($host, $timeout = 1) {

if (!fsockopen($host, $port, $errno, $errstr, $timeout)) {
return false;
echo "OPEN";
}

else {
echo "CLOSED";
}
}

-1

Решение

Нашел ответ:

Этот скрипт использует CURL, чтобы проверить, обслуживает ли данный HOST веб-страницу.
Если НЕТ, используйте функцию PING, чтобы проверить, прослушивает ли что-либо данный порт.

<?php

* This script uses CURL to check if given HOST is serving a webpage.
* If NOT, use a PING function to check if anything is listening on given port.
//* URL MUST contain a PORT after HOST
//* URL CAN include any protocol or sub-path// sanitizes URL to host:port:path ONLY. (if PORT, PATH don't exist, it is ignored):

function url_to_domain($url) {

$url = 'http://google.com:80';

echo "Input URL ..... $url<br />\n";

$host = parse_url($url, PHP_URL_HOST);
$port = parse_url($url, PHP_URL_PORT);
$path = parse_url($url, PHP_URL_PATH);

// If the URL can't be parsed, use the original URL
// Change to "return false" if you don't want that

if (!$host)
echo "fail";
// $host = $url;

// remove "http/s" and "www" :

if (substr($host, 0, 4) == "www.")
$host = substr($host, 4);
if (strlen($host) > 50)
$host = substr($host, 0, 47) . '...';

// contruct sanitized URL, add ":port/path" to HOST:

return $host . ":" . $port . $path;

}// pings "sanitized" URL:

$url = (url_to_domain($url));

$fp = pfsockopen($url, $errno, $errstr, $timeout = 5);
if (!$fp) {

echo "Ping URL ...... $url <br />\n ";
echo "URL status ..... CLOSED <br />\n";
echo "Error ............... $errstr ($errno)<br />\n";

}

else {
// $out = "GET / HTTP/1.1\r\n";
// $out .= "$url\r\n";
// $out .= "Connection: Close\r\n\r\n";
//fwrite ($fp, $out);
//displays header:
/*
while (!feof($fp)) {
echo fgets($fp, 128);
}
*/
// fclose($fp);

echo "Ping URL ...... $url <br />\n  ";
echo "URL status .... OPEN";

}?>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]