Несовместимости у php

kruzer25

Пытаюсь сейчас поднять на bsd скрипт, который отлично работает под виндой.
Под bsd - тоже работает, но не так, как надо.
Есть ли где-нибудь список функций, которые могут работать по-разному в зависимости от ОС, настроек php.inin итп?
Типа
sprintf("%.3f",1.1) выдаёт разные результаты в замвисимости от локали (разные разделители - точка или запятая)
get_mem_usage не работает в windows
DOMDocument работает по-разному в различных версиях php и различных ос, различия - такие-то, такие-то и такие-то
?

sbs-66

все функции работают по разному в зависимости от версии, системы и т.д.

kruzer25

А вот и не все.
Ладно, изменю вопрос - интересуют только случаи несовместимости между одинаковыми версиями php. Ну или обратные несовместимости.
То есть, не изменения вида:
Если вы используете магический метод __construct, то при миграции на php4 он работать не будет
а
Если вы в php4 создали метод __construct, то в php5 он становится магическим конструктором
ЗЫ: В общем-то, магия не интересует, интересуют более реальные вещи.

kruzer25

Вообще, сейчас интересует, почему библиотека, которая правильно работает под виндой, работает и под bsd (версия php та же но выдаёт немного другой результат.
И, конечно, всякие функции, которые явно используют окружение (типа там getcwd не интересуют - про них и так понятно, что на результат их выполнения влияет всё, что угодно.
А вот то, что, например, round1.5+1.5)*100) под виндой равно 300, а под bsd 299 - интересует.

sbs-66

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

kruzer25

Причём тут телепаты?
Есть какая-то библиотека, написанная на php.
Она работает и под виндой, и под линуксом.
При этом, в винде она выдаёт правильный (ожидаемый) результат, а в bsd - немного (или много, смотря как посмотреть) другой.
Хочется понять, вызовы каких встроенных пхпшных функций в этой библиотеке искать, чтобы понять, откуда исходят глюки.

stm7884696

я думаю, что тебе стоит почитать туториал разработчиков php, наверняка они описали такие глюки.
Так же у меня закрадывается подозрение, что версия пхп не одинаковая - например - при инсталяшке в винде использовались одни параметры, а при сборке под bsd несколько ключей забыли добавить, или наоборот добавили лишние.
Начни например со сравнения конйигов там и там, и со сравнения php_info - наверняка найдется много интересного
Из личного примера - консольные скрипты по разному работали с stdin на разных машинах - пришлось дописывать скрипты.

Maurog

а может при сборке на бзде была задана оптимизация. и веселый компилятор так позабавился?:)

kruzer25

а при сборке под bsd несколько ключей забыли добавить, или наоборот добавили лишние
Тогда бы последствия были более серъёзными, типа "функция xxx не может быть найдена".
А мои баги - как раз типа точки или запятой в зависимости от локали в выводе sprintf("%.3f",float $num) или 299 под виндой и 300 под линуксом как результат выполнения float1.5+1.5)*100).

sbs-66

Поставь одинаковую локаль, если глюки не пропадут, то думай.

kruzer25

Локаль помогает в случае sprintf("%.3f",$float но не в случае round1.5+1.5)*100).
Вообще, локаль - частный случай. Вот мне повезло, и я всё-таки узнал, что часть глюков проистекает из локали - просто посмотрел на различия в выходных файлах, откопал в библиотеке то место, где в файл пишутся эти данные, посмотрел на php.net описание конкретной функции sprintf, на которую наткнулся в библиотеке - и узнал, что f выдаёт в зависимом от локали формате, и, если я хочу, чтобы всегда была точка - надо пользоваться не f, а F.
Но это только одно отличие, локаль порождает только одну проблему. И, чтобы пофиксить все проблемы - придётся полностью перерывать всю библиотеку и на каждую используемую ей пхпшную функцию идти на php.nte и читать несколько страниц инфы про эту функцию.
Хочется же, чтобы был список таких несовместимостей, чтобы я мог на него посмотреть, 90% сразу отбросить, потому что они бы не могли породить такие глюки, какие наблюдаются, а по остальным 10% просто сделать поиск по всей библиотеке и увидеть все места, где может быть что-то не так (уже зная, что именно может быть не так, и на что надо обратить внимание).

Ivan8209

> А вот то, что, например, round1.5+1.5)*100) под виндой равно 300, а под bsd 299 - интересует.
А что делает PHP round под BSD?
Она точно round(3) вызывает или там сделан какой-то грязный системозависимый хак?
---
...Я работаю антинаучным аферистом...

kruzer25

А что делает PHP round под BSD?
Она точно round(3) вызывает или там сделан какой-то грязный системозависимый хак?
А вот хрен его знает.
ЗЫ: Этот пример - на самом деле не пример, а просто попытка объяснить, ошибки какого рода хочется поймать...

Ivan8209

>> А что делает PHP round под BSD?
>> Она точно round(3) вызывает или там сделан какой-то грязный системозависимый хак?
> А вот хрен его знает.
Тогда причём здесь BSD?
Это проблемы PHP, что он не работает или работает неправильно.
> ЗЫ: Этот пример - на самом деле не пример, а просто попытка объяснить,
> ошибки какого рода хочется поймать...
Ты видел PR "Too many patches"?
---
...Я работаю антинаучным аферистом...

kruzer25

Тогда причём здесь BSD?
Это проблемы PHP, что он не работает или работает неправильно.
BSD при том, что результаты выполнения одного и того же кода под bsd и под виндой отличаются.
Я не обвиняю bsd, я хочу понять, что мне искать в полумегабайте исходников, что в них может порождать этот различный вывод, и как это фиксить!

qsk78

и как это фиксить!
Пишешь тесты к своему коду и по необходимости правишь этот код.
Всех багов PHP заранее не обойдешь =)

Ivan8209

> Я не обвиняю bsd, я хочу понять, что мне искать в полумегабайте исходников,
> что в них может порождать этот различный вывод, и как это фиксить!
PR-ы не пробовал писать? Иногда помогает.
---
...Я работаю антинаучным аферистом...

kruzer25

Это не мой код, это код совершенно другого человека.
Всех багов PHP заранее не обойдешь
Но просмотреть все баги php, выделить из них те, которые могут привести к наблюдаемым последствиям и засунуть названия таких функций в поиск гораздо легче, чем на каждой строке этой полумегабайтной библиотеки лезть на php.net и ботать инфу про очередные функции и про то, какие у них есть особенности на разных системах.

kruzer25

PR-ы не пробовал писать?
Это что?

Ivan8209

"Problem Reports".
Типа, берёшь и пишешь пехепешникам, что:

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.

---
"Аллах не ведёт людей неверных."

kruzer25

Ты не понял.
Суть не в том, что я нашёл какую-то проблему в самом пхп, а в том, что проблемы появляются в какой-то либе, написанной на пхп, и в том, что хочется эти проблемы локализовать.
Или предлагаешь написать разработчикам пхп "вот у меня тут есть полметра кода на пхп, он использует десять тысяч пхпшных функций (список прилагается) и на бсд работает некорректно, пофиксите"?
ЗЫ: В самом-то пхп багов, наверное, даже и нету (точнее, это происходит не из-за них а то, что некоторые функции работают по-разному в зависимости от настроек - правильное для них поведение, и оно задокументировано (типа "если вы в sprintf используете модификатор f - он выводит числа в формате, зависящем от локали; если вы хотите выводить в формате [целая часть].[дробная часть], вместо f используйте F". Мне же хочется найти какой-нибудь такой большой документ, где были бы описаны все такие фишки.

Ivan8209

Напиши разработчику этой либы, что она у него ничерта не работает.
Ты думаешь, что если кто-то написал /usr/bin/bash прямым текстом, это проблемы БСД,
что такой код там работать не будет? То же самое относится и к другим функциям.
---
"Аллах не ведёт людей неверных."

Ivan8209

> Мне же хочется найти какой-нибудь такой большой документ, где были бы описаны все такие фишки.
Оформи это как "documentation bug".
---
"Аллах не ведёт людей неверных."

kruzer25

Напиши разработчику этой либы, что она у него ничерта не работает.
А если разработчик либы забил на неё/уехал/умер?
Есть либа, править её довольно легко, надо пофиксить баги - хочется понять, в каких местах они могут возникнуть.

stm7884696

не пытайся объять необъятное.
Есть бага с 299 и 300 - ищи, откуда взялась, фикси.
Нет быги -забудь о ней, когда появится - пофиксишь.

Ivan8209

>> Напиши разработчику этой либы, что она у него ничерта не работает.
> А если разработчик либы забил на неё/уехал/умер?
А зачем ты используешь неподдерживаемую библиотеку?
---
"Аллах не ведёт людей неверных."

kruzer25

Есть бага с 299 и 300 - ищи, откуда взялась, фикси.
Нет быги -забудь о ней, когда появится - пофиксишь
Давай поделим баги на баги низко- и высокоуровневые.
И будем называть баги с 299 и 300, с sprintf("%.3f") - низкоуровневыми. А багу, что та самая либа выдаёт рисунок, где два фигурки идут не слева направо, как должны, а сверху вниз - высокоуровневой.
Так вот, есть довольно много высокоуровневых баг, ковыряться в коде и искать, где именно они появились, очень сложно, т.к. отладку туда практически никак не прикрутить. Но все высокоуровневые баги появляются только из-за каких-то низкоуровневых, о которых мне неизвестно. И, если будет список всех низкоуровневых баг - будет очень легко найти все те места в коде, где они омгут проявиться, и уже там проверить, проявляется в этой конкретной строчке кода из 100 потенциальных (а не 10000 всех) эта конкретная бага (а не какая-то вообще и может ли она тут привести к такому изменению результата, какое наблюдается.

Andbar

отладку туда практически никак не прикрутить
Чем Zend Studio не устраивает?

kruzer25

Всё-таки, ты не понял.
В библиотеке полмегабайта кода.
В картинке, которую она выдаёт на выходе, две фигурки расположены не так, как должны.
О том, как эти фигурки у неё внутри хранятся, и как она определяет их расположение друг относительно друга - неизвестно, если не пытаться понять, что там делает каждая строчка.
Что мне даст стандартный отладчик?
Обычный отладчик - хорош в том случае, если вообще ничего не работает... или если ты знаешь, как там всё внутри устроено - но не когда у тебя есть куча исходников, как они устроены, ты не знаешь, но знаешь, что выдаётся немного не тот результта, который должен.
ЗЫ: А куда я этот zend studio прикручу?

stm7884696

О том, как эти фигурки у неё внутри хранятся, и как она определяет их расположение друг относительно друга - неизвестно, если не пытаться понять, что там делает каждая строчка.
чудес не бывает - давно бы уже за 3 дня прочитал весь код и нашел багу...

kruzer25

давно бы уже за 3 дня прочитал весь код
Смеёшься?
Я художественную литературу не с такой скоростью читаю... не то, что довольно запутанный код, где сотня классов, и где они как-то сложно общаются друг с другом.
и нашел багу
А это ещё хуже - потому что х его з, что приводит к этой баге.

stm7884696

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

kruzer25

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

stm7884696

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

kruzer25

закажи у мальчика инсталяцию скрипта
Чего-чего сделать?

Dasar

У тебя есть:
1. исходники
2. тест, который стабильно показывает правильное поведение на этих данных
3. тест, который стабильно показывает неправильное поведение на этих же данных.
Теперь объясни, как имея все это - можно за пару часов не разобраться в чем именно проблема?
слова "метод деления пополам" тебе что-нибудь говорит?
или слова "найдите десять отличий"?

kruzer25

У тебя есть:
1. исходники
2. тест, который стабильно показывает правильное поведение на этих данных
3. тест, который стабильно показывает неправильное поведение на этих же данных.
У меня есть:
1) Исходники.
2) Тест, который стабильно показывает правильное поведение.
3) Тот же тест, который стабильно показывает неправильное поведение под другой системой.
слова "метод деления пополам" тебе что-нибудь говорит?
Говорят.
Но как это применить в данном случае - ума не приложу.

Dasar

> Но как это применить в данном случае - ума не приложу.
ставишь в середину проги трассировку или breakpoint.
запускаешь оба теста, смотришь что эта трассировка или breakpoint выдали - если результаты не совпали - значит надо бить пополам спереди, иначе сзади.
для надежности: если выяснилось что промежуточные данные не совпадают, то попробовать подменить на правильные промежуточные данные и посмотреть что будет в итоге.

kruzer25

ставишь в середину проги трассировку или breakpoint.
Ыыы...
Предлагаешь делать print_r($GLOBALS) и сравнивать все те метры, которые там лежат в оперативной памяти?
На это уж точно не один день уйдёт...
Оставить комментарий
Имя или ник:
Комментарий: