Forum Webscript.Ru
Программирование => PHP => Тема начата: Vint от 07 Марта 2002, 16:54:56
-
Условие:
есть переменная
$var=array
(
"http://host1/"=>array
(
"ses"=>"OTcyNjk0MTA41",
"id"=>"value1"),
"http://host2/"=>array
(
"ses"=>"OTcyNjk0MTA42",
"id"=>"value2")
);
Задача: сохранить ее в файл так, чтобы потом инклудя файл она (переменная) инициализировалась.
Испробованные варианты:
1. Ес-но обычный перебор, но иногда мозги заворачиваются от list=each, пошел искать пути полегче.
2. var_dump. Сначала конечно обнадеживает, кажется, что все будет хорошо, но ес-но переменная не инициализируется по строке
array(2) {
["http://host1/"]=>
array(2) {
["ses"]=>
string(13) "OTcyNjk0MTA41"
["id"]=>
string(6) "value1"
}
["http://host2/"]=>
array(2) {
["ses"]=>
string(13) "OTcyNjk0MTA42"
["id"]=>
string(6) "value2"
}
}
это неправильно, хотя смотреть что у тебя в переменной оч. удобно. Может дажи и дебаггера не надо.
3. print_r. Prints human-readable information about a variable. Просто YO! Действительно смотреть на переменную удобнее, но проблема таже, что и var_dump.
4. var_export. ...that the returned representation is valid PHP code. Ну, думаю, закончились мои мучения. А-н нет. :(
PHP 4 CVS only. А я про ентот CVS ни разу и не слыхал.
Может кто еще варианты какие знает, список пополнить поможет?
Заранее сенк.
-
А serialize(); и unserialize(); не подходят?
-
это конечно мысля... одно только плохо, надо не забывать потом unserialize делать... наверное все-таки буду свою функцию писать... да и на будущее может пригодиться.
-
Короче вот что получилось, писал чисто под свои нужнды, чтобы обрабатывалось только то, что мне нужно:
имеется завернутая такая переменная и функция VarDump($var)
$var=array
(
1=>"adsf",
"http://host1/"=>array
(
"ses"=>"OTcyNjk0MTA41",
"id"=>"value1"),
"http://host2/"=>array
("mes"=>array
("from"=>"me",
"id"=>1234
),
"ses"=>"OTcyNjk0MTA42",
"id"=>"value2")
);
function VarDump($var,$space="")
{static $retVal="";
$pref=";\\n";
switch(gettype($var))
{case "integer":
$retVal.=intval($var);
break;
case "string":
$retVal.="\\"$var\\"";
break;
case "array":
$pref="\\n";
$retVal.="array(";
$space.=" ";
while(list($key,$value)=each($var))
{is_int($key)?$retVal.=$pref.$space.$key."=>":$retVal.=$pref.$space."\\"$key\\"=>";
VarDump($var[$key],$space);
$pref=",\\n";
}
$retVal.="\\n$space)";
$pref=";";
break;
default: $retVal.="0"; break;
}
return $retVal.$pref;
}
если говорим echo VarDump($var);, то получаем:
array(
1=>"adsf",
"http://host1/"=>array(
"ses"=>"OTcyNjk0MTA41",
"id"=>"value1"
),
"http://host2/"=>array(
"mes"=>array(
"from"=>"me",
"id"=>1234
),
"ses"=>"OTcyNjk0MTA42",
"id"=>"value2"
)
);
а это является правильным объявлением, что и требовалось доказать.
NAS, скажи, что я тормоз и дурак, и что что-то похожее уже давно написано и есть в стандартных функция (как прошлый раз) :)
-
Если требуется сохранить переменную в файле, почему нельзя использовать алгоритм:
1. serialize
2. сохраняем результат в файле
...
3. загружаем из файла
4. unserialize()
все. почему этот вариант не подходит?
-
да впринципе совершенно нормальный вариант, только
1. файл инклудится в разных местах и поэтому приятно не задумываться о unserialize() . Алгоритм сводится к сохранили, загрузили.
2. мой вариант куда приятнее глазам в файле, чем \'O:1:"a":1:{s:5:"value в файле, да и самому подправить/посмотреть можно.
Лучше скажи, как тебе мой последний вариант :)
-
это несколько неоптимальный вариант.
что требуется? постоянно наблюдать глазами за служебный информацией в файлах? ;)
правка может быть из скрипта (изменение переменной), тем более так корректнее.
1. файл инклудится в разных местах и поэтому приятно не задумываться о unserialize() . Алгоритм сводится к сохранили, загрузили.
один (!) раз загружаем переменную и все!!! один раз unserialize().
и еще, какая разница м/д вариантами в таком случае, кстати?
да, а как будет загрузка происходить?
если eval - это еще и небезопасно.
-
один (!) раз загружаем переменную и все!!! один раз unserialize().
ну вот, сейчас ты меня убедишь, что я ее (переменную) загружаю только один раз. нет! не один! много и в разных местах, я уже об этом писал. эта инфа сохраняется довольно часно, в среднем около 10 раз за проход скрипта.
тем более так корректнее
чем это корректнее?
какая разница м/д вариантами в таком случае, кстати?
во первый случай не такой, а даже если и такой, то просто приятнее.
да, а как будет загрузка происходить?
require и все, а с serialize в файле хранится $a="a:23...", потоп нужно сделать $a=unserialize($a) и так все переменные... это уже можно отдельную функцию на инклуд переменных писать. Не, мне мой вариант куда больше нравится... особенно после споров с тобой.
если eval - это еще и небезопасно.
а я не боюсь, что кто-то увидит сохраненные куки или ссылки :), вот такой вот я смелый :)
-
мое дело предложить ;)
-
люди, ну посоветуйте еще что-нить. плз!
-
а я не боюсь, что кто-то увидит сохраненные куки или ссылки , вот такой вот я смелый
да? а shellexec на твоем сервере тебя не пугает?
люди, ну посоветуйте еще что-нить. плз!
а что еще тебя интересует?
во первый случай не такой, а даже если и такой, то просто приятнее.
чем, интересно?
среднем около 10 раз за проход скрипта.
а об оптимизации не думал?
-
да? а shellexec на твоем сервере тебя не пугает?
неа, я не знаю, что это такое. А что, это страшно? Последствия? Насколько это сложно?
чем, интересно?
тем, что данные читабельные :)
а об оптимизации не думал?
может посоветуешь что? значит скрипт получает содержимое страничек, след-но если не работает socket_set_timeout() при получении любой странички может получиться таймаут, значит желательно сохранить результаты. ЛИбо потом все повторять сначала. Вот он и сохранят перед получением странички данные, необходимые для восстановления данные. Скрипт рассчитан на небольшую нагрузку, врядли его будут юзать одновременно 2 человека :).
-
Я подобное (правда в более сложном варианте) делал таким образом:
У меня массив был многоуровневым, с любым количеством вложений. Писал функцию, сохраняющую текущую ветку в inc-файл, потом, если текущее поле было Array, рекурсивно вызывал саму себя. Получался аккуратненький файлик с PHP-объявлением массива. Потом я его инклюдил, где надо - и все замечательно работало...
вот.
P.S. исходник не кидаю, он большой и запутанный, а выдирать из него лишнее неохота.
-
Metaller
У меня массив был многоуровневым, с любым количеством вложений.
А дай исходник :)
-
AlieN
Секрет фирмы.... гы.. :-))))
-
неа, я не знаю, что это такое. А что, это страшно? Последствия? Насколько это сложно?
т.е. дается потенциальная возможность запустить любую команду на твоем севере. а она может нести вредоносный характер.
не пойму... чем вариант serialize/unserialize ломает?
кроме красивого отображения и все такое...
по крупному? а?