Как я мешаю ботам увеличить мой счетчик загрузки файла в PHP?

попробуйте это:

public static string MyExtension(this string s, char delimiter, int n)
{
    var begin = n== 0 ? 0 : Westwind.Utilities.StringUtils.IndexOfNth(s, delimiter, n);
    if (begin == -1)
        return null;
    var end = s.IndexOf(delimiter, begin +  (n==0?0:1));
    if (end == -1 ) end = s.Length;
    //var end = Westwind.Utilities.StringUtils.IndexOfNth(s, delimiter, n + 1);
    var result = s.Substring(begin +1, end - begin -1 );

    return result;
}

PS: используется библиотека Westwind.Utilities


Код теста:

void Main()
{

     string s = string.Join(";", Enumerable.Range(65, 26).Select(c => (char)c));
            s = s.Insert(3, ";;;");

            string o = "";

            Stopwatch sw = new Stopwatch();

            sw.Start();
            for (int i = 1; i <= 1000000; i++) {
                o = s.Split(';', 21);
            }
            sw.Stop();
            Console.WriteLine("Item directly selected: " + sw.ElapsedMilliseconds);


            sw.Restart();
            for (int i = 1; i <= 1000000; i++) {
                o = s.MyExtension(';', 21);
            }
            sw.Stop();
            Console.WriteLine("Item directly selected by MyExtension: " + sw.ElapsedMilliseconds);

            sw.Restart();
            for (int i = 1; i <= 1000000; i++) {
                o = s.Split(';')[21];
            }
            sw.Stop();
            Console.WriteLine("Item from split array:  " + sw.ElapsedMilliseconds + "\r\n");


            Console.WriteLine(s);
            Console.WriteLine(o);

}

public static class MyExtensions
{
    /// <summary>
    /// Get the nth item from a delimited string.
    /// </summary>
    /// <param name="s">The string to retrieve a delimited item from.</param>
    /// <param name="delimiter">The character used as the item delimiter.</param>
    /// <param name="n">Zero-based index of item to return.</param>
    /// <returns>The nth item or an empty string.</returns>
    public static string Split(this string s, char delimiter, int n)
    {

        int pos = pos = s.IndexOf(delimiter);

        if (n == 0 || pos < 0)
        { return (pos >= 0) ? s.Substring(0, pos) : s; }

        int nDelims = 1;

        while (nDelims < n && pos >= 0)
        {
            pos = s.IndexOf(delimiter, pos + 1);
            nDelims++;
        }

        string result = "";

        if (pos >= 0)
        {
            int nextDelim = s.IndexOf(delimiter, pos + 1);
            result = (nextDelim < 0) ? s.Substring(pos + 1) : s.Substring(pos + 1, nextDelim - pos - 1);
        }

        return result;
    }

    public static string MyExtension(this string s, char delimiter, int n)
    {
        var begin = n== 0 ? 0 : Westwind.Utilities.StringUtils.IndexOfNth(s, delimiter, n);
        if (begin == -1)
            return null;
        var end = s.IndexOf(delimiter, begin +  (n==0?0:1));
        if (end == -1 ) end = s.Length;
        //var end = Westwind.Utilities.StringUtils.IndexOfNth(s, delimiter, n + 1);
        var result = s.Substring(begin +1, end - begin -1 );

        return result;
    }

}

Результаты:

[ 112]

Редактировать: Благодаря @Kalten я улучшил решение еще больше. Значительные различия были замечены в результатах тестов.

12
задан Jeremy Ruten 24 October 2008 в 23:09
поделиться

4 ответа

robots.txt: http://www.robotstxt.org/robotstxt.html

Не все боты уважают его, но большинство делает. Если Вы действительно хотите предотвратить доступ с помощью ботов, сделайте ссылку на него POST вместо ПОЛУЧЕНИЯ. Боты не будут следовать за URL POST. (Т.е. используйте маленькую форму, которая назад размещает на сайт, который берет Вас к рассматриваемому URL.)

16
ответ дан 2 December 2019 в 06:46
поделиться

Я думал бы, что ответ robots.txt Godeke будет достаточен. Если бы у Вас абсолютно не может быть ботов Ваш счетчик, то я рекомендовал бы использовать файл роботов в сочетании с не не постепенным увеличением щелчков с некоторыми общими агентами пользователя робота.

Никакой путь не прекрасен., но смесь этих двух, вероятно, немного более строга. Если бы, был я, я, вероятно, просто придерживался бы файла роботов, хотя, так как это легко и вероятно наиболее эффективное решение.

4
ответ дан 2 December 2019 в 06:46
поделиться

Можно также обнаружить злонамеренных ботов, которые не уважали бы robots.txt с помощью http://www.bad-behavior.ioerror.us/.

0
ответ дан 2 December 2019 в 06:46
поделиться

Godeke является правильным, robots.txt является первым, что нужно сделать помешать ботам загружать.

Относительно подсчета это - действительно проблема веб-аналитики. Разве Вы не сохраняете свои www журналы доступа и выполняете их через программу аналитики как Webalizer или AWStats (или необычные альтернативы как Webtrends или Urchin)? Мне это - способ пойти для сбора этого вида информации, потому что это легко и нет никакого PHP, перенаправления или другого хита производительности когда загрузка пользователя файл. Вы просто используете журналы Apache, которые Вы сохраняете так или иначе. (И grep -c даст Вам быстрое 'n' грязное количество на конкретном файле или подстановочном шаблоне.)

Можно настроить программное обеспечение статистики для игнорирования хитов ботами, или определенных агентов пользователя и других критериев (и если Вы изменяете свои критерии позже, Вы просто повторно обрабатываете старые данные логов). Конечно, это действительно требует, чтобы у Вас были все свои старые журналы, поэтому если Вы бросали их с чем-то как logrotate необходимо будет начать без любых исторических данных.

3
ответ дан 2 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: