Я могу обнаружить IE6 с PHP?

Параметры и локальные переменные выделяются в стеке (с ссылочными типами объект живет в куче, а переменная ссылается на этот объект). Стек обычно находится в верхнем конце вашего адресного пространства и, поскольку он используется, он направляется к нижней части адресного пространства (т.е. к нулю).

В вашем процессе также есть куча, которая живет в в нижней части вашего процесса. Когда вы выделяете память, эта куча может расти в верхнем конце вашего адресного пространства. Как вы можете видеть, существует вероятность того, что куча «столкнется» со стеклом (немного как тектонические пластины !!!).

Общей причиной переполнения стека является плохой рекурсивный вызов. Как правило, это вызвано тем, что у ваших рекурсивных функций нет правильного условия завершения, поэтому он навсегда называет себя.

Однако при программировании GUI можно создать непрямую рекурсию. Например, ваше приложение может обрабатывать сообщения с краской, а при их обработке оно может вызывать функцию, которая заставляет систему отправлять другое сообщение с краской. Здесь вы явно не называли себя, но OS / VM сделала это для вас.

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

Если вы у меня нет очевидных рекурсивных функций, затем проверьте, не вызываете ли вы какие-либо библиотечные функции, которые косвенно вызовут вашу функцию (например, неявный случай выше).

48
задан PHLAK 23 March 2009 в 00:24
поделиться

11 ответов

Попытайтесь проверить их агент пользователя на 'MSIE 6.'.

$using_ie6 = (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== FALSE);

Это основано на этой информации об агенте пользователя.

64
ответ дан Ryan Wersal 7 November 2019 в 12:08
поделиться

Спасибо парни, я закончил тем, что создал следующую функцию и назвал ее по мере необходимости:

// IE6 Check
function isIE() {
  $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
  if (ereg("msie 6.0", $userAgent)) {
    return true;
  } else {
    return false;
  }
}
1
ответ дан PHLAK 7 November 2019 в 12:08
поделиться

Можно обнаружить IE6 с HTML этот путь

<!--[if IE 6]>
// ie6 only stuff here
<![endif]-->

Вот ссылка на то, как она сделана в PHPПутем Обратная машина но я видел много ложных положительных сторон в парсинге $_SERVER["HTTP_USER_AGENT"] для IE6

28
ответ дан blade19899 7 November 2019 в 12:08
поделиться

хорошо, PHLAK ...

я думаю, что этот намного лучше: P

  if(preg_match('/msie [2-6]/i',$_SERVER['HTTP_USER_AGENT'])) {
   // if IE<=6
  } else {
   //if IE>6
  }
12
ответ дан 7 November 2019 в 12:08
поделиться

Функция preg_match () вместо preg (), но хорошо!

-1
ответ дан 7 November 2019 в 12:08
поделиться

Примечание IE8 также указывает, что он совместим с IE6 в строке пользовательского агента.

-1
ответ дан 7 November 2019 в 12:08
поделиться

очень полезная ветка. Я использовал это, чтобы скрыть объявление для IE6. Оказывается, IE6 проверяет только первую строку документа на определение типа документа, что означает, что если присутствует строка , IE6 будет отображать в режиме совместимости независимо от типа документа, следующего за < ? xml> объявление

Я не уверен, критично ли включать проверку оперы, но все равно включил ее.

//check if IE 6 or less
$not_lte_ie6 = true;
$ua = strtolower($_SERVER['HTTP_USER_AGENT']);
if(strpos($ua,'msie') !== FALSE) {
    if(strpos($ua,'opera') === FALSE) {
        if(preg_match('/(?i)msie [1-6]/',$ua)) $not_lte_ie6 = false;
    }
}
if ($not_lte_ie6)
    echo "<?xml version='1.0' encoding='UTF-8'?>\n";
0
ответ дан 7 November 2019 в 12:08
поделиться

Перечисленные методы часто помечают браузеры с определенными надстройками (например, MathPlayer; а также некоторые панели инструментов вредоносного ПО).

Я считаю, что гораздо более надежный метод:

if( preg_match('/^Mozilla\/4\.0 \(compatible; MSIE 6/', $_SERVER['HTTP_USER_AGENT']) != 0 )
1
ответ дан 7 November 2019 в 12:08
поделиться

Можно использовать get_browser с обновленный файл .

browscap.ini
9
ответ дан OIS 7 November 2019 в 22:08
поделиться

Многие основанные на агенте пользователя ответы на этой странице не слишком надежны, потому что Opera часто отождествляет себя со строкой агента пользователя, содержащей "MSIE 6.0", такой как:

Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 9.51

Это влияет на все версии Opera 5 - 9 и даже Opera 10 и может быть включено или выключено из Opera. Видят эту страницу .

общий подход, который я видел, должен протестировать на "MSIE" и против "Opera". Например,

if (preg_match('/\bmsie 6/i', $ua) && !preg_match('/\bopera/i', $ua))
  echo "We have IE6!";
15
ответ дан thomasrutter 7 November 2019 в 22:08
поделиться

Вы можете , с помощью заголовка Агента пользователя HTTP, но я настоятельно рекомендовал бы не делать этого, если это возможно. Заголовок Агента пользователя очень очень трудно проанализировать точно и склоняется к ложным положительным сторонам с простой строкой matching —  even игнорирование проблемы браузеров, которые симулируют быть другими браузерами. Например, “MSIE Jeremy 6. Строка ” будет соответствовать Мобильному IE, который так очень отличается от IE6, что Вы обычно не хотите объединять их.

Плюс то, когда Вы отправляете другой HTML в различные браузеры, необходимо использовать ‘Vary’ заголовок (который делает кэши менее эффективными) избегать, чтобы кэши отправили неправильные страницы в различные браузеры.

Поэтому, если можно найти, что другое место делает дифференцирование браузера, это является определенно лучшим. Г “подход lafur с условными комментариями обычно является самым простым подходом для изменения JavaScript и разметки HTML / ссылки CSS.

3
ответ дан bobince 7 November 2019 в 22:08
поделиться
Другие вопросы по тегам:

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