Автор Тема: PHP  (Прочитано 22243 раз)

Оффлайн john

  • Administrator
  • Hero
  • *****
  • Сообщений: 11751
  • Репутация: +26/-16
    • http://r9al.ru
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« : Апреля 09, 2008, 09:22:28 »
Проблема возникла...

Есть код:

<?

$file = @fopen ("http://******/index.php", "r");

while (!feof($file)) {
$part = fread($file, 1024);

if (preg_match("/tratata/i", $part)) {
   $link=true;
 }

}

fclose($file);

if ($link=true) {
    include("file.php");
              }
exit;

?>


В общем работает так, если на странице "http://******/index.php" найдено слово (или часть слова) "tratata", то выполняется файл "file.php"

Все работает, но! Если страницы "http://******/index.php" не существует - вылетает ошибка, которой забивается весь экран.

Видимо перед этим неоходимо сделать проверку на существование самой страницы "http://******/index.php". Как?

PS. В общем задача проверить, установлен ли на определенном сайте (странице) определенный код или нет. Может есть готовое решение?
« Последнее редактирование: Апреля 09, 2008, 09:26:51 от john »

Оффлайн alexis031182

  • Full
  • ****
  • Сообщений: 1012
  • Репутация: +0/-0
    • http://www.slovensk.ru/fspo
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #1 : Апреля 09, 2008, 13:20:27 »
Цитата: john
Проблема возникла...
...
Можно попробовать так:
// Преднамеренная ошибка при работе с файлами
$my_file = @file ('non_existent_file') or die ("Failed opening file: error was '$php_errormsg'");
Обрати внимание на знак "@" перед словом "file". Это перехват сообщений об ошибках в PHP. Ну а вместо функции die можно написать что-то своё.

Оффлайн john

  • Administrator
  • Hero
  • *****
  • Сообщений: 11751
  • Репутация: +26/-16
    • http://r9al.ru
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #2 : Апреля 09, 2008, 13:52:18 »
Цитата: alexis031182
Можно попробовать так:

Не догнал. Можешь как-то подробнее?

Оффлайн alexis031182

  • Full
  • ****
  • Сообщений: 1012
  • Репутация: +0/-0
    • http://www.slovensk.ru/fspo
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #3 : Апреля 09, 2008, 13:58:23 »
Вот ещё вариант:
if(@file_exists($filename)) print("It's OK!!!");

Оффлайн john

  • Administrator
  • Hero
  • *****
  • Сообщений: 11751
  • Репутация: +26/-16
    • http://r9al.ru
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #4 : Апреля 09, 2008, 14:23:13 »
Цитата: alexis031182
if(@file_exists($filename)) print("It's OK!!!");

неа, не работает.

Делаю:
$filename = "http://qwertyqwerty.ru/index.php";  //подставляю явно несуществующую страницу

if(@file_exists($filename)) print("It's OK!!!");

на экране пусто. Но если подставить реально существующую страницу - тоже пусто.

Оффлайн alexis031182

  • Full
  • ****
  • Сообщений: 1012
  • Репутация: +0/-0
    • http://www.slovensk.ru/fspo
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #5 : Апреля 09, 2008, 14:29:09 »
И даже это не работает?
$file = @fopen ("http://******/index.php", "r");
if($file == FALSE) print("BAD");
else print("OK");

Оффлайн john

  • Administrator
  • Hero
  • *****
  • Сообщений: 11751
  • Репутация: +26/-16
    • http://r9al.ru
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #6 : Апреля 09, 2008, 15:47:58 »
Цитата: alexis031182
И даже это не работает?

Вот что получилось:

<?

$filename = "http://***/index.php";
$file = @fopen ("$filename", "r");

if($file == FALSE)
{
print "страницы $filename - не существует";
}
  else
      {
       while (!feof($file))
       {
        $part = fread($file, 1024);
        if (preg_match("/tratata/i", $part))
         {
          print "страница $filename - существует, tratata на странице есть";
          exit;
         }        
          else print "страница $filename - существует, tratata на странице нет";
          exit;
       }
       exit;
      }
?>

Вроде все работает, спасибо.

Оффлайн john

  • Administrator
  • Hero
  • *****
  • Сообщений: 11751
  • Репутация: +26/-16
    • http://r9al.ru
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #7 : Апреля 09, 2008, 17:33:03 »
Сделал в виде вызываемой функции, которая подключает файл $url, если на странице $filename обнаружена tratata.

function check_link($filename, $url)
{
 $file = @fopen ("$filename", "r");
 if($file == TRUE)
   {
    while (!feof($file))
     {
      $part = fread($file, 1024);
      if (preg_match("/tratata/i", $part))
         {
          include ("$url");
          break;
         }        
      }
   }
}

Проблема вот в чем, так как функция может вызываться на одной страинце до 20-30 раз - это существено все затормозит. Саша, можно ли сделать так, чтобы запускалось это периодически принудительно, а результаты работы складывались бы в отдельный файл, который и будет отдаваться пользователю?
« Последнее редактирование: Апреля 09, 2008, 17:33:55 от john »

Оффлайн alexis031182

  • Full
  • ****
  • Сообщений: 1012
  • Репутация: +0/-0
    • http://www.slovensk.ru/fspo
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #8 : Апреля 09, 2008, 18:02:46 »
Цитата: john
...
Проблема вот в чем, так как функция может вызываться на одной страинце до 20-30 раз - это существено все затормозит.
Файл настолько большой? И почему так много раз он будет загружаться? PHP-код работает лишь когда происходит обновление (загрузка) страницы.

Цитата: john
Саша, можно ли сделать так, чтобы запускалось это периодически принудительно, а результаты работы складывались бы в отдельный файл, который и будет отдаваться пользователю?
Периодически и принудительно - врядли. PHP - это язык реакции на действия пользователя. Скорее всего тут только java может помочь.

Оффлайн alexis031182

  • Full
  • ****
  • Сообщений: 1012
  • Репутация: +0/-0
    • http://www.slovensk.ru/fspo
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #9 : Апреля 09, 2008, 18:04:13 »
А почему бы просто на время одной сессии не выполнять эту функцию только один раз?

Оффлайн john

  • Administrator
  • Hero
  • *****
  • Сообщений: 11751
  • Репутация: +26/-16
    • http://r9al.ru
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #10 : Апреля 09, 2008, 18:10:25 »
Цитата: alexis031182
Файл настолько большой? И почему так много раз он будет загружаться?
ссылок много - каждую нужно проверить.

Цитировать
PHP-код работает лишь когда происходит обновление (загрузка) страницы.

Это понятно.

Цитировать
Периодически и принудительно - врядли. PHP - это язык реакции на действия пользователя. Скорее всего тут только java может помочь.

Идея вот в чем, есть страница, которая получается в результате работы этого php, которая отдается пользователю, там уже ничего не выпорлняется, по сути это HTML-страница, а есть страница с програмой, на которую нет ссылок извне и которую я просто тупо буду периодически открывать, по мере необходимости. Вопрос собственно вот в чем, можно ли результаты работы указанного выше кода отправлять в файл? Если можно, то как правильно это сделать?

Оффлайн john

  • Administrator
  • Hero
  • *****
  • Сообщений: 11751
  • Репутация: +26/-16
    • http://r9al.ru
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #11 : Апреля 09, 2008, 18:11:15 »
Цитата: alexis031182
А почему бы просто на время одной сессии не выполнять эту функцию только один раз?

Эту функцию хорошобы выполнять не один раз за сесию, а один раз за день, или реже

Оффлайн alexis031182

  • Full
  • ****
  • Сообщений: 1012
  • Репутация: +0/-0
    • http://www.slovensk.ru/fspo
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #12 : Апреля 09, 2008, 18:27:21 »
Цитата: john
ссылок много - каждую нужно проверить.
Здесь несовсем понятно. Что это за ссылки и что значит "проверить"?

Цитата: john
Идея вот в чем, есть страница, которая получается в результате работы этого php, которая отдается пользователю, там уже ничего не выпорлняется, по сути это HTML-страница, а есть страница с програмой, на которую нет ссылок извне и которую я просто тупо буду периодически открывать, по мере необходимости.
Здесь совсем непонятно, но наверное это неважно...

Цитата: john
Вопрос собственно вот в чем, можно ли результаты работы указанного выше кода отправлять в файл? Если можно, то как правильно это сделать?
Результат работы скрипта загоняется как текст в обычную переменную, ну а потом, используя функции "fopen" (с ключами "r+b" или "a+b", если нужно добавлять информацию) и "fwrite", загоняем её в файл. Главное, при этом, чтобы соответствующие права доступа на удалённом ресурсе были.

Цитата: john
Эту функцию хорошобы выполнять не один раз за сесию, а один раз за день, или реже
Здесь тогда можно cookie попробовать.

Оффлайн alexis031182

  • Full
  • ****
  • Сообщений: 1012
  • Репутация: +0/-0
    • http://www.slovensk.ru/fspo
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #13 : Апреля 09, 2008, 18:38:48 »
Попробуй так:
function check_link($filename, $url)
{
 $file = @fopen ("$filename", "r");
 if($file == TRUE)
   {
    while (!feof($file))
     {
      $part = fread($file, 1024);
      if (preg_match("/tratata/i", $part))
         {
                  $my_var;
          include ("$url");
                  break;
         }        
      }
    $file = fopen("path_to_file", "r+b");
    fwrite($file, $my_var);
    fclose($file);
   }
}

В переменную $my_var загоняй результат работы от каждого выполнения строки include ("$url");. Только не просто присваивай, а используй объединение строк через точку, например так: $my_var = $my_var . $script_result;

Оффлайн alexis031182

  • Full
  • ****
  • Сообщений: 1012
  • Репутация: +0/-0
    • http://www.slovensk.ru/fspo
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #14 : Апреля 09, 2008, 18:42:19 »
Цитата: john
Эту функцию хорошобы выполнять не один раз за сесию, а один раз за день, или реже
О! Так здесь можно просто текущую дату с датой последнего выполнения скрипта сравнивать. Правда дату последнего сравнения придётся где-то сохранять. Но если это приемлемо, тогда это, наверное, самый оптимальный подход.

Оффлайн john

  • Administrator
  • Hero
  • *****
  • Сообщений: 11751
  • Репутация: +26/-16
    • http://r9al.ru
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #15 : Апреля 09, 2008, 20:47:36 »
Цитата: alexis031182
О! Так здесь можно просто текущую дату с датой последнего выполнения скрипта сравнивать. Правда дату последнего сравнения придётся где-то сохранять. Но если это приемлемо, тогда это, наверное, самый оптимальный подход.

В коде выше ошибка есть, исправил. А по работе с датой, можешь опдробнее? Проблем сохранить дату в файле нет.

Оффлайн alexis031182

  • Full
  • ****
  • Сообщений: 1012
  • Репутация: +0/-0
    • http://www.slovensk.ru/fspo
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #16 : Апреля 09, 2008, 21:26:40 »
Цитата: john
В коде выше ошибка есть, исправил. А по работе с датой, можешь опдробнее? Проблем сохранить дату в файле нет.
Ошибка? Я PHP не очень-то уважаю, собственно, как и любой другой интерпретатор, поэтому так до сих пор и не удосужился запомнить особенности программирования с его использованием. Если что-то и пишу, так сразу лезу в справку. Так что вполне мог ошибиться.  

Ну а с датой так можно:

$file = fopen("dayfile.txt", "rb");
$my_day = fread($file, 2);
fclose($file);

if($my_day != date("d"))
   {
   //Здесь выполнить скрипт.
   //...

   //Сохранить новый день месяца в файл.
   $file = fopen("dayfile.txt", "wb");
   $my_day = date("d");
   fwrite($file, $my_day, 2);
   fclose($file);
}

Таким образом, скрипт выполнится только если несоответствует номер дня месяца сохранённому номеру. Тут много разных вариантов может быть. Выбирай любой.

P.S. Конечно мог опять ошибиться, пишу по справке, да и опробовать неначем.
P.P.S. А где я в прошлом коде ошибку сделал?

Оффлайн john

  • Administrator
  • Hero
  • *****
  • Сообщений: 11751
  • Репутация: +26/-16
    • http://r9al.ru
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #17 : Апреля 09, 2008, 22:15:46 »
Цитата: alexis031182
Ну а с датой так можно:

Угу, попробую. В целом отладил, все работает. Осталось к сайту прикрутить и с датой поиграть.

Цитировать
P.P.S. А где я в прошлом коде ошибку сделал?

Там логическая ошибка, блок в котором ты $my_var в файл пишешь на две скобки выше надо.

Оффлайн alexis031182

  • Full
  • ****
  • Сообщений: 1012
  • Репутация: +0/-0
    • http://www.slovensk.ru/fspo
    • E-mail
    • Личное сообщение (Оффлайн)
PHP
« Ответ #18 : Апреля 09, 2008, 22:24:12 »
Цитата: john
...
Там логическая ошибка, блок в котором ты $my_var в файл пишешь на две скобки выше надо.
Точно  

Vadim

  • Гость
PHP
« Ответ #19 : Апреля 10, 2008, 00:23:42 »
Цитата: john
Эту функцию хорошобы выполнять не один раз за сесию, а один раз за день, или реже

CRON пока еще никто не отменял. Ну или дату последнего запуска юзеру в куку загонять, но нужен ли подобный огород...

 

Последние сообщения на форуме: