Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Downgrade php5  (Прочитано 3918 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Downgrade php5
« Ответ #15 : 03 Июня 2010, 13:57:08 »
да. Вот это, конечно, уже хуже. Тут надо код править, или старую версию искать. Старая - это ветка php 5.2. На сайте php.net можно скачать. Смотрите там. Либо поправить код - убрать в объявлении функции frontpage перед вторым параметром амперсанд.
ArchLinux x86_64

Оффлайн zz-shadow

  • Автор темы
  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Re: Downgrade php5
« Ответ #16 : 03 Июня 2010, 14:21:12 »
Доунгрейдился согласно вот этой статье: http://mrkandy.wordpress.com/2010/04/16/install-php-5-2-x-in-ubuntu-10-04-lucid/
Как бы все хорошо, и версия PH теперь та которая нужна.. одна проблема)))) в системе отсутствует libphp5.so.... и откель его теперь вытаскивать даже не знаю....  :o

Пользователь решил продолжить мысль 03 Июня 2010, 14:22:53:
как плохо что нет смайлика бьющегося головой апстенку.... так бы сейчас подошел...
« Последнее редактирование: 03 Июня 2010, 14:22:53 от zz-shadow »

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Downgrade php5
« Ответ #17 : 03 Июня 2010, 14:26:34 »
Доунгрейдился согласно вот этой статье: http://mrkandy.wordpress.com/2010/04/16/install-php-5-2-x-in-ubuntu-10-04-lucid/
Как бы все хорошо, и версия PH теперь та которая нужна.. одна проблема)))) в системе отсутствует libphp5.so.... и откель его теперь вытаскивать даже не знаю....  :o
Этот файл надо-бы скомпилировать из исходников. На сейте php.net можно скачать(версия текущая там 5.2.13), дальше читаем файлы README и INSTALL, идущие в комплекте.
Если этого файла не хватает, значит даунгрейд не прошел.
ArchLinux x86_64

Оффлайн zz-shadow

  • Автор темы
  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Re: Downgrade php5
« Ответ #18 : 03 Июня 2010, 14:38:14 »
А есть ли возможность его качнуть в виде deb пакета? У меня очень теория слабая... для меня установка из исходников... в общем я просто боюсь наломать дров)))

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Downgrade php5
« Ответ #19 : 03 Июня 2010, 14:45:26 »
думаю должны быть где-то. К сожалению подсказать тут не смогу. Попробуйте поискать в сторону подключения debian репозиториев, либо подключение репозиториев от более старой ветки ubuntu. Репозитории прописываются в /etc/apt/sources.list, но это отдельная тема.
ArchLinux x86_64

Оффлайн zz-shadow

  • Автор темы
  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Re: Downgrade php5
« Ответ #20 : 03 Июня 2010, 14:55:47 »
А если допустим попробовать качнуть на старом серваке с 9.10 старые версии php5-cgi     php5-cli     php5-common, потом их кинутьна новы и там заинсталить?

Оффлайн nick_kiev

  • Новичок
  • *
  • Сообщений: 31
    • Просмотр профиля
Re: Downgrade php5
« Ответ #21 : 03 Июня 2010, 16:18:15 »
По-моему проще будет заглянуть в код неработающего модуля и исправить его, чем возиться с downgrade..
Подсказка в какой функции что не так у вас есть, смотрим её в коде, читаем свежую доку по РНР, находим отличие и моделируем так, как должно быть.

и проще и быстрей и правильно идеологически :)

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Downgrade php5
« Ответ #22 : 03 Июня 2010, 16:25:29 »
По-моему проще будет заглянуть в код неработающего модуля и исправить его, чем возиться с downgrade..
Подсказка в какой функции что не так у вас есть, смотрим её в коде, читаем свежую доку по РНР, находим отличие и моделируем так, как должно быть.

и проще и быстрей и правильно идеологически :)
Вся проблема в том, что это стиль программиста. И неизвестно где и когда встретятся еще такие моменты, т.к. ошибки там, по сути, нету в определении. Ошибка в вызове. К примеру, есть функция test. Определена она как
function test(&$string){echo $string;}
ошибки тут нету. Она вполне работоспособна и, даже, программист как бы позаботился о выделении памяти под псевдобольшие объекты. Однако, если дальше в коде мы вызовем эту функцию как
test("My Little String");
то в версии 5.2 все будет замечательно, а версия 5.3 выскочит с фатальной ошибкой. Тут php сам себя загнал в тупик. А найти все потенциальноопасные места в коде без тестирования всей системы очень проблематично. По этому тут зависит от размера проекта. Возможно откатиться на 5.2 все-таки будет проще, чем найти все опасные места в коде.
ArchLinux x86_64

Оффлайн SureGOOD

  • Активист
  • *
  • Сообщений: 724
  • suregood.ru
    • Просмотр профиля
    • suregood.ru
Re: Downgrade php5
« Ответ #23 : 03 Июня 2010, 16:49:47 »
function test(&$string){echo $string;}Мне одному эта функция кажется странной? Зачем передавать указатель?
хмхмхм)

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Downgrade php5
« Ответ #24 : 03 Июня 2010, 16:55:05 »
это, как раз-таки, совсем не странно. Данный пример просто очень сильно утрирован. На практике такое часто может потребоваться. А вот если взять первую ошибку, которую тут привел топикстартер, то это может показаться действительно странным, т.к. такая ошибка вызывается следующим способом -
$var =& new MyObject();

Собственно весь сыр-бор из-за того, что в 5.3 коренным образом пересмотрели работу с ссылками, а раньше с ними можно было творить очень много действительно странных, и порой нелогичных вещей...
ArchLinux x86_64

Оффлайн zz-shadow

  • Автор темы
  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Re: Downgrade php5
« Ответ #25 : 03 Июня 2010, 17:34:42 »
По-моему проще будет заглянуть в код неработающего модуля и исправить его, чем возиться с downgrade..
Подсказка в какой функции что не так у вас есть, смотрим её в коде, читаем свежую доку по РНР, находим отличие и моделируем так, как должно быть.

и проще и быстрей и правильно идеологически :)
Вся проблема в том, что это стиль программиста. И неизвестно где и когда встретятся еще такие моменты, т.к. ошибки там, по сути, нету в определении. Ошибка в вызове. К примеру, есть функция test. Определена она как
function test(&$string){echo $string;}
ошибки тут нету. Она вполне работоспособна и, даже, программист как бы позаботился о выделении памяти под псевдобольшие объекты. Однако, если дальше в коде мы вызовем эту функцию как
test("My Little String");
то в версии 5.2 все будет замечательно, а версия 5.3 выскочит с фатальной ошибкой. Тут php сам себя загнал в тупик. А найти все потенциальноопасные места в коде без тестирования всей системы очень проблематично. По этому тут зависит от размера проекта. Возможно откатиться на 5.2 все-таки будет проще, чем найти все опасные места в коде.


Не.. ты не представляешь что такое перелопачивать чужой кривой код.. у которого хозяев больше 10 было)))

Пользователь решил продолжить мысль 03 Июня 2010, 15:35:12:
Короче. есть решение. Причем стопудово рабочее)) сейчас выложу)))

Пользователь решил продолжить мысль 03 Июня 2010, 17:43:30:
После еще нескольких часов гугления нашел на ЖЖшке (хоть ненавижу всю эту фигню, но даже пришлось туда залезть ради такого).
Взят за основу вот такой скрипт: #!/bin/bash
# by Ruben Barkow (rubo77) http://www.entikey.z11.de/

# Originally Posted by Bachstelze http://ubuntuforums.org/showthread.php?p=9080474#post9080474
# OK, here's how to do the Apt magic to get PHP packages from the karmic repositories:

echo "Am I root? "
if [ "$(whoami &2>/dev/null)" != "root" ] && [ "$(id -un &2>/dev/null)" != "root" ] ; then
echo " NO!

Error: You must be root to run this script.
Enter
sudo su
"
exit 1
fi
echo " OK";


# finish all apt-problems:
apt-get -f install

# remove all your existing PHP packages. You can list them with dpkg -l| grep php
PHPLIST=$(for i in $(dpkg -l | grep php|awk '{ print $2 }' ); do echo $i; done)
echo these pachets will be removed: $PHPLIST
# you need not to purge, if you have upgraded from karmic:
aptitude remove $PHPLIST
# on a fresh install, you need purge:
# aptitude remove --purge $PHPLIST


#Create a file each in /etc/apt/preferences.d like this (call it for example /etc/apt/preferences.d/php5.2);
#
#Package: php5
#Pin: release a=karmic
#Pin-Priority: 991
#
#The big problem is that wildcards don't work, so you will need one such stanza for each PHP package you want to pull from karmic:

echo ''>/etc/apt/preferences.d/php5.2
for i in $PHPLIST ; do echo "Package: $i
Pin: release a=karmic
Pin-Priority: 991
">>/etc/apt/preferences.d/php5.2; done

# duplicate your existing sources.list replacing lucid with karmic and save it in sources.list.d:
#sed s/lucid/karmic/g /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/karmic.list

# better exactly only the needed sources, cause otherwise you can get a cachsize problem:
echo "# needed sources vor php5.2:
deb http://de.archive.ubuntu.com/ubuntu/ karmic main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic main restricted

deb http://de.archive.ubuntu.com/ubuntu/ karmic-updates main restricted
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic-updates main restricted

deb http://de.archive.ubuntu.com/ubuntu/ karmic universe
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic universe
deb http://de.archive.ubuntu.com/ubuntu/ karmic-updates universe
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic-updates universe

deb http://de.archive.ubuntu.com/ubuntu/ karmic multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic multiverse
deb http://de.archive.ubuntu.com/ubuntu/ karmic-updates multiverse
deb-src http://de.archive.ubuntu.com/ubuntu/ karmic-updates multiverse

deb http://security.ubuntu.com/ubuntu karmic-security main restricted
deb-src http://security.ubuntu.com/ubuntu karmic-security main restricted
deb http://security.ubuntu.com/ubuntu karmic-security universe
deb-src http://security.ubuntu.com/ubuntu karmic-security universe
deb http://security.ubuntu.com/ubuntu karmic-security multiverse
deb-src http://security.ubuntu.com/ubuntu karmic-security multiverse
" >> /etc/apt/sources.list.d/karmic.list

aptitude update

apache2ctl restart

echo install new from karmic:
aptitude -t karmic install $PHPLIST

# at the end retry the modul libapache2-mod-php5 in case it didn't work the first time:
aptitude -t karmic install libapache2-mod-php5

apache2ctl restart


Думаю будет не сложно понять что он делает. И в принципе все что делает данный скрипт можно делать руками, но с скриптом более оптимизированее получается. Конечно, при попытках обновиться у вас установиться более новая версия PHP и "гемморой" вернется к вас с радостью снова. Вот как раз я сейчас думаю над тем как с этим бороться.
Да... идеальным решением было бы перелопачивание всего кода модулей и исправлением на более корректные функции... Но... Объем работ несопоставим с реальностью, из-за того что данный сайт является уже "не жильцом" по своей сути. В связи с тем что морально да и физически устарел его движок, который в добавок ко всему прочему (в связи с постоянным докручиванием к нему костылей криворукими программерами) стал не реальным со стороны вопроса обновления.
Как быстрый и более-менее "не гемморойный" данный "костыль" вполне подошел.

Всем спасибо за подсказки, которые прозвучали в данном топике. :-))


ЗЫ: Кстати, вот ссылка на статью, в которой все описывается: http://community.livejournal.com/ru_ubuntu/433187.html
« Последнее редактирование: 03 Июня 2010, 17:43:31 от zz-shadow »

Оффлайн nick_kiev

  • Новичок
  • *
  • Сообщений: 31
    • Просмотр профиля
Re: Downgrade php5
« Ответ #26 : 03 Июня 2010, 20:39:20 »
function test(&$string){echo $string;}Мне одному эта функция кажется странной? Зачем передавать указатель?
хмхмхм)

Раньше РНР действительно использовал указатели (с версии 3), в последних версиях решили это дело прикрыть/перестроить - из-за кучи проблем, связанных с неочевидностью реализации (http://www.php.su/learnphp/phpoo/?php5). В принципе, в С++ и прочих системных языках указатели на объекты удобны и логичны - поскольку сами объекты могут жить долго и использоваться разными функциями. Но в РНР, скриптовом языке - зачем так писать? :) Программа отработает и закроется за считанные секунды..

Цитировать
В PHP 5 объектная модель была полностью переписана для того, чтобы сразу работать с указателями на объект. Если вы явно не клонируете объект, используя ключевое слово clone, вы никогда не будете работать с копией объекта, думая, что работаете с самим объектом. В PHP 5 уже не нужно явно передавать объекты или присваивать их по ссылке, это делается автоматически.
« Последнее редактирование: 03 Июня 2010, 20:45:14 от nick_kiev »

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Downgrade php5
« Ответ #27 : 03 Июня 2010, 21:22:25 »
2nick_kiev
тогда вопрос -

function test1($myvar){$myvar++;}
function test2(&$myvar){$myvar++;}

$a = 1;
$b = 1;

test1($a);
test2($b);

echo $a;
echo "\n";
echo $b;

какой будет вывод? Т.е. есть ли разница между атомарными объектами, и объектами классов? Ну и, собственно, чем отличается объект от переменной(ссылки на объект) =)
« Последнее редактирование: 04 Июня 2010, 01:16:10 от DnSL48 »
ArchLinux x86_64

Оффлайн nick_kiev

  • Новичок
  • *
  • Сообщений: 31
    • Просмотр профиля
Re: Downgrade php5
« Ответ #28 : 04 Июня 2010, 02:12:48 »
...
какой будет вывод? Т.е. есть ли разница между атомарными объектами, и объектами классов? Ну и, собственно, чем отличается объект от переменной(ссылки на объект) =)

Пример некорректный :)
В приведённом примере результаты будут одинаковы. В моей предыдущей ссылке есть хороший пример. Цитирую:

<?php 
class Person 
     var 
$name
     function 
getName() { 
         return 
$this->name
     } 
     function 
setName($name) { 
         
$this->name $name
     } 
     function 
Person($name) { 
         
$this->setName($name); 
     } 


function 
changeName($person$name) { 
     
$person->setName($name); 


$person = new Person("Andi"); 
changeName($person"Stig"); 
print 
$person->getName(); 
?>


В РНР4 этот код выведет "Andi". Причина кроется в том, что мы передаем объект $person в функцию changeName() по значению,
а не по ссылке, таким образом, объект $person будет скопирован, и changeName() будет работать уже с копией объекта $person.
Ну а уже в РНР5 объектную модель переписали, там вышеприведённый пример отработает так, как и ожидалось автором - присвоит свойству $name объекта $person значение "Stig".
Чтоб в РНР4 код работал так-же, там надо передавать в changeName объект по ссылке.

Пользователь решил продолжить мысль 04 Июня 2010, 02:38:12:
Вся проблема в том, что это стиль программиста. И неизвестно где и когда встретятся еще такие моменты, т.к. ошибки там, по сути, нету в определении. Ошибка в вызове. К примеру, есть функция test. Определена она как
function test(&$string){echo $string;}
ошибки тут нету. Она вполне работоспособна и, даже, программист как бы позаботился о выделении памяти под псевдобольшие объекты. Однако, если дальше в коде мы вызовем эту функцию как
test("My Little String");
то в версии 5.2 все будет замечательно, а версия 5.3 выскочит с фатальной ошибкой. Тут php сам себя загнал в тупик. А найти все потенциальноопасные места в коде без тестирования всей системы очень проблематично. По этому тут зависит от размера проекта. Возможно откатиться на 5.2 все-таки будет проще, чем найти все опасные места в коде.

Кстати.. Тут как раз всё верно :) Использование указателей давно объявлено было в РНР как deprecated. В вашем примере вы объявили функцию, которая получает указатель на объект (строку) - и затем печатает её.
Но в вызове функции вы не создаёте никакого объекта-строки, вы просто вызываете функцию со строковой константой, которую нельзя изменить. Соотв. и получаем собщение об ошибке - "Fatal error: Only variables can be passed by reference"

Чтоб этот код отработал корректно - ему надо скормить переменную:

function test(&$string){echo $string;}
$str='My Little String';
test($str);

при этом в функцию test() будет передана ссылка на строку $str и при желании функция сможет внести в неё исправления.

function test(&$string) { // тут передана ссылка на глобальный объект
   $string='Change';
}
$str='My Little String';
test($str);
echo $str;

выведет 'Change', но

function test($string) { // а в этом случае будет создана копия
   $string='Change';
}
$str='My Little String';
test($str);
echo $str;

выведет 'My Little String'. Но есть универсальный способ, который будет работать на любой версии РНР без ошибок :)

function test($var) {
   global $$var;
   $$var='Change';
}
$str='My Little String';
test('str');
echo $str;

тут нет указателей, тут идёт явное объявление переменной как global - и соотв. функция получает к ней доступ напрямую, а не через копию.
« Последнее редактирование: 04 Июня 2010, 02:38:12 от nick_kiev »

Оффлайн SureGOOD

  • Активист
  • *
  • Сообщений: 724
  • suregood.ru
    • Просмотр профиля
    • suregood.ru
Re: Downgrade php5
« Ответ #29 : 04 Июня 2010, 10:52:30 »
Что-то мы от темы отошли)

 

Страница сгенерирована за 0.019 секунд. Запросов: 19.