#php #email
#php #Адрес электронной почты
Вопрос:
У меня есть скрипт, который проверяет веб-сайт ($host) на наличие строки символов ($find). Если строка существует, ничего не происходит, если строка не найдена, тогда электронное письмо отправляется на заранее установленный адрес электронной почты.
Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно иметь массив URL-адресов, и я полагаю, что второй массив текста. Текст в массиве должен совпадать с URL-адресом в массиве.
Возможно, лучшим решением может быть сохранение URL и текста в текстовых файлах.
Вот скрипт в том виде, в каком он есть сейчас, работающий на одном домене.
<?php
$host = 'www.my-domain.com';
$find = 'content on my page';
function check($host, $find) {
$fp = fsockopen($host, 80, $errno, $errstr, 10);
if (!$fp) {
echo "$errstr ($errno)n";
} else {
$header = "GET / HTTP/1.1rn";
$header .= "Host: $hostrn";
$header .= "Connection: closernrn";
fputs($fp, $header);
while (!feof($fp)) {
$str.= fgets($fp, 1024);
}
fclose($fp);
return (strpos($str, $find) !== false);
}
}
function alert($host) {
mail('mail@my-domain.com', 'Monitoring', $host.' down');
}
if (!check($host, $find)) alert($host);
?>
Новый код с массивом на месте:
$hostMap = array(
'www.my-domain.com' => 'content on site',
'www.my-domain2.ca' => 'content on second site',
);
foreach ($hostMap as $host => $find)
{
function check($host, $find)
{
$fp = fsockopen($host, 80, $errno, $errstr, 10);
if (!$fp)
{
echo "$errstr ($errno)n";
} else {
$header = "GET / HTTP/1.1rn";
$header .= "Host: $hostrn";
$header .= "Connection: closernrn";
fputs($fp, $header);
while (!feof($fp)) {
$str.= fgets($fp, 1024);
}
fclose($fp);
return (strpos($str, $find) !== false);
}
}
function alert($host)
{
mail('my-email@my-domain.com', 'Website Monitoring', $host.' is down');
}
print $host;
print $find;
//if (!check($host, $find)) alert($host);
if( !check( $host, $find ) )
{
alert($host);
}
}
?>
Переместил функции за пределы foreach(
ini_set( 'display_errors', true );
$hostMap = array(
'www.my-domain.com' => 'content on site',
'www.my-domain2.ca' => 'content on second site',
);
function check($host, $find)
{
$fp = fsockopen($host, 80, $errno, $errstr, 10);
if (!$fp)
{
echo "$errstr ($errno)n";
} else {
$header = "GET / HTTP/1.1rn";
$header .= "Host: $hostrn";
$header .= "Connection: closernrn";
fputs($fp, $header);
while (!feof($fp)) {
$str.= fgets($fp, 1024);
}
fclose($fp);
return (strpos($str, $find) !== false);
}
}
function alert($host)
{
mail('my-email@my-domain.com', 'Website Monitoring', $host.' is down');
}
print $host;
print $find;
//if (!check($host, $find)) alert($host);
foreach ($hostMap as $host => $find)
{
if( !check( $host, $find ) )
{
alert($host);
}
}
?>
Вот окончательный код с рабочим массивом на случай, если кому-то еще понадобится подобное решение.
function check($host, $find)
{
$fp = fsockopen($host, 80, $errno, $errstr, 10);
if (!$fp)
{
echo "$errstr ($errno)n";
} else {
$header = "GET / HTTP/1.1rn";
$header .= "Host: $hostrn";
$header .= "Connection: closernrn";
fputs($fp, $header);
while (!feof($fp)) {
$str.= fgets($fp, 1024);
}
fclose($fp);
return (strpos($str, $find) !== false);
}
}
function alert($host)
{
$headers = 'From: Set your from address here';
mail('my-email@my-domain.com', 'Website Monitoring', $host.' is down' $headers);
}
$hostMap = array(
'www.my-domain.com' => 'content on site',
'www.my-domain2.com' => 'content on second site',
);
//if (!check($host, $find)) alert($host);
foreach ($hostMap as $host => $find)
{
if( !check( $host, $find ) )
{
alert($host);
}
}
unset($host);
unset($find);
?>
Комментарии:
1. На 3-й итерации кода есть foreach, который, похоже, не проходит через массив. Проверяется только первый сайт в массиве. Единственное сообщение, которое я получаю, это «Неопределенная переменная: str в /srv/www/php/php_testing/monitor.php в строке 25». Я не уверен, в чем моя ошибка.
Ответ №1:
$hostMap = array(
'www.my-domain.com' => 'content on my page',
/* etc. */
);
foreach( $hostMap as $host => $find )
{
if( !check( $host, $find ) )
{
alert($host);
}
}
Однако имейте в виду, что — в зависимости от количества проверяемых доменов — последовательная отправка большого количества писем с использованием собственного PHP mail()
не очень эффективна. Возможно, вы захотите обратиться к более специализированным почтовым библиотекам для этого, таким как SwiftMailer.
С другой стороны, видя, что вы отправляете один и тот же адрес электронной почты, вы также можете просто сохранить отказывающие домены в массиве и отправить их все в одном электронном письме после того, как закончите проверку, конечно.
Комментарии:
1. Я пытался заставить это работать, но то, что я придумал, похоже, не выходит за рамки 1-го сайта в массиве. Я добавил новый код к вопросу выше.
2. @user973661: вы должны определять функции вне
foreach
цикла один раз (не на каждой итерацииforeach
цикла). На самом деле; даже не разрешено переопределять функции. Это приведет к фатальной ошибке. Я предполагаю, что вы не отображаете ошибки на экране (помещаяini_set( 'display_errors', true )
в начало вашего скрипта), в противном случае вы должны были быть уведомлены об этой ошибке. Убедитесь, что вы используете отображение ошибок только на компьютере разработки, а не на рабочей машине.3. Я добавил display_errors и переместил функции за пределы foreach (я добавил код выше). Я получаю неопределенную переменную, и я все еще проверяю только один сайт.
Ответ №2:
Вы можете просто сохранить все в многомерном массиве и поместить итератор вокруг всей рабочей части кода.
$list_of_sites[0]["url"] = blah;
$list_of_sites[0]["text"] = blah;
$list_of_sites[1]["url"] = blah;
$list_of_sites[1]["text"] = blah;
foreach($list_of_sites as $site){
$url = $site["url"];
$text = $site["text"];
check($url, $text);
}