Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать свою суперглобальную переменную? 
V
    Опции темы
animegirl
Дата 15.3.2013, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Что я нагуглила:
http://www.php.net/manual/en/runkit.configuration.php
Если верить описанию, то добавив такого рода строчки в php.ini
Код

runkit.superglobal = _TESTT
runkit.internal_override = 1

можно будет использовать массив $_TESTT как суперглобальную переменную, однако, код:
Код

$_TESTT['test'] = 'test';

function testt()
    {
    echo $_TESTT['test'];
    }

testt();

выдаёт ошибку:
Notice: Undefined variable: _TESTT in /var/www/way.way/public/test.php on line 5
Где я не так поняла мануал?


--------------------
Скажи миру - НЯ!
PM   Вверх
ksnk
Дата 15.3.2013, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



отсюда
Цитата

Это расширение » PECL не поставляется вместе с PHP.

Информация по установке этого расширения PECL может быть найдена в главе руководства Установка PECL расширений. Дополнительная информация, такая как новые версии, скачивание, исходные файлы, информация о разработчике и CHANGELOG, может быть найдена здесь: » http://pecl.php.net/package/runkit.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 15.3.2013, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



я использую что-то подобное.. и глобально и доступно и всё моё smile
Код

class GL
{
    /** @var mixed - закрытая переменная - */
    private static $_val = array();

    /** @var mixed - публичная переменная */
    public static $val = null;

    /**
     * Получаем переменную
     * @param $name - имя
     *
     * @return mixed|null - значение переменной
     */
    public static function getVal($name)
    {
        if (self::verVal($name)) {
            $result = unserialize(self::$_val[$name]);
        } else {
            $result = null;
        }
        return $result;
    }

    /**
     * Сохраняем переменную
     * @param null  $name  - имя переменной
     * @param mixed $value - содержание переменной
     * @param bool  $flag  - флаг проверки
     *      - TRUE (по умолчанию) - игнорировать проверку на существование переменной
     *      - FALSE - сохранять если такой переменной нет
     */
    public static function setVal($name = null, $value, $flag = true)
    {
        if ($flag) {
            if (!self::verVal($name)) {
                self::$_val[$name] = serialize($value);
            }
        } else {
            self::$_val[$name] = serialize($value);
        }
    }

    /**
     * Проверяем существует ли переменная
     * @param null $name - имя переменной
     *
     * @return bool - TRUE - есть, FALSE - нет
     */
    public static function verVal($name = null)
    {
        $result = array_key_exists($name, self::$_val);
        return $result;
    }
}


а вот как использую

Код

// сохраняем объект
$class = new stdClass();
$class->id = 1;
$class->name = 'Name';
GL::setVal('qwerty1', $class);

// Сохраняем массив
$array = array('2','primer 1','primer 6', 'qwerty', 5);
GL::setVal('qwerty2', $array);

// Проверяем
var_dump(GL::verVal('qwerty1'));
var_dump(GL::verVal('qwerty2'));
var_dump(GL::verVal('qwerty3'));

// Получаем
var_dump(GL::getVal('qwerty1'));
var_dump(GL::getVal('qwerty2'));
var_dump(GL::getVal('qwerty3'));


ну или простое использование с собственным контролем что и как хранить
Код

// сохраняем
GL::$val = 222;
// получаем
echo GL::$val;



или как в вопросе
Код

GL::$val['test'] = 'test';
function testt()
    {
    echo GL::$val['test'];
    }
testt();


Код

GL::setVal('test', 'test');
function testt()
    {
    echo GL::getVal('test');
    }
testt();



Это сообщение отредактировал(а) Gold Dragon - 15.3.2013, 17:23


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
animegirl
Дата 17.3.2013, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



ksnk
Цитата

WARNING: 0.9 does not compile with PHP 5.2+ so use the CVS version instead.

Что такое CVS?


--------------------
Скажи миру - НЯ!
PM   Вверх
MoLeX
Дата 17.3.2013, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



animegirl, бан в гугле?
http://ru.wikipedia.org/wiki/CVS


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
animegirl
Дата 17.3.2013, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



MoLeX, Я просто не поняла, что делать в итоге :(


--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 17.3.2013, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



animegirl, лучше не делать.

Зачем тебе эта суперглобальная переменная?

Добавлено @ 21:39
собирать модуль и ставить его руками.

Это сообщение отредактировал(а) Fortop - 17.3.2013, 21:40


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 17.3.2013, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Да надоело в каждой функции прописывать список всего что надо, чисто эстетический вид и простота в чтение кода.

Да там одно и тоже, что с подчёркиванием, что без него, нужно ставить модуль, а он не встанет на новый ПХП, а разрабочица этого модуля забила на ПХП так как ушла работать в файсбук :(


--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 17.3.2013, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(animegirl @  17.3.2013,  21:42 Найти цитируемый пост)
Да надоело в каждой функции прописывать список всего что надо, чисто эстетический вид и простота в чтение кода.

Возможно стоит пересмотреть архитектуру? smile

Писать все что нужно в каждой функции не обязательно


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 18.3.2013, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Ну просто много функций, где нету результата типа false/true  а какие-нибудь данные возвращаются, хочется это межскриптно упорядочить.


--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 18.3.2013, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(animegirl @  18.3.2013,  00:49 Найти цитируемый пост)
Ну просто много функций, где нету результата типа false/true  а какие-нибудь данные возвращаются, хочется это межскриптно упорядочить. 

Почему эти данные не могут возвращаться из функции?
Зачем их обязательно передавать через суперглобальные переменные?

Код

function getArray() {
    return [1,2,3,4,5];
}

$a = getArray();




--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 18.3.2013, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Для удобства, не более и не менее


--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 18.3.2013, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



animegirl, Если только для удобства, то и пользуйтесь $GLOBALS

Добавлено через 53 секунды
Но в целом, ограничение области видимости для возвращаемых результатов дает много больше удобства. И чем крупнее программа, тем неудобнее суперглобальные переменные


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 18.3.2013, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Fortop, Была такая мысль, но ведь если найти багу для инжекта, его можно вывести дампом, по этому хотелось переменную свою )


--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 18.3.2013, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(animegirl @  18.3.2013,  01:50 Найти цитируемый пост)
но ведь если найти багу для инжекта, его можно вывести дампом, по этому хотелось переменную свою ) 

Кто помешает вывести эту самую "свою"?

Код

print_r(get_defined_vars());



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 18.3.2013, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Ясно, значит $_GLOBALS


--------------------
Скажи миру - НЯ!
PM   Вверх
Gold Dragon
Дата 18.3.2013, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



animegirl, а чем тебе не понравился мой класс? Это и есть "глобальная переменная"  smile 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
animegirl
Дата 18.3.2013, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



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


--------------------
Скажи миру - НЯ!
PM   Вверх
Gold Dragon
Дата 18.3.2013, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



animegirl, ну в данной ситуации, тебе просто нужно его подключить в самом начале и ты получишь возможность управлять своей "глобальной переменной". Примеры как использовать я показал. А про Глобальные переменные забудь.. Получила данные из глобальной, присвоила их переменной и уже дальше работай со своими переменными. И использование global в  функциях это тоже зло.. Не ленись передавать функциям параметры и возвращать их.


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 18.3.2013, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(animegirl @  18.3.2013,  07:30 Найти цитируемый пост)
а нето будет как всегда, сначала не понимаешь и злишься, а потом нравится и убиваешь уйму времени, чтоб всё переделать на новый лад. 

А сейчас будет не так?  smile Только переписывать придется больше, так больше успеешь написать


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
MoLeX
Дата 18.3.2013, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



мне больше нравится использовать возможности 5.4 и без использования классов
Код

<?php
function GL( $key = null, $value = null )
{
    static $global = array();

    if( $key === null )
        return $global;

    if( $value === null )
        return $global[$key];

    if( $value != null )
        $global[$key] = $value;
}
;

function mytest()
{
    GL( 'array', array( 'key' => 'value' ) );
}

GL( 'var1', '1' );
GL( 'var2', '2' );
GL( 'var3', '3' );
mytest();

echo '<pre>';
var_dump( GL() );
var_dump( GL( 'var1' ) );
var_dump( GL()['var1'] );
var_dump( GL()['array']['key'] );


для версии ниже 5.4 последние два способа будут не доступны (GL()['var1'], GL()['array']['key'])


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
IgorIV
Дата 18.3.2013, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 7.9.2009

Репутация: 2
Всего: 8



Цитата(animegirl @ 17.3.2013,  21:42)
Да надоело в каждой функции прописывать список всего что надо, чисто эстетический вид и простота в чтение кода.

Да там одно и тоже, что с подчёркиванием, что без него, нужно ставить модуль, а он не встанет на новый ПХП, а разрабочица этого модуля забила на ПХП так как ушла работать в файсбук :(

Я так думаю, что надо привести пример функции которая показывает " список всего, что надо". Может ошибка в подходе?
А вот про модуль не понял
PM MAIL   Вверх
animegirl
Дата 19.3.2013, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Ситуация, такова, у меня на каждую функцию проекта, свой ПХП файл.
Есть 2-3 файла инклуда с основными функциями и вариаблами.
Функции очень сильно перемешаны друг с другом, каждый раз для вызова, чего-то нового, нужно передавать кучу вариабл,. Если я хочу добавить новую вариаблу, то мне приходится в каждом из 100+ ПХП файлов добавить эту вариаблу к вызовам функции, хотя её спокойно, можно создать в обработки другой функции, и оставить в глобальных. Я сейчас перешла на $GLOBALS, минут за 30 перевела все скрипты на новый способ общения, и в принципе очень даже рада. Вносить изменения стало намного легче.

По поводу модуля. Модуль упомянутый выше runkit писался девушкой для PHP, но она перестала его обновлять, так как её утянули работать в фэйсбук, последния версия модуля датируется 2006ым годом, и он не работает с PHP 5.2+ :(


--------------------
Скажи миру - НЯ!
PM   Вверх
Aliance
Дата 19.3.2013, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Цитата(animegirl @  19.3.2013,  17:05 Найти цитируемый пост)
Ситуация, такова, у меня на каждую функцию проекта, свой ПХП файл.
Есть 2-3 файла инклуда с основными функциями и вариаблами.
Функции очень сильно перемешаны друг с другом, каждый раз для вызова, чего-то нового, нужно передавать кучу вариабл,. Если я хочу добавить новую вариаблу, то мне приходится в каждом из 100+ ПХП файлов добавить эту вариаблу к вызовам функции, хотя её спокойно, можно создать в обработки другой функции, и оставить в глобальных. Я сейчас перешла на $GLOBALS, минут за 30 перевела все скрипты на новый способ общения, и в принципе очень даже рада. Вносить изменения стало намного легче.

 smile  smile  smile 
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 19.3.2013, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(animegirl @  19.3.2013,  16:05 Найти цитируемый пост)
Функции очень сильно перемешаны друг с другом, каждый раз для вызова, чего-то нового, нужно передавать кучу вариабл,.

Это указывает на ошибку в разработке самих функций.

Выделение кода в функцию производится по двум признакам - повторяемость и специализация.
Т.е. выделяемый код должен выполнять некие специализированные действия и/или повторятся неоднократно

Таким образом в функцию совсем не нужно передавать огромную кучу переменных (в силу того что она выполняет не слишком сложные действия)
Функция даже с 5тью обязательными параметрами достаточно сложна. Если у вас есть большее количество параметров, то скорее всего они поддаются группировке, а значит вы можете передавать несколько объектов или массивов вместо сотен параметров.

Это сообщение отредактировал(а) Fortop - 19.3.2013, 17:08


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
IgorIV
Дата 19.3.2013, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 7.9.2009

Репутация: 2
Всего: 8



animegirl,  как вы там пишете?  smile 
smile
PM MAIL   Вверх
animegirl
Дата 19.3.2013, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



IgorIV
script.php
Код

<?
require_once '../inc/stats.inc';
$GLOBALS['script_name'] = basename(__FILE__,'.php');
...


stats.inc
Код

<?
$GLOBALS['start_time'] = microtime(TRUE);
function stop_timer()
    {
    $GLOBALS['run_time'] = microtime(TRUE) - $GLOBALS['start_time'];
    }

function write_log()
    {
    $main_path = substr(dirname(__FILE__),0,-3);
    if($GLOBALS['script_name'])
        {
        stop_timer();
        if(!file_exists($main_path.'stats/runtime/'.$GLOBALS['script_name']) AND is_writable($main_path.'stats/runtime'))
            {
            mkdir($main_path.'stats/runtime/'.$GLOBALS['script_name']);
            }
        $filename = $main_path.'stats/runtime/'.$GLOBALS['script_name'].'/'.@date('d.m.y_H.i.s').'.log';
        if(!file_exists($filename) OR is_writable($filename))
            {
            if($handle = @fopen($filename, 'a'))
                {
                @fwrite($handle,$GLOBALS['run_time']."\n");
                @fclose($handle);
                }
            }
        }
    }

register_shutdown_function('write_log');
?>

Это часть кода, часть функции write_log, вариабла $GLOBALS['run_time'] ещё используется там не однократно.
Это один из примеров, не хочется без надобности постить сюда кучу своего кода smile


--------------------
Скажи миру - НЯ!
PM   Вверх
animegirl
Дата 19.3.2013, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Другой пример (без кода).
У меня используются несколько разных соединений с базой, отправка запросов делается через 2 разные функции, каждая из которых:
1. Проверяет существует ли уже соединение для её типа, если нет создаёт
2. Отправляет sql запрос по правильному каналу, если запрос не проходит создаёт репорт ошибки в файл

Если оставить вариант, с передачей переменных, то их надо сначала создавать, потом передавать, а так функции становятся более автономными, что уменьшает возможность ошибки при неправильном описании их вызова. Меньше шансов на ошибку -> меньше потраченного времени, на её поиск.


--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 19.3.2013, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(animegirl @  19.3.2013,  18:15 Найти цитируемый пост)
$GLOBALS['script_name'] = basename(__FILE__,'.php');

меняем на такой код в  write_log();

Код

<?php
$trace = debug_backtrace();
echo reset($trace)['file'];


можно даже на такое
Код

<?php
$trace = debug_backtrace();
echo $trace[0]['file'];


Что мы имеем? Теперь нам неважно установлена ли $GLOBALS['script_name'] в вызывающем скрипте и правильно ли она установлена. Мы сами можем узнать откуда нас - write_log() вызвали.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 19.3.2013, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Fortop
Код

$trace = debug_backtrace();
echo reset($trace)['file'];

выдаёт
Код

Parse error: syntax error, unexpected '[', expecting ',' or ';' in ....


Код

$trace = debug_backtrace();
echo $trace[0]['file'];

выдаёт
Код

Notice: Undefined index: file in ...



--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 19.3.2013, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(animegirl @  19.3.2013,  19:18 Найти цитируемый пост)
arse error: syntax error, unexpected '[', expecting ',' or ';' in ....

Версия php  у тебя меньше 5.4

Код

$trace = debug_backtrace();
$firstLine = reset($trace);
echo $firstLine['file'], PHP_EOL;


Цитата(animegirl @  19.3.2013,  19:18 Найти цитируемый пост)
Notice: Undefined index: file in ...

Вызываешь debug_backtrace() напрямую вне функции или подключаемого файла.
Поэтому стектрейса нет.

Для таких случаев можно добавить подобную проверку

Код

if ($trace = debug_backtrace()) {
    $firstLine = reset($trace);
    echo $firstLine['file'], PHP_EOL;
} else {
    echo __FILE__, PHP_EOL; 
}



Добавлено через 2 минуты и 9 секунд
для получения времени работы можно пользоваться или xhproof
Он запишет не только время выполнения каждого запуска скрипта, но и время выполнения отдельных функций в скрипте


В самом же скрипте можно использовать getrusage()

Код


$dat = getrusage();
echo $dat["ru_utime.tv_sec"]*1e6+$dat["ru_utime.tv_usec"], PHP_EOL; // время выполнения скрипта в миллисекундах



Добавлено через 2 минуты и 58 секунд

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


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 19.3.2013, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Цитата(Fortop @  19.3.2013,  19:33 Найти цитируемый пост)
Вызываешь debug_backtrace() напрямую вне функции или подключаемого файла.

То есть перелопатить все 100+ файлов на добавление этой строчки, а потом каждый раз когда захочу подправить, что-то опять все файлы править, разве не для этого функции придумали?

Спасибо за функцию getrusage(), надо будет глянуть, что она может. Ну и как я уже написла, это только часть лога )
Для статистики по MySQL тоже есть команды готовые?


--------------------
Скажи миру - НЯ!
PM   Вверх
IgorIV
Дата 19.3.2013, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 7.9.2009

Репутация: 2
Всего: 8



animegirl
Код


$start_time = microtime(TRUE);

function stop_timer()
{
    global $start_time;

    $run_time = microtime(TRUE) - $start_time;
    return $run_time;
}

function write_log($file)
{
    $main_path = substr(dirname(__FILE__),0,-3);
    if($file)
    {
        $run_time = stop_timer();
        $path = $main_path.'stats/runtime/'.$file;
        if(!file_exists($path) )
        {
            if (!mkdir($main_path.'stats/runtime/'.$file, 0755, true))
            {
               echo 'Не удалось создать директории...';
            }
        }
        else
        {
            //echo 'есть директория<br />';
        }
        $filename = $main_path.'stats/runtime/'.$file.'/'.date('d.m.y_H.i.s').'.log';
        if(file_exists($path) OR is_writable($path))
        {
            file_put_contents($filename, $run_time, FILE_APPEND);
        }
        else
        {
            //echo 'путь не существует<br />';
        }
    }

}

register_shutdown_function('write_log', basename(__FILE__,'.php'));



Как-то так, особо не ломая код.
PM MAIL   Вверх
animegirl
Дата 19.3.2013, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



IgorIV
Замысел был красив, но я это уже проходила, чуток в другой форме, но всё равно, в $file запишется stats.inc


--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 19.3.2013, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(animegirl @  19.3.2013,  19:58 Найти цитируемый пост)
То есть перелопатить все 100+ файлов на добавление этой строчки

Зачем лопатить?

Я же тебе показал в  write_log() дописываешь код с debug_backtrace()
Естественно без echo, а так как тебе нужно - т.е. с прочтением в локальную переменную
и используешь ее вместо своего GLOBALS

И тебе больше не нужно будет прописывать 
Код

$GLOBALS['script_name'] = basename(__FILE__,'.php');



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 19.3.2013, 23:06 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Fortop
И результат будет тот же, что и у Игоря, и что у меня два дня назад, если вызывать debug_backtrace() либо __FILE__ внутри stat.inc то выдадут они в итоге stat.inc а не то скрипт, который надо отследить. Я даже предположу, что debug_backtrace() сам использует __FILE__  smile 


--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 19.3.2013, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(animegirl @  19.3.2013,  23:06 Найти цитируемый пост)
 если вызывать debug_backtrace() либо __FILE__ внутри stat.inc то выдадут они в итоге stat.inc а не то скрипт, который надо отследить.

Что за тупые предположения?


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

#0  include() called at [/usr/share/php/libzend-framework-php/Zend/View.php:108]
#1  Zend_View->_run(/home/www/gobookee.test/application/views/scripts/search/index.phtml) called at [/usr/share/php/libzend-framework-php/Zend/View/Abstract.php:888]
#2  Zend_View_Abstract->render(search/index.phtml) called at [/usr/share/php/libzend-framework-php/Zend/Controller/Action/Helper/ViewRenderer.php:900]
#3  Zend_Controller_Action_Helper_ViewRenderer->renderScript(search/index.phtml, ) called at [/usr/share/php/libzend-framework-php/Zend/Controller/Action/Helper/ViewRenderer.php:921]
#4  Zend_Controller_Action_Helper_ViewRenderer->render() called at [/usr/share/php/libzend-framework-php/Zend/Controller/Action/Helper/ViewRenderer.php:960]
#5  Zend_Controller_Action_Helper_ViewRenderer->postDispatch() called at [/usr/share/php/libzend-framework-php/Zend/Controller/Action/HelperBroker.php:277]
#6  Zend_Controller_Action_HelperBroker->notifyPostDispatch() called at [/usr/share/php/libzend-framework-php/Zend/Controller/Action.php:527]
#7  Zend_Controller_Action->dispatch(indexAction) called at [/usr/share/php/libzend-framework-php/Zend/Controller/Dispatcher/Standard.php:295]
#8  Zend_Controller_Dispatcher_Standard->dispatch(Zend_Controller_Request_Http Object ([] => Array ([0] => _GET,[1] => _POST),[] => /search.php?q=wireless+communication,[] => http://www.gobookee.test,[] => ,[] => /search.php,[] => Array ([q] => wireless communication,[controller] => search,[action] => index),[] => ,[] => Array (),[] => 1,[] => default,[] => module,[] => search,[] => controller,[] => index,[] => action), Zend_Controller_Response_Http Object ([] => Array (),[] => Array (),[] => Array (),[] => Array (),[] => 200,[] => ,[] => ,[headersSentThrowsException] => 1)) called at [/usr/share/php/libzend-framework-php/Zend/Controller/Front.php:954]
#9  Zend_Controller_Front->dispatch() called at [/usr/share/php/libzend-framework-php/Zend/Application/Bootstrap/Bootstrap.php:97]
#10 Zend_Application_Bootstrap_Bootstrap->run() called at [/usr/share/php/libzend-framework-php/Zend/Application.php:366]
#11 Zend_Application->run() called at [/home/www/gobookee.test/htdocs/index.php:65]




--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 20.3.2013, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Fortop
Каюсь, не посмотрела, выдачу всего массива, попробовала из файла stat.inc 
Код

$bt = debug_backtrace();
echo $bt[0]['file'];

Выдаёт index.php как и надо, но если перенести эти строки в другой инклуд файл, то всё смещается, на позиции 0 встаёт stat.inc а index.php уходит на позицию 1.

И как теперь там искать нужное, если $GLOBALS['script_name'] используется в разных местах?


--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 20.3.2013, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(animegirl @  20.3.2013,  00:06 Найти цитируемый пост)
И как теперь там искать нужное, если $GLOBALS['script_name'] используется в разных местах? 

Как определяется его нужность?
Чем определяется логика его установки?

Первый скрипт, который собственно был запущен?
Массив работает по принципу стека.
0й элемент - ближайший вызов
Последний элемент - первый вызов

Через сколько бы include у вас мой код не вызвался.

Это сообщение отредактировал(а) Fortop - 20.3.2013, 01:43


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 20.3.2013, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Fortop

a.php
Код

<?
require_once 'b.php';
?>


b.php
Код

<?
require_once 'c.php';
?>


c.php
Код

<?
$bt = debug_backtrace();
print_r($bt);
?>

=
Цитата(Browser)

Array ( [0] => Array ( [file] => /var/www/way.way/public/tests/b.php [line] => 2 [function] => require_once ) [1] => Array ( [file] => /var/www/way.way/public/tests/a.php [line] => 2 [args] => Array ( [0] => /var/www/way.way/public/tests/b.php ) [function] => require_once ) )



--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 20.3.2013, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



В чем вопрос?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 20.3.2013, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Fortop, В том, что a.php (забыла упомянуть, что выдача с него), не в [0]


--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 20.3.2013, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(Fortop @  20.3.2013,  01:41 Найти цитируемый пост)
0й элемент - ближайший вызов
Последний элемент - первый вызов



Цитата(animegirl @  20.3.2013,  01:49 Найти цитируемый пост)

Array ( 
[0] => Array ( [file] => /var/www/way.way/public/tests/b.php [line] => 2 [function] => require_once ) 
[1] => Array ( [file] => /var/www/way.way/public/tests/a.php [line] => 2 [args] => Array ( [0] => /var/www/way.way/public/tests/b.php ) [function] => require_once ) )



Как это выглядит когда файлов больше 10ти я показывал выше http://forum.vingrad.ru/index.php?showtopi...t&p=2554174

Где был вызыван debug_backtrace()
Цитата(Fortop @  19.3.2013,  23:43 Найти цитируемый пост)
include() called at [/usr/share/php/libzend-framework-php/Zend/View.php:108]



А это собственно файл к которому мы обратились самым первым
Цитата(Fortop @  19.3.2013,  23:43 Найти цитируемый пост)
#11 Zend_Application->run() called at [/home/www/gobookee.test/htdocs/index.php:65]








--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
IgorIV
Дата 20.3.2013, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 7.9.2009

Репутация: 2
Всего: 8



Цитата(animegirl @  19.3.2013,  22:49 Найти цитируемый пост)
Замысел был красив, но я это уже проходила, чуток в другой форме, но всё равно, в $file запишется stats.inc

 smile  smile 

Посмотри вывод


Код

a.php

$all_start_time = microtime(TRUE);

require_once 'animegirl.php';
require_once 'b.php';

register_shutdown_function('write_log', basename(__FILE__,'.php'));



$all_time = microtime(TRUE) - $all_start_time;

echo  '<br /> all_time  = '.$all_time.'<br />';



b.php

Код

require_once 'c.php';
register_shutdown_function('write_log', basename(__FILE__,'.php'));


c.php
Код

$bt = debug_backtrace();
print_r($bt);
echo '<hr />';

register_shutdown_function('write_log', basename(__FILE__,'.php'));



animegirl.php
Код


$start_time = microtime(TRUE);

function stop_timer()
{
    global $start_time;

    $run_time = microtime(TRUE) - $start_time;
    return $run_time;
}

function write_log($file)
{
    $main_path = substr(dirname(__FILE__),0,-3);
    if($file)
    {
        $run_time = stop_timer();
        $path = $main_path.'stats/runtime/'.$file;
        if(!file_exists($path) )
        {
            if (!mkdir($main_path.'stats/runtime/'.$file, 0755, true))
            {
                die('Не удалось создать директории...');
            }
        }
        else
        {
            echo 'есть директория<br />';
        }
        $filename = $main_path.'stats/runtime/'.$file.'/'.date('d.m.y_H.i.s').'.log';
        if(file_exists($path) OR is_writable($path))
        {
            file_put_contents($filename, $run_time, FILE_APPEND);
        }
        else
        {
            echo 'путь не существует<br />';
        }
    }
    echo '0_script_name = '.$file."<br />";
    echo '0_start_time = '.$start_time."<br />";
    echo '0_run_time = '.$run_time."<br />";
}

register_shutdown_function('write_log', basename(__FILE__,'.php'));



    echo '1_script_name = '.$file."<br />";
    echo '1_start_time = '.$start_time."<br />";
    echo '1_run_time = '.$run_time."<br />";


$dat = getrusage();

//var_dump ($dat);
echo '<br />getrusage = '.($dat["ru_utime.tv_sec"]*1e6+$dat["ru_utime.tv_usec"]), PHP_EOL; // время выполнения скрипта в миллисекундах
echo '<br />';
echo '<hr />';



Код

1_script_name = 
1_start_time = 1363799677.6567
1_run_time = 

getrusage = 822486 
Array ( [0] => Array ( [file] => /usr/local/www/apache22/data/screenn.local/tmp/b.php [line] => 7 [function] => require_once ) 
[1] => Array ( [file] => /usr/local/www/apache22/data/screenn.local/tmp/a.php [line] => 11 
[args] => Array ( [0] => /usr/local/www/apache22/data/screenn.local/tmp/b.php ) [function] => require_once ) ) 

 all_time = 0.0010559558868408
есть директория
0_script_name = animegirl
0_start_time = 
0_run_time = 0.00098991394042969
есть директория
0_script_name = c
0_start_time = 
0_run_time = 0.0016179084777832
есть директория
0_script_name = b
0_start_time = 
0_run_time = 0.0021259784698486
есть директория
0_script_name = a
0_start_time = 
0_run_time = 0.002613067626953


Это сообщение отредактировал(а) IgorIV - 20.3.2013, 20:21
PM MAIL   Вверх
IgorIV
Дата 20.3.2013, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 7.9.2009

Репутация: 2
Всего: 8



Но мне кажется я не понял задачу? Время выполнения какого скрипта интересует?
PM MAIL   Вверх
animegirl
Дата 20.3.2013, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



IgorIV
Главного, спасибо за помощь, мы вчера в глубокой ночи, всё-таки нашли решение:
Код

$bt = end(debug_backtrace());
$GLOBALS['script_name'] = basename($bt['file'],'.php');



--------------------
Скажи миру - НЯ!
PM   Вверх
Fortop
Дата 20.3.2013, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



animegirl, ну ад же

debug_backtrace() тебе нужен только в самой функции лога.
Зачем ты его результат пишешь в GLOBALS?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
animegirl
Дата 21.3.2013, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Незнайка на Марсе
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 24.7.2011

Репутация: нет
Всего: нет



Fortop
У меня несколько функций для сбора разных логов по надобности


--------------------
Скажи миру - НЯ!
PM   Вверх
IgorIV
Дата 22.3.2013, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 7.9.2009

Репутация: 2
Всего: 8



Цитата(animegirl @  21.3.2013,  00:10 Найти цитируемый пост)
У меня несколько функций для сбора разных логов по надобности

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

Код

function write_log($file, $dir='/stats/runtime/', $text='')
{
    $main_path = substr(dirname(__FILE__),0,-3);
    if($file)
    {
        $text =  !empty($text) ? $text : stop_timer();
        $path = $main_path.$dir.$file;
        if(!file_exists($path) )
        {
            if (!mkdir($main_path.$dir.$file, 0755, true))
            {
                die('Не удалось создать директории...');
            }
        }
        else
        {
            echo 'есть директория<br />';
        }
        $filename = $main_path.$dir.$file.'/'.date('d.m.y_H.i.s').'.log';
        if(file_exists($path) OR is_writable($path))
        {
            file_put_contents($filename, $text, FILE_APPEND);
        }
        else
        {
            echo 'путь не существует<br />';
        }
    }

}

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1763 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.