Евгений О.
2989 сообщений
#15 лет назад
Цитата ("Lisio"):
Удачи вам в поисках заказчиков.

Спасибо . Они пока не жалуются.
Кстати ни один из Ваших примеров у меня, например, никаких глюков не вывел. Отработали как часы.
Александр Ж.
575 сообщений
#15 лет назад
Выдало бред в первом примере
Николай Г.
601 сообщение
#15 лет назад
Видимо баг в работе интерпретатора. Налицо ошибки в работе с памятью. Работу интерпретатора PHP даже не представляю, может это использование совместно с каким-то приложением сказывается. Кстати, что за версию вы используете?(Lisio и Sassoft).
Один из недостатков PHP - отсутствие возможности работать с памятью напрямую. Отсюда и получается такая вот "мистика"... Поэтому переходим на D - там таких проблем быть не может)
Андрей К.
1172 сообщения
#15 лет назад
PHP Version 5.3.2-1ubuntu4.2
Потому и полез сразу оперативку проверять, но проверка показывает, что с памятью все ок. И такой косяк возникает только в одном месте.
Александр Ж.
575 сообщений
#15 лет назад
5.1.2
Евгений О.
2989 сообщений
#15 лет назад
Цитата ("dervinar"):
Один из недостатков PHP - отсутствие возможности работать с памятью напрямую.

Не такой уж это и недостаток. Мне уже приходилось исправлять (правда не в php ) результаты некоторых любителей без всякой надобности распределять память в приложениях ручками. Да только ручки их видно кривоватые были. То после выгрузки приложения метры не очищенной памяти остаются, то приложение само свои же данные убивает. Это не так примитивно, как кажется.
Николай Г.
601 сообщение
#15 лет назад
Цитата ("elosoft"):
Не такой уж это и недостаток. Мне уже приходилось исправлять (правда не в php ) результаты некоторых любителей без всякой надобности распределять память в приложениях ручками. Да только ручки их видно кривоватые были. То после выгрузки приложения метры не очищенной памяти остаются, то приложение само свои же данные убивает. Это не так примитивно, как кажется.

В нормальных языках программирования это хотя бы можно делать) В PHP при любых проблемах с памятью приходится заявлять "баг интерпретатора".
Евгений О.
2989 сообщений
#15 лет назад
Цитата ("dervinar"):
В нормальных языках программирования это хотя бы можно делать) В PHP при любых проблемах с памятью приходится заявлять "баг интерпретатора".

Ну вроде как обещали в будущем ввести возможность работы с памятью. А пока можно считать "издержками производства".
А глюков, собственно, в любых языках предостаточно...
Максим В.
731 сообщение
#15 лет назад
PHP Version 5.2.12 - по первому скрипту выводит значение $temp1
Андрей К.
1172 сообщения
#15 лет назад
Так и придется кодить этот скрипт прямо на сервере, там хоть работает нормально. Жду следующего релиза под убунту.
Виктор Т.
1036 сообщений
#15 лет назад
Попробуйте убрать unset`ы
Андрей К.
1172 сообщения
#15 лет назад
Так в последнем примере их и нет. Проблема возникает строго после очередного запроса в базу. Причем даже если написать mysql_query('SELECT id FROM table LIMIT 1'; без использования каких либо переменных, то получается такой баг. Видимо ошибка в модуле mysql.so
Анатольевич В.
137 сообщений
#15 лет назад
Lisio, напрасно вы так. elosoft, между прочим прав. Вы бы не писали так уверенно о скриптовых языках, интерпретаторах, если до конца не разбираетесь в этом.
Андрей К.
1172 сообщения
#15 лет назад
klimz, я достаточно хорошо разбираюсь в том, как именно работает php, когда не глючит. unset никогда не исполнится после следующего за ним оператора. Считаете иначе? Приводите пример.

В тему про неожиданную многопоточность:
Себастьян Ф.
584 сообщения
#15 лет назад
Что выводит, до и после unset?


echo gettype($temp1);
echo gettype($temp2);


и так пробовали:

unset($temp1); $temp1=NULL;
unset($temp2); $temp2=NULL;
$temp1='бред';
$temp2='собачий';
echo $temp1;
die;
Андрей К.
1172 сообщения
#15 лет назад
echo '--------------<br />';
echo gettype($temp1).'<br />';
echo gettype($temp2).'<br />';
echo '--------------<br />';
unset($temp1);
unset($temp2);
echo gettype($temp1).'<br />';
echo gettype($temp2).'<br />';
echo '--------------<br />';
$temp1=NULL;
$temp2=NULL;
echo gettype($temp1).'<br />';
echo gettype($temp2).'<br />';
echo '--------------<br />';
$temp1='бред';
$temp2='собачий';
echo gettype($temp1).'<br />';
echo gettype($temp2).'<br />';
echo '--------------<br />';
echo $temp1;
die;


Ответ:
--------------


--------------


--------------
NULL
NULL
--------------
string
string
--------------
собачий
Вадим Т.
3240 сообщений
#15 лет назад
Интересная проблема, не сталкивался с таким.
Возможно, поможет пролить свет вот что:

Вызовите var_dump($GLOBALS); до обращения к mysql_query(...).
Вызовите var_dump($GLOBALS); после обращения к mysql_query(...).
Вызовите var_dump($GLOBALS); до этого блока, что Вы привели в первом посте.
Вызовите var_dump($GLOBALS); после этого блока, что Вы привели в первом посте (но перед вызовом die, конечно).

Было бы очень интересно посмотреть результат.
Андрей К.
1172 сообщения
#15 лет назад
Ушло в личку. Только после "обращения" и "до этого блока" - это одно и то же, в коде они идут один за другим.
Вадим Т.
3240 сообщений
#15 лет назад
Итог.
Вроде совместными с Lisio усилиями разобрались. Это баг PHP 5.3.* (проверяли в 5.3.0 и в 5.3.2). В более ранних версиях PHP этого бага нет.

Если кому интересно, вот пример, можете повторить у себя локально:


<?php
a(0,$$var);

$temp1=1;
$temp2=2;
echo $temp1;

function a($b,$c) {}


Этот код выводит 2, хотя должен выводить 1.
Андрей К.
1172 сообщения
#15 лет назад
Проблема отправлена в баг-трекер PHP