Forum Webscript.Ru

Программирование => PHP => Тема начата: Vint от 07 Марта 2002, 16:54:56

Название: var_dump и т.д
Отправлено: 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 ни разу и не слыхал.
Может кто еще варианты какие знает, список пополнить поможет?
Заранее сенк.
Название: var_dump и т.д
Отправлено: Dm от 07 Марта 2002, 17:19:56
А serialize(); и unserialize(); не подходят?
Название: var_dump и т.д
Отправлено: Vint от 08 Марта 2002, 11:57:18
это конечно мысля... одно только плохо, надо не забывать потом unserialize делать... наверное все-таки буду свою функцию писать... да и на будущее может пригодиться.
Название: вариант 5
Отправлено: Vint от 08 Марта 2002, 13:49:36
Короче вот что получилось, писал чисто под свои нужнды, чтобы обрабатывалось только то, что мне нужно:
имеется завернутая такая переменная и функция 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, скажи, что я тормоз и дурак, и что что-то похожее уже давно написано и есть в стандартных функция (как прошлый раз) :)
Название: var_dump и т.д
Отправлено: Dm от 08 Марта 2002, 17:13:43
Если требуется сохранить переменную в файле, почему нельзя использовать алгоритм:
1. serialize
2. сохраняем результат в файле
...
3. загружаем из файла
4. unserialize()

все. почему этот вариант не подходит?
Название: var_dump и т.д
Отправлено: Vint от 08 Марта 2002, 17:20:58
да впринципе совершенно нормальный вариант, только
1. файл инклудится в разных местах и поэтому приятно не задумываться о unserialize() . Алгоритм сводится к сохранили, загрузили.
2. мой вариант куда приятнее глазам в файле, чем \'O:1:"a":1:{s:5:"value в файле, да и самому подправить/посмотреть можно.
Лучше скажи, как тебе мой последний вариант :)
Название: var_dump и т.д
Отправлено: Dm от 08 Марта 2002, 22:30:53
это несколько неоптимальный вариант.
что требуется? постоянно наблюдать глазами за служебный информацией в файлах? ;)
правка может быть из скрипта (изменение переменной), тем более так корректнее.

Цитировать
1. файл инклудится в разных местах и поэтому приятно не задумываться о unserialize() . Алгоритм сводится к сохранили, загрузили.

один (!) раз загружаем переменную и все!!! один раз unserialize().
и еще, какая разница м/д вариантами в таком случае, кстати?

да, а как будет загрузка происходить?
если eval - это еще и небезопасно.
Название: var_dump и т.д
Отправлено: Vint от 09 Марта 2002, 12:46:23
Цитировать
один (!) раз загружаем переменную и все!!! один раз unserialize().

ну вот, сейчас ты меня убедишь, что я ее (переменную) загружаю только один раз. нет! не один! много и в разных местах, я уже об этом писал. эта инфа сохраняется довольно часно, в среднем около 10 раз за проход скрипта.
Цитировать
тем более так корректнее

чем это корректнее?
Цитировать
какая разница м/д вариантами в таком случае, кстати?
во первый случай не такой, а даже если и такой, то просто приятнее.
Цитировать
да, а как будет загрузка происходить?

require и все, а с serialize в файле хранится $a="a:23...", потоп нужно сделать $a=unserialize($a) и так все переменные... это уже можно отдельную функцию на инклуд переменных писать. Не, мне мой вариант куда больше нравится... особенно после споров с тобой.
Цитировать
если eval - это еще и небезопасно.

а я не боюсь, что кто-то увидит сохраненные куки или ссылки :), вот такой вот я смелый :)
Название: var_dump и т.д
Отправлено: Dm от 09 Марта 2002, 14:28:05
мое дело предложить ;)
Название: var_dump и т.д
Отправлено: Vint от 12 Марта 2002, 09:20:07
люди, ну посоветуйте еще что-нить. плз!
Название: var_dump и т.д
Отправлено: Dm от 12 Марта 2002, 22:53:24
Цитировать
а я не боюсь, что кто-то увидит сохраненные куки или ссылки , вот такой вот я смелый

да? а shellexec на твоем сервере тебя не пугает?

Цитировать
люди, ну посоветуйте еще что-нить. плз!

а что еще тебя интересует?

Цитировать
во первый случай не такой, а даже если и такой, то просто приятнее.

чем, интересно?

Цитировать
среднем около 10 раз за проход скрипта.

а об оптимизации не думал?
Название: var_dump и т.д
Отправлено: от 14 Марта 2002, 09:29:09
Цитировать
да? а shellexec на твоем сервере тебя не пугает?

неа, я не знаю, что это такое. А что, это страшно? Последствия? Насколько это сложно?
Цитировать
чем, интересно?

тем, что данные читабельные :)
Цитировать
а об оптимизации не думал?

может посоветуешь что? значит скрипт получает содержимое страничек, след-но если не работает socket_set_timeout() при получении любой странички может получиться таймаут, значит желательно сохранить результаты. ЛИбо потом все повторять сначала. Вот он и сохранят перед получением странички данные, необходимые для восстановления данные. Скрипт рассчитан на небольшую нагрузку, врядли его будут юзать одновременно 2 человека :).
Название: var_dump и т.д
Отправлено: Metaller от 14 Марта 2002, 12:04:57
Я подобное (правда в более сложном варианте) делал таким образом:

У меня массив был многоуровневым, с любым количеством вложений. Писал функцию, сохраняющую текущую ветку в inc-файл, потом, если текущее поле было Array, рекурсивно вызывал саму себя. Получался аккуратненький файлик с PHP-объявлением массива. Потом я его инклюдил, где надо - и все замечательно работало...
вот.


P.S. исходник не кидаю, он большой и запутанный, а выдирать из него лишнее неохота.
Название: var_dump и т.д
Отправлено: AlieN от 14 Марта 2002, 13:14:38
Metaller
Цитировать
У меня массив был многоуровневым, с любым количеством вложений.

А дай исходник :)
Название: var_dump и т.д
Отправлено: Metaller от 14 Марта 2002, 13:22:49
AlieN
Секрет фирмы.... гы.. :-))))
Название: var_dump и т.д
Отправлено: Dm от 14 Марта 2002, 18:29:58
Цитировать
неа, я не знаю, что это такое. А что, это страшно? Последствия? Насколько это сложно?

т.е. дается потенциальная возможность запустить любую команду на твоем севере. а она может нести вредоносный характер.

не пойму... чем вариант serialize/unserialize ломает?
кроме красивого отображения и все такое...
по крупному? а?