Несовместимости у php
все функции работают по разному в зависимости от версии, системы и т.д.
Ладно, изменю вопрос - интересуют только случаи несовместимости между одинаковыми версиями php. Ну или обратные несовместимости.
То есть, не изменения вида:
Если вы используете магический метод __construct, то при миграции на php4 он работать не будета
Если вы в php4 создали метод __construct, то в php5 он становится магическим конструкторомЗЫ: В общем-то, магия не интересует, интересуют более реальные вещи.
И, конечно, всякие функции, которые явно используют окружение (типа там getcwd не интересуют - про них и так понятно, что на результат их выполнения влияет всё, что угодно.
А вот то, что, например, round1.5+1.5)*100) под виндой равно 300, а под bsd 299 - интересует.
Там тебе помогут лучше.
Есть какая-то библиотека, написанная на php.
Она работает и под виндой, и под линуксом.
При этом, в винде она выдаёт правильный (ожидаемый) результат, а в bsd - немного (или много, смотря как посмотреть) другой.
Хочется понять, вызовы каких встроенных пхпшных функций в этой библиотеке искать, чтобы понять, откуда исходят глюки.
Так же у меня закрадывается подозрение, что версия пхп не одинаковая - например - при инсталяшке в винде использовались одни параметры, а при сборке под bsd несколько ключей забыли добавить, или наоборот добавили лишние.
Начни например со сравнения конйигов там и там, и со сравнения php_info - наверняка найдется много интересного
Из личного примера - консольные скрипты по разному работали с stdin на разных машинах - пришлось дописывать скрипты.
а может при сборке на бзде была задана оптимизация. и веселый компилятор так позабавился?:)
а при сборке под bsd несколько ключей забыли добавить, или наоборот добавили лишниеТогда бы последствия были более серъёзными, типа "функция xxx не может быть найдена".
А мои баги - как раз типа точки или запятой в зависимости от локали в выводе sprintf("%.3f",float $num) или 299 под виндой и 300 под линуксом как результат выполнения float1.5+1.5)*100).
Поставь одинаковую локаль, если глюки не пропадут, то думай.
Вообще, локаль - частный случай. Вот мне повезло, и я всё-таки узнал, что часть глюков проистекает из локали - просто посмотрел на различия в выходных файлах, откопал в библиотеке то место, где в файл пишутся эти данные, посмотрел на php.net описание конкретной функции sprintf, на которую наткнулся в библиотеке - и узнал, что f выдаёт в зависимом от локали формате, и, если я хочу, чтобы всегда была точка - надо пользоваться не f, а F.
Но это только одно отличие, локаль порождает только одну проблему. И, чтобы пофиксить все проблемы - придётся полностью перерывать всю библиотеку и на каждую используемую ей пхпшную функцию идти на php.nte и читать несколько страниц инфы про эту функцию.
Хочется же, чтобы был список таких несовместимостей, чтобы я мог на него посмотреть, 90% сразу отбросить, потому что они бы не могли породить такие глюки, какие наблюдаются, а по остальным 10% просто сделать поиск по всей библиотеке и увидеть все места, где может быть что-то не так (уже зная, что именно может быть не так, и на что надо обратить внимание).
А что делает PHP round под BSD?
Она точно round(3) вызывает или там сделан какой-то грязный системозависимый хак?
---
...Я работаю антинаучным аферистом...
А что делает PHP round под BSD?А вот хрен его знает.
Она точно round(3) вызывает или там сделан какой-то грязный системозависимый хак?
ЗЫ: Этот пример - на самом деле не пример, а просто попытка объяснить, ошибки какого рода хочется поймать...
>> Она точно round(3) вызывает или там сделан какой-то грязный системозависимый хак?
> А вот хрен его знает.
Тогда причём здесь BSD?
Это проблемы PHP, что он не работает или работает неправильно.
> ЗЫ: Этот пример - на самом деле не пример, а просто попытка объяснить,
> ошибки какого рода хочется поймать...
Ты видел PR "Too many patches"?
---
...Я работаю антинаучным аферистом...
Тогда причём здесь BSD?BSD при том, что результаты выполнения одного и того же кода под bsd и под виндой отличаются.
Это проблемы PHP, что он не работает или работает неправильно.
Я не обвиняю bsd, я хочу понять, что мне искать в полумегабайте исходников, что в них может порождать этот различный вывод, и как это фиксить!
и как это фиксить!Пишешь тесты к своему коду и по необходимости правишь этот код.
Всех багов PHP заранее не обойдешь =)
> что в них может порождать этот различный вывод, и как это фиксить!
PR-ы не пробовал писать? Иногда помогает.
---
...Я работаю антинаучным аферистом...
Всех багов PHP заранее не обойдешьНо просмотреть все баги php, выделить из них те, которые могут привести к наблюдаемым последствиям и засунуть названия таких функций в поиск гораздо легче, чем на каждой строке этой полумегабайтной библиотеки лезть на php.net и ботать инфу про очередные функции и про то, какие у них есть особенности на разных системах.
PR-ы не пробовал писать?Это что?
Типа, берёшь и пишешь пехепешникам, что:
Subject: Incorrect behaviour of ***** in PHP X.YY.ZZZ
From: UNIX With Love
Reply-To: forum.b.gz.ru
>Submitter-Id: net
>Confidential: no
>Synopsis: Function ***** returns wrong result in PHP X.YY.ZZZ under SUXX
>Severity: non-critical
>Priority: medium
>Category: I'm not aware of whether you've got ones.
>Class: See above
>Release: PHP X.YY.ZZZ
>Description:
You [censored] can't do it right.
>How-To-Repeat:
php -flags '...round1.5+1.5)*200)...'
>Fix:
I don't care.
---
"Аллах не ведёт людей неверных."
Суть не в том, что я нашёл какую-то проблему в самом пхп, а в том, что проблемы появляются в какой-то либе, написанной на пхп, и в том, что хочется эти проблемы локализовать.
Или предлагаешь написать разработчикам пхп "вот у меня тут есть полметра кода на пхп, он использует десять тысяч пхпшных функций (список прилагается) и на бсд работает некорректно, пофиксите"?
ЗЫ: В самом-то пхп багов, наверное, даже и нету (точнее, это происходит не из-за них а то, что некоторые функции работают по-разному в зависимости от настроек - правильное для них поведение, и оно задокументировано (типа "если вы в sprintf используете модификатор f - он выводит числа в формате, зависящем от локали; если вы хотите выводить в формате [целая часть].[дробная часть], вместо f используйте F". Мне же хочется найти какой-нибудь такой большой документ, где были бы описаны все такие фишки.
Ты думаешь, что если кто-то написал /usr/bin/bash прямым текстом, это проблемы БСД,
что такой код там работать не будет? То же самое относится и к другим функциям.
---
"Аллах не ведёт людей неверных."
Оформи это как "documentation bug".
---
"Аллах не ведёт людей неверных."
Напиши разработчику этой либы, что она у него ничерта не работает.А если разработчик либы забил на неё/уехал/умер?
Есть либа, править её довольно легко, надо пофиксить баги - хочется понять, в каких местах они могут возникнуть.
Есть бага с 299 и 300 - ищи, откуда взялась, фикси.
Нет быги -забудь о ней, когда появится - пофиксишь.
> А если разработчик либы забил на неё/уехал/умер?
А зачем ты используешь неподдерживаемую библиотеку?
---
"Аллах не ведёт людей неверных."
Есть бага с 299 и 300 - ищи, откуда взялась, фикси.Давай поделим баги на баги низко- и высокоуровневые.
Нет быги -забудь о ней, когда появится - пофиксишь
И будем называть баги с 299 и 300, с sprintf("%.3f") - низкоуровневыми. А багу, что та самая либа выдаёт рисунок, где два фигурки идут не слева направо, как должны, а сверху вниз - высокоуровневой.
Так вот, есть довольно много высокоуровневых баг, ковыряться в коде и искать, где именно они появились, очень сложно, т.к. отладку туда практически никак не прикрутить. Но все высокоуровневые баги появляются только из-за каких-то низкоуровневых, о которых мне неизвестно. И, если будет список всех низкоуровневых баг - будет очень легко найти все те места в коде, где они омгут проявиться, и уже там проверить, проявляется в этой конкретной строчке кода из 100 потенциальных (а не 10000 всех) эта конкретная бага (а не какая-то вообще и может ли она тут привести к такому изменению результата, какое наблюдается.
отладку туда практически никак не прикрутитьЧем Zend Studio не устраивает?
В библиотеке полмегабайта кода.
В картинке, которую она выдаёт на выходе, две фигурки расположены не так, как должны.
О том, как эти фигурки у неё внутри хранятся, и как она определяет их расположение друг относительно друга - неизвестно, если не пытаться понять, что там делает каждая строчка.
Что мне даст стандартный отладчик?
Обычный отладчик - хорош в том случае, если вообще ничего не работает... или если ты знаешь, как там всё внутри устроено - но не когда у тебя есть куча исходников, как они устроены, ты не знаешь, но знаешь, что выдаётся немного не тот результта, который должен.
ЗЫ: А куда я этот zend studio прикручу?
О том, как эти фигурки у неё внутри хранятся, и как она определяет их расположение друг относительно друга - неизвестно, если не пытаться понять, что там делает каждая строчка.чудес не бывает - давно бы уже за 3 дня прочитал весь код и нашел багу...
давно бы уже за 3 дня прочитал весь кодСмеёшься?
Я художественную литературу не с такой скоростью читаю... не то, что довольно запутанный код, где сотня классов, и где они как-то сложно общаются друг с другом.
и нашел багуА это ещё хуже - потому что х его з, что приводит к этой баге.
Себя то зачем мучать за чужие баги ?
капаешь закачику на мозги, что либо надо покупать финдовый хостинг, либо еще вкладывать $$$$$ в разработку библиотеки под данную операционкуПосле чего заказчик (ака работодатель) говорит "спасибо, было очень интересно с вами работать, надеюсь у вас всё будет хорошо, а сейчас на ваше рабочее место сядет вот этот мальчик".
заплатить придется из своего кармана, но зато можно побездельничать
закажи у мальчика инсталяцию скриптаЧего-чего сделать?
1. исходники
2. тест, который стабильно показывает правильное поведение на этих данных
3. тест, который стабильно показывает неправильное поведение на этих же данных.
Теперь объясни, как имея все это - можно за пару часов не разобраться в чем именно проблема?
слова "метод деления пополам" тебе что-нибудь говорит?
или слова "найдите десять отличий"?
У тебя есть:У меня есть:
1. исходники
2. тест, который стабильно показывает правильное поведение на этих данных
3. тест, который стабильно показывает неправильное поведение на этих же данных.
1) Исходники.
2) Тест, который стабильно показывает правильное поведение.
3) Тот же тест, который стабильно показывает неправильное поведение под другой системой.
слова "метод деления пополам" тебе что-нибудь говорит?Говорят.
Но как это применить в данном случае - ума не приложу.
ставишь в середину проги трассировку или breakpoint.
запускаешь оба теста, смотришь что эта трассировка или breakpoint выдали - если результаты не совпали - значит надо бить пополам спереди, иначе сзади.
для надежности: если выяснилось что промежуточные данные не совпадают, то попробовать подменить на правильные промежуточные данные и посмотреть что будет в итоге.
ставишь в середину проги трассировку или breakpoint.Ыыы...
Предлагаешь делать print_r($GLOBALS) и сравнивать все те метры, которые там лежат в оперативной памяти?
На это уж точно не один день уйдёт...
Оставить комментарий
kruzer25
Пытаюсь сейчас поднять на bsd скрипт, который отлично работает под виндой.Под bsd - тоже работает, но не так, как надо.
Есть ли где-нибудь список функций, которые могут работать по-разному в зависимости от ОС, настроек php.inin итп?
Типа
?