SearchEngines.bg

Това е примерно съобщение за гост. Регистрирайте безплатен акаунт днес, за да станете потребител на SearchEngines.bg! След като влезете, ще можете да участвате в този сайт, като добавите свои собствени теми и публикации, както и да се свържете с други членове чрез вашата лична входяща кутия! Благодарим ви!

Проблем със зареждане на банери

diabolic.bg

The Old Wastelander
Имам две фирми (имената нямат значение, ще ги обознача като Ф1 и Ф2), на които въртя банерите в сайтовете си. Схемата е следната - за всеки банер имам външен ХТМЛ файл, който съдържа Джава скрипта на ротатора и кода на съответния размер банер от Ф1 и Ф. Съответният файл се извиква във ифрейм на страницата на сайта. Дотук всичко работи прекрасно.

Проблемът е, че сайтът на Ф2 доста често пада и е офлайн понякога с часове. През това време сайтовете се забавят при отваряне с минути и то понякога доста над 10. Опитах се да направя така, че ако сайтът на Ф2 падне, да се зареждат само банерите на Ф1, за да не ми се налага всеки път да премахвам кодовете ръчно и после да възстановявам отново..
За целта използвах РНР скрипт, който пингва Ф2 при всяко отваряне на страница и, ако той не отговори, не изписва кода за банерите им. Кодовете се съдържат в контейнери, които се изписват чрез echo. Ако няма пинг, не се изписва контейнерът, заедно с кода. Надявам се, че съм обяснил разбираемо.

Понеже банерите са доста, в резултат от всичките пингове и РНР скриптове се увеличи много натоварването на сървъра ми и това почна да бави всичко, а това не е решение.

Моля за помощ с идеи и/или реализация на код, който да забранява автоматично изписването на банерите, ако сайтът на Ф2 спре. Благодаря предварително за всеки съвет!
 
Последно редактирано:
А защо просто не използваш revive ad server?

Не го правя по две-три сериозни причини. Първо за 20-30 банера не си струва да се занимавам с този доста сложен за употреба софтуер. Второ - сървърът ми е личен, вече не е в крак с последните хардуерни тенденции и не намирам за необходимо да го товаря допълнително с излишни програми. И трето, което никак не е маловажно - тези сървъри за управление на реклами (визирам OpenX) имат купища слабости в областта на сигурността и не малко сайтове са хаквани през тях, а аз не искам да си слагам сам таралеж в гащите.

Доказателство: http://blog.sucuri.net/2013/12/zero-...ver-3-0-1.html
 
Последно редактирано:
Благодаря, @scoobydoo, вероятно идеята ти е доста добра, но моят сървър работи под уиндоус и няма работещ крон (The software utility cron is a time-based job scheduler in Unix-like computer operating systems.), а и нямам уменията да изпълня цялото това чудо, което ми предлагаш. Ще трябва да направя нова таблица във всяка една база данни (за всеки сайт), да променя някак си кода на банерите, за да си търсят в базата данни и изобщо материалът е доста сложен за скромните ми познания по програмиране. Трябва ми някакво простичко решение, с което да се справя сам.
 
Последно редактирано:
Вместо крон направи скрипт, който генерира произволно число от 1 до X при всяко посещение. Ако числото се е паднало 1, тогава да прави пинга и да записва в базата. Банерите пак да си проверяват в базата за информацията, както казах по-рано. Избрираш си число X в зависимост от това, колко често искаш да се прави проверката, като зависи и от това, колкото посещения имаш на ден, понеже те се ползват вместо крон.

Това е варианта без крон. Ако искаш и без база, тогава записваш данните във файл, но операциите с него са по-бавни принципно.
 
Скуби, не мога да си представя поне за момента някакво решение, близко до това, което предлагаш. Обаче знам да питам Гугъл и намерих нещо, което може и да свърши работа.

Въпрос към РНР програмистите: Може ли това да ми свърши работа или ще товари също като пинга?
Код:
<?php

$url = 'www.google.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($httpcode>=200 && $httpcode<300){
echo 'worked';
} else {
echo "didn't work";
}

?>
Разбира се, вместо 'worked' ще се изписва моят код на банера.
 
Горният код работи, не се изписва като системна услуга, защото го изпълнява РНР на сървъра, но не мога да преценя сам дали ще товари или мога спокойно да го използвам за всички банери. Сега съм го пуснал тестово само на един. Моля за мнения!
 
Ето моя вариант с файла, дето казваш, че не знаеш как да стане:

PHP:
//задаваме име и път до файла
$file = "/home/potrebitelsko-ime/public_html/example.com/papka/status.txt";

//вземаме сегашното му съдържание
$current_data = file_get_contents($file);

//ако сега пише в него 1, то показваме банера
if($current_data=="1")
{
    //////////////////////
    // показване на банера
    // ...
    // ...
    //////////////////////
}

//при всяко презареждане има 2 процента шанс да се направи проверка на статуса
if(mt_rand(1, 50) == 1)
{
    ////////////////////////////
    //проверка дали работи сайта
    // ...
    // ...
    ////////////////////////////

    //ако работи, новите данни са равни на 1
    // ...
    $new_data = "1";

    //ако не работи, новите данни са равни на 0
    // ...
    $new_data = "0";

    //ако новите данни са различни от старите данни, ги записваме
    if($current_data != $new_data)
    {
        file_put_contents($file, $new_data);
    }
}



Прочети коментарите и ще го разбереш. Супер е лесен. Където има три точки, трябва да се добави код от теб. А в началото, където е името и пътя на файла, трябва да си го промениш.
Но отново казвам, че е по-добре с база данни. Може да си го промениш вместо да чете и записва от и във файла, да го прави от и във базата.

Не мисля, че това, което си дал горе ще промени нещо. То пак си правиш конекция към сайта, просто по друг начин. А в моя вариант я правиш приблизително веднъж на всеки 50 презареждания. Може да си промениш числото 50 както ти е удобно.
 
Изглежда, че съм много тъп, защото не успявам да го подкарам. :(
Направих следното:
1. създадох status.txt.
2. създадох servercheck.php, който съдържа целия код без частта за показване на банера. Съответно попълних частта за проверка на сървъра като опитвах и двата кода - този горе и другия с пинга.
направих тестова страница, която съдържа следното:
Код:
<?php
include("/home/potrebitelsko-ime/public_html/example.com/papka/servercheck.php");
$file = "/home/potrebitelsko-ime/public_html/example.com/papka/status.txt";
$current_data = file_get_contents($file);
if($current_data=="1")
{
echo

'код на банера';
}else{
echo 'The server is ofline!';
}
?>
Разбира се, нарочно тук съм подменил пътя към файловете, а не е истинският, който е при мен.
В резултат, ако напиша в status.txt 0, не виждам банера, а съответния надпис. Ако задам 1, получавам банер. Обаче останалата част от кода упорито не желае да пише в status.txt и не можах да открия причината. :(
 
Вземаш ли под внимание това, че кода се изпълнява само ако произволното число е равно на 1 и също само ако новите данни са различни от старите?
Някаква грешка изписва ли PHP-то или логва ли някаква в логовете?
 
Разбира се. Дори, за да проверя какво става, коментирах реда за произволното число, заедно със съответните скоби, тоест предизвиках проверка на всеки рефреш, но пак не пишеше във файла.

Сега, понеже се нервирах и трябва с нещо да разтоваря, наблъсках на всички банери моя горен код за проверката. Усещането е субективно, но ми се струва, че няма забавяне, като дори ги отварях през мобилна връзка на Мтел, която си е бавничка. Все пак, ако мога да подкарам твоя вариант, бих го предпочел, защото положително ще товари по-малко.П. П.

П. П. Не намерих грешка в лога на сървъра, която да е свързана с тестовете ми.
 
Последно редактирано:
Сега тествах следното на моя хостинг.
Направих файл, написах 1 в него, качих го. Качих и следния php файл (отдолу), който е опростена версия за тестване само. Отворих го, изписа baner и промени числото във файла. Отворих го пак, нищо не изписа. Тоест бачка. Ако такъв файл при теб не работи, според мен е нещо от настройките на сървъра, разни права за запис във файла или нещо такова, не знам там много не разбирам.

PHP:
$file = "/home/xxxxxxxxxxx/public_html/xxxxxxxxxxx.com/status.txt";

$current_data = file_get_contents($file);

if($current_data=="1")
{
    echo "baner";
}

$new_data = "0";

if($current_data != $new_data)
{
    file_put_contents($file, $new_data);
}
 
Направих същият тест. Файлът пише, но има някаква принципна грешка. Ако добавиш втори ред $new_data = "1"; пише само 1. Съответно, ако вторият ред е с 0, пише само нули. Затова вероятно пълният код не върши никаква работа.
 
Направих същият тест. Файлът пише, но има някаква принципна грешка. Ако добавиш втори ред $new_data = "1"; пише само 1. Съответно, ако вторият ред е с 0, пише само нули. Затова вероятно пълният код не върши никаква работа.

А, еми не си добавил проверките. Аз там оставих три точки с цел да ги добавиш като гледаш резултата от проверката.
Най-лесно ще открием проблема ако ми покажеш целия код.
 
Ето го кода на файла за проверка на сървъра:
Код:
<?php
//задаваме име и път до файла
$file = "C:/home/potrebitelsko-ime/public_html/example.com/papka/status.txt";

//вземаме сегашното му съдържание
$current_data = file_get_contents($file);

//ако сега пише в него 1, то показваме банера
//if($current_data=="1")
//{
//////////////////////
// показване на банера
// ...
// ...
//////////////////////
//}

//при всяко презареждане има 2 процента шанс да се направи проверка на статуса
if(mt_rand(1, 50) == 1)
{
////////////////////////////
//проверка дали работи сайта
$url = 'някой.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($httpcode>=200 && $httpcode<300){
////////////////////////////

//ако работи, новите данни са равни на 1
// ...
$new_data = "1";

//ако не работи, новите данни са равни на 0
// ...
$new_data = "0";

//ако новите данни са различни от старите данни, ги записваме
if($current_data != $new_data)
{
file_put_contents($file, $new_data);
}
}
}
?>
В този вид пише само нули, независимо дали работи сървърът им или не.
 
Скуби, доколкото разбирам логиката, преработих малко кода и тръгна в този вид:
Код:
<?php
//задаваме име и път до файла
$file = "C:/home/potrebitelsko-ime/public_html/example.com/papka/status.txt";

//вземаме сегашното му съдържание
$current_data = file_get_contents($file);

//при всяко презареждане има 2 процента шанс да се направи проверка на статуса
if(mt_rand(1, 2) == 1)
{
////////////////////////////
//проверка дали работи сайта
$url = 'някой.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($httpcode>=200 && $httpcode<300){
////////////////////////////

//ако работи, новите данни са равни на 1
// ...
$new_data = "1";
}
//ако не работи, новите данни са равни на 0
// ...
else { $new_data = "0"; }

//ако новите данни са различни от старите данни, ги записваме
if($current_data != $new_data)
{
file_put_contents($file, $new_data);
}


}
?>
 
Последно редактирано:
Доправих цялата система. Сега файловете, които съдържат ротатора и кода на банерите, проверяват само за 0 или 1 в текстовия статус файл. Цялата проверка се извършва еднократно от сървърчек файла и той подава информация на всички останали.
Жалко, че не знам в този нов скин как се добавя репутация. Много ми помогна и си я заслужаваш! Благодаря! :)
 
Последно редактирано:

Горе