Можно ли вызвать парсеру самого себя? |
Конструкция
$f[^file::exec[/../cgi-bin/parser3.exe]] приводит к рекурсивному вызову и обработки того html из которого он вызывается. Откуда вызываемый парсер про этот файл знает. из переменной окружения? А поменять ее можно?
Передавать параметры пробовал, в $.stdin тоже, вызывать батник в котором вызывается парсер, предварительно сделав cd в документ-рут тоже пробовал, результат нулевой, рекурсия. Есть рецепт? ;)
P.S. Пока я так понимаю вариант один - делать file::load и туда передавать параметры, но это как то некошерно ;) |
Проблема известная - будет поправлена в 3.4.1. |
workaround-а нет никакого, пока не исправили? |
Обнулить переменные окружения |
В промежуточном shell (.bat) скрипте. Вот эти (из parser3.C):
// were we started as CGI? cgi= getenv("SERVER_SOFTWARE") || getenv("SERVER_NAME") || getenv("GATEWAY_INTERFACE") || getenv("REQUEST_METHOD");
И кстати расскажите задачу - сами мы не смогли придумать, зачем нужно из парсера вызывать парсер - это ресурсоемко (запуск лишнего процесса). Почему нельзя вызвать напрямую парсерный код? |
Задача такая |
Нужно обработать много XML-файлов (порядка 2000) и положить из них инфу в БД. Файлы большие, в среднем 15Mb.
Вот такой простой код (да, просто load, без обработки) достаточно быстро приводит к повешенью парсера
^tFileList.menu{
$xDoc[^xdoc::load[$tFileList.name]
^Erusage:compact[]
^Erusage:print[]
}
Без compact это происходит гораздо быстрее. Вот кстати выдержка результата Erusage:print
2010-06-17 20:10:52 memory begin/end/collected: 448/111588/56 KB calls/compacts: 1/1
2010-06-17 20:10:54 memory begin/end/collected: 448/210316/76 KB calls/compacts: 2/2
2010-06-17 20:10:55 memory begin/end/collected: 448/308152/96 KB calls/compacts: 3/3
2010-06-17 20:10:57 memory begin/end/collected: 448/405576/108 KB calls/compacts: 4/4
2010-06-17 20:10:59 memory begin/end/collected: 448/503568/116 KB calls/compacts: 5/5
2010-06-17 20:11:00 memory begin/end/collected: 448/517848/83484 KB calls/compacts: 6/6
...
2010-06-17 20:11:33 memory begin/end/collected: 448/822576/1625420 KB calls/compacts: 25/25
2010-06-17 20:11:35 memory begin/end/collected: 448/834724/1752948 KB calls/compacts: 26/26
2010-06-17 20:11:37 memory begin/end/collected: 448/971844/1752956 KB calls/compacts: 27/27
Решил вызывать парсера передавая ему по одному файлу. |
Сделать shell'скрипт, который последовательно вызывает скрипт на Парсере... |
| Парсер умеет принимать имя файла из командной строки. В конце-концов даже shell-скрипт можно сгенерировать самим Парсером. |
Ну там не все так просто, "управляющий" скрипт должен обойти директории, вложенные, распаковать по очереди архивы, из них отфильтровать xml-файлы и только потом каждый по очереди передать на обработку. Написать такой батничек(у меня винда) в принципе можно, но там такой феерический синтаксис :(
А на парсере все это написать - раз плюнуть |
Внешний скрипт на Питоне? :) |
исправлено в head |
теперь при запуске внешнего скрипта парсер устанавливает переменную окружения PARSER_VERSION.
и если при своём запуске он обнаруживает, что эта переменная окружения установлена, то он запускается не как cgi, а просто как консольное приложение. |