Я изменил скрипт для работы с php 7.1, изменив eregi на preg_match, скрипт работал несколько минут на wamp, и вдруг он перестал работать - PullRequest
0 голосов
/ 27 января 2020

Сценарий ниже создает файл журнала для всех посещений ботов, отправляет мне электронное письмо, а также проверяет IP на ip2location. Он отлично работал с PHP5 .2 с функцией eregi, поэтому я изменил строку eregi на preg_match и несколько минут работал на моем сервере тестирования wamp после добавления прямой косой черты к каждой переменной бота, потому что я получал "reg_match ( ): Разделитель не должен быть alphanumeri c или backsla sh "предупреждением, но теперь он не будет работать и не будет регистрировать никаких ботов в файле посещения.log.

Сценарий по-прежнему дает мне Эти три предупреждения приведены ниже, но, поскольку они были предупреждениями и начали работать, я не обращал на них особого внимания:

  • Примечание: Неопределенное смещение: 5 в C: \ wamp \ www\visits.php в строке 28
  • Предупреждение: preg_match (): пустое регулярное выражение в C: \ wamp \ www\visits.php в строке 28
  • Примечание: неопределенный индекс: js in C: \ wamp \ www\visits.php на линии 62
<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

  $to = "email@here.com";

  $log = "./visits.log";

  $dateTime = date("r");


  $agents[] = "/googlebot/";
  $spiders[] = "/Google/";
  $spiders[] = "/Googlebot/";
  $agents[] = "/slurp/";
  $spiders[] = "/Slurp (Inktomi's robot, HotBot)/";
  $agents[] = "/msnbot/";
  $spiders[] = "/MSN Robot (MSN Search, search\.msn\.com)/";
  $agents[] = "/yahoo\! slurp/";
  $spiders[] = "/Yahoo! Slurp/";
  $agents[] = "/bingbot/";
  $spiders[] = "/Bing\.com/";
  $ip= $_SERVER['REMOTE_ADDR'];
  $found = false;

  for ($spi = 0; $spi < count($spiders); $spi++)
    if ($found = preg_match($agents[$spi], $_SERVER['HTTP_USER_AGENT']))
      break;

  if ($found) {
    $url = "http://" . $_SERVER['SERVER_NAME']. $_SERVER['PHP_SELF'];

    if ($_SERVER['QUERY_STRING'] != "") {
      $url .= '?' . $_SERVER['QUERY_STRING'];
    }

    $line = $dateTime . " " . $spiders[$spi] . " " . $ip." @ " . $url;
    $ip2location = "https://www.ip2location.com/".$_SERVER['REMOTE_ADDR'];

    if ($log != "") {
      if (@file_exists($log)) {
        $mode = "a";
      } else {
        $mode = "w";
      }

      if ($f = @fopen($log, $mode)) {
        @fwrite($f, $line . "\n");
        @fclose($f);
      }
    }

   if ($to != "") {
$to = "email@here.com";
$subject = $spiders[$spi]. " crawled your site";
$body = "$line". "\xA\xA" ."Whois verification available at: $ip2location";
mail($to, $subject, $body);
    }
  }

  if ($_REQUEST["js"]) {
     header("Content-Type: image/gif\r\n");
     header("Cache-Control: no-cache, must-revalidate\r\n");
     header("Pragma: no-cache\r\n");

     @readfile("visits.gif");
  }

?>

Ответы [ 2 ]

0 голосов
/ 27 января 2020

a) у вас есть 6 элементов в $ spiders и только 5 в $ agents, что приводит к предупреждению о смещении 5 и пустому регулярному выражению. Googlebot удваивается:

  $spiders[] = "/Google/";
  $spiders[] = "/Googlebot/";

удалить одну запись

b) if ($_REQUEST["js"]) { следует заменить на:

if (isset($_REQUEST["js"])) { и в зависимости от ожидаемого значения после isset значение должно быть проверено - например, если вы проверяете по true:

if (isset($_REQUEST["js"]) && $_REQUEST['js'] === true) {

0 голосов
/ 27 января 2020

Скобки имеют особое значение в php 7 регулярном выражении preg_match. Просто избегайте их, это должно работать нормально. Что касается первого предупреждения, вместо coint($agents) используйте count($agents) - 1, индексы массива синусов начинаются с нуля или просто используйте foreach. Повторное использование if(isset($_REQUEST ["js"]) Удачи

...