Параметры и локальные переменные выделяются в стеке (с ссылочными типами объект живет в куче, а переменная ссылается на этот объект). Стек обычно находится в верхнем конце вашего адресного пространства и, поскольку он используется, он направляется к нижней части адресного пространства (т.е. к нулю).
В вашем процессе также есть куча, которая живет в в нижней части вашего процесса. Когда вы выделяете память, эта куча может расти в верхнем конце вашего адресного пространства. Как вы можете видеть, существует вероятность того, что куча «столкнется» со стеклом (немного как тектонические пластины !!!).
Общей причиной переполнения стека является плохой рекурсивный вызов. Как правило, это вызвано тем, что у ваших рекурсивных функций нет правильного условия завершения, поэтому он навсегда называет себя.
Однако при программировании GUI можно создать непрямую рекурсию. Например, ваше приложение может обрабатывать сообщения с краской, а при их обработке оно может вызывать функцию, которая заставляет систему отправлять другое сообщение с краской. Здесь вы явно не называли себя, но OS / VM сделала это для вас.
Чтобы справиться с ними, вам нужно будет изучить свой код. Если у вас есть функции, которые называют себя, проверьте, что у вас есть условие завершения. Если у вас есть, то проверьте, что при вызове функции вы хотя бы модифицировали один из аргументов, иначе не будет видимых изменений для рекурсивно называемой функции, и условие завершения будет бесполезным.
Если вы у меня нет очевидных рекурсивных функций, затем проверьте, не вызываете ли вы какие-либо библиотечные функции, которые косвенно вызовут вашу функцию (например, неявный случай выше).
Попытайтесь проверить их агент пользователя на 'MSIE 6.'
.
$using_ie6 = (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 6.') !== FALSE);
Это основано на этой информации об агенте пользователя.
Спасибо парни, я закончил тем, что создал следующую функцию и назвал ее по мере необходимости:
// IE6 Check
function isIE() {
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
if (ereg("msie 6.0", $userAgent)) {
return true;
} else {
return false;
}
}
Можно обнаружить IE6 с HTML этот путь
<!--[if IE 6]>
// ie6 only stuff here
<![endif]-->
Вот ссылка на то, как она сделана в PHPПутем Обратная машина но я видел много ложных положительных сторон в парсинге $_SERVER["HTTP_USER_AGENT"]
для IE6
хорошо, PHLAK ...
я думаю, что этот намного лучше: P
if(preg_match('/msie [2-6]/i',$_SERVER['HTTP_USER_AGENT'])) {
// if IE<=6
} else {
//if IE>6
}
Примечание IE8 также указывает, что он совместим с IE6 в строке пользовательского агента.
очень полезная ветка. Я использовал это, чтобы скрыть объявление Xml>
для IE6. Оказывается, IE6 проверяет только первую строку документа на определение типа документа, что означает, что если присутствует строка Xml>
, 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";
Перечисленные методы часто помечают браузеры с определенными надстройками (например, MathPlayer; а также некоторые панели инструментов вредоносного ПО).
Я считаю, что гораздо более надежный метод:
if( preg_match('/^Mozilla\/4\.0 \(compatible; MSIE 6/', $_SERVER['HTTP_USER_AGENT']) != 0 )
Можно использовать get_browser с обновленный файл .
browscap.iniМногие основанные на агенте пользователя ответы на этой странице не слишком надежны, потому что 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!";
Вы можете , с помощью заголовка Агента пользователя HTTP, но я настоятельно рекомендовал бы не делать этого, если это возможно. Заголовок Агента пользователя очень очень трудно проанализировать точно и склоняется к ложным положительным сторонам с простой строкой matching —  even игнорирование проблемы браузеров, которые симулируют быть другими браузерами. Например, “MSIE Jeremy 6. Строка ” будет соответствовать Мобильному IE, который так очень отличается от IE6, что Вы обычно не хотите объединять их.
Плюс то, когда Вы отправляете другой HTML в различные браузеры, необходимо использовать вЂVary’ заголовок (который делает кэши менее эффективными) избегать, чтобы кэши отправили неправильные страницы в различные браузеры.
Поэтому, если можно найти, что другое место делает дифференцирование браузера, это является определенно лучшим. Г “подход lafur с условными комментариями обычно является самым простым подходом для изменения JavaScript и разметки HTML / ссылки CSS.