<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Parser 3 forum</title>
<link>http://www.parser.ru/forum/</link>
<description>Parser 3. Обсуждение.</description>
<generator>Parser 3.5.0 (compiled on x86_64-unknown-linux-gnu) (http://www.parser.ru/)</generator>
<webMaster>mailbox@parser.ru</webMaster>
<lastBuildDate>Sat, 12 Sep 2026 19:06:58 GMT</lastBuildDate>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<item>
<title>https://www.parser.ru/docs/lang/defineclass.htm</title>
<description><![CDATA[<blockquote>Примечание: метод auto по умолчанию не наследуется.

Но если метод объявлен с двумя параметрами, он наследуется и выполнится при загрузке как базового, так и производных классов. [3.5.0] </blockquote>]]></description>
<author>G_Z</author>
<pubDate>Sat, 12 Sep 2026 19:06:58 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87211</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87211</guid>
</item>
<item>
<title>Пример</title>
<description><![CDATA[<b>parent/parent.p</b>:
<pre>@CLASS
Parent

@auto[sCurrentPath]
	$self.sPath[$sCurrentPath]

@method[]
	$hMethodInfo[^reflection:method_info[$self.CLASS_NAME;method]]

	$result[$hMethodInfo.file]</pre>

<b>child/child.p</b>:
<pre>@CLASS
Child

@USE
../parent/parent.p

@OPTIONS
locals

@BASE
Parent

@auto[sCurrentPath]
	$self.sPath[$sCurrentPath]</pre>

<b>index.html</b>:
<pre>@main[]
	^use[child/child.p]

	^Child:method[] - $Child:sPath</pre>

Результат:
<blockquote>.../child/../parent/parent.p - .../child/child.p</blockquote>

Нужно, чтобы даже при статическом вызове класс знал, где он находится, но при этом чтобы не приходилось определять в каждом классе метод <b>@auto[sCurrentPath]</b>.
Если указать этот метод только в родительском классе, то <b>$Child:sPath</b> выдаст путь родительского.]]></description>
<author>virusav</author>
<pubDate>Sat, 12 Sep 2026 07:39:17 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87210</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87210</guid>
</item>
<item>
<title>Ещё раз про таймаут</title>
<description><![CDATA[<blockquote>Надо понимать, что если сообщений нет, amqp ждет их до timeout (по умолчанию 30 минут). Будет исключение (в отличии от варианта с callback, который завершается без ошибки).</blockquote>

Если есть callback, то по умолчанию таймаута не должно быть. Его наверное можно делать опционально. Если я хочу чтобы у меня скрипт не висел в памяти бесконечно если нет задач, тогда я должен явно прописать таймаут, после котого если нет задач мы выйдем из consume. Если я явно таймаут не задал, то должно висеть бесконечно.
При этом в методе указанном в callback я должен уметь написать свой код по своей логике, который может на очередном вызове этого метода прервать consume и завершить работу скрипта. Который потом например запустится снова по крону ещё раз.]]></description>
<author>sergei v.2</author>
<pubDate>Wed, 09 Sep 2026 09:42:46 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87209</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87209</guid>
</item>
<item>
<title>Пример более сложного приложения с очередями и биржами ...</title>
<description><![CDATA[Я сформулирую задачу пока без кода ...
Например мы хотим сделать условный &quot;телеграмм 2.0&quot;
Есть пользователи в приложении чата (веб-версия или андроид приложение). Этих пользователей допустим 1 млн. И они все переписываются в групповых чатах.
Каждый из них подключаеся свои клиентом к websocket-серверу. Если бы wss был один, то всё было бы просто, но один сервер не может держать бесконечное количество одновременных подключений. Поэтому у нас много wss - каждый допустим обслуживает 10000 пользоватлей. На 1 млн пользоватлей у нас их 100 штук. И каждый wss слушает свою очередь в ребите.
Допустим в одном чате сидит 4 пользователя (и каждый из них сидит ещё одновременно в 150 чатах - ждет оттуда входящие сообщения в реалтайме, поэтому нельзя собрать участников одного чата в одном сокете или очереди -- у каждого было бы по 150 сокетов вместо одного). Поэтому первые два подключились к wss1, третий  к wss15, а четвертый к wss99 -- подключение произвольное от загрузки серверов например на момоент подключения (спрашивает куда мне подключаться, ему говорят адрес - подключился, работай).
Один из них пишет сообщение в этот чат и постит его на сервер (через апи или через тот же wss не важно). Сервер пишет его в базу и должен разослать остальным трем. Для этого он может распихать его в нужные очереди (но там есть нюанс - надо постоянно отслеживать кто из участников чата на каком wss==очередь) или тупо запихнуть в биржу, которая отправит это сообщение сразу во все 100 очередей (может тоже не идеальное решение, но для иллюстрации примера в самый раз). Каждый wss выгребает из своей персональной очереди это сообщение, смотрит есть ли среди тех кто к нему подключился адресаты этого сообщения, если есть шлет им его через сокет, а если нет, просто выкидывает в мусорку.
Т.е. когда нам надо чтобы одно сообщение взяли несколько обработчиков, мы делаем биржу, биндим к ней очереди, и заряжаем задачу не в конкретные очереди, а в биржу. Биржа рассылает задачу по всем своим очередям (дублирует). А дальше по классике.
Есть биржа по умолчанию и если просто создать очередь, то она вяжется к этой бирже, но обычно задачи ставятся прямо в конкретную очередь, а не в эту их общую биржу.

И ещё ... 
Писать на парсере сейчас wss не возможно - он сейчас не умеет поднимать и держать сокеты. Конечно наверное можно заморочиться и сделать сокеты в нем, как сделали http-сервер. Запускается, висит в бесконечном цикле или в consume и слушает порт. На порту создается постоянный сокет, туда прилетают запросы, он их обрабатывает. Или через эти сокеты он пуляет какие-то ответы/команды клиентам.
Сейчас это мы пишем на го или ноде. Наверное можно и парсер допрокачать.]]></description>
<author>sergei v.2</author>
<pubDate>Wed, 09 Sep 2026 09:27:13 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87208</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87208</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[<blockquote>Надо понимать, что если сообщений нет, amqp ждет их до timeout (по умолчанию 30 минут). Будет исключение (в отличии от варианта с callback, который завершается без ошибки).</blockquote>

Идея была в том, чтобы получать N сообщений через прослушку и заканчивать ее, а не висеть до упора, т.к. через функцию получения одного сообщения было бы дольше за счет коннекта на каждое сообщение.

Еще было бы удобно передавать N=0 или -1, чтобы прослушка с <b>callback</b> заканчивалась, как только заканчиваются сообщения, чтобы вручную не отслеживать конец очереди.

Итого по прослушке:
1. Передали N=10 <b>без callback</b> - получили 10 сообщений (или меньше, если в очереди столько нет) и вышли.
2. Передали N=0 или -1 <b>с callback</b> - когда заканчиваются сообщения, выходим.]]></description>
<author>virusav</author>
<pubDate>Wed, 09 Sep 2026 06:18:02 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87207</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87207</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[<blockquote>как-то странно</blockquote>

Странно или не работает? Из объяснения не очень понятна проблема. Еще можно сделать двухстрочный враппер и вызывать &quot;по вкусу&quot;.

<pre>@code_filename[]
$mi[^reflection:method_info[$caller.method]]
$result[$mi.file]
</pre>]]></description>
<author>moko</author>
<pubDate>Wed, 09 Sep 2026 00:13:52 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87206</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87206</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[nowait выкинут как несовместимый с синхронной семантикой обёртки:

- ошибки (несовпадение параметров с уже существующим exchange/queue, нет прав, etc) прилетают не в точке вызова, а позже - асинхронным исключением канала;
- при queue.declare с пустым именем и nowait вы не получаете сгенерированное сервером имя очереди;
- RabbitMQ и сам считает nowait полудеприкейтнутым.

internal и exclusive - не новая функциональность, а обычные флаги exchange.declare и queue.declare, просто теперь видны в одном методе.]]></description>
<author>moko</author>
<pubDate>Wed, 09 Sep 2026 00:04:10 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87205</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87205</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[<blockquote>Сделано, если не задан $.callback[] возвращается массив сообщений. Число сообщений задается через $.count(N), одно по умолчанию.</blockquote>

это хорошо!

<blockquote>Надо понимать, что если сообщений нет, amqp ждет их до timeout (по умолчанию 30 минут). Будет исключение (в отличии от варианта с callback, который завершается без ошибки).</blockquote>

Тут не очень понял. Если мы делаем ^oAMQP.consume[... $.callback[$processingMessage]] и если в очереди нет задач, оно отвалится через 30 минут? И надо будет снова подключаться для прослушивания? Я думал оно должно слушать пока электричество не кончится в розетке, потенциально до бесконечности.
А если делаем без callback и задач нет, то надо получить ответ !def и отключиться.

<blockquote>Пока не очень понятно, как все это будет использоваться. Хорошо бы было какое-нибудь реальное приложение, с которым можно &quot;поиграться&quot;, а не просто мои тесты. Сейчас непонятно, как вести себя в пограничных ситуациях. Например в amqp после любой ошибки канал считается мёртвым. То есть и дальнейшие попытки работать с ним будут приводить к исключениям. Надо ли его переоткрывать? Но автоматически это делать странно, там же так понимаю надо переподписывать consumers...</blockquote>

Задачу тут https://www.parser.ru/forum/?id=87203 описал. Приложение можем написать и прислать поиграться.
Оно должно думаю пробовать автоматически переподключаться при разрыве канала связи. Если ловить исключения в парсерном скрипте, то их придется в 100% случаем писать каждый раз. Поэтому реконнекты лучше спрятать сразу под капот. Хотя если указать неправильный коннект, то оно будет долбиться в никуда (неправильный хост, закрытый порт) и будет непонятно, что есть проблема. Первый коннект и реконнект по сути одно и тоже - их мы наверное никак не отличим. Это ведь обычно запускается/перезапускается кроном и мы видим только в логах проблему, если она есть.]]></description>
<author>sergei v.2</author>
<pubDate>Tue, 08 Sep 2026 21:24:57 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87204</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87204</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[<blockquote>declare предназначен в первую очередь для создания очереди, в таком случае число сообщений там очевидно 0.</blockquote>
+

<blockquote> Отдельный метод куда прозрачнее.</blockquote>
+

По обоим пунктам согласен.

У нас есть приложение &quot;мониторинг доступности сайтов&quot;. Если его сильно упростить, то грубо получится при скрипта:
1. диспетчер - заряжает с определенной частотой ссылки из бд в ребит (опять же если упростить в одну очередь).
2. монитор - скрипты на разных гео-распределенных серверах слушают эту очередь и выгребают оттуда задачи, дергают сайты, получают статус ответа, меряют скорость ответа/загрузки и заряжают задачи в другую очередь для алертера.
3. алертер (несколько скриптов на основном сервере) - слушают свою очередь и выгребают оттуда задачи, пишут результаты в базу и в случае изменения статуса работало-&gt;сломалость, не работало-&gt;заработало шлет алерт в телегу или в макс.

Можем набросать такой упрощенный вариант приложения и скинуть архивом.]]></description>
<author>sergei v.2</author>
<pubDate>Tue, 08 Sep 2026 20:59:48 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87203</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87203</guid>
</item>
<item>
<title>А по этой секретной ссылке всегда свежий билд под CentOS?</title>
<description><![CDATA[Я что-то после новогодних выходных пропустил эти вопросы, да и в январе мне было не до того.
Мы взяли эту сборку под centos ещё в ноябре, упаковали в докер и до сих пор её активно используем со старыми методами. А Андрей после нового года поднял тему, вы переделали и в начале января опубликовали, а я прощелкал этот момент. Поэтому и не ответил :((
А сейчас вы запилили постинг нескольких файлов, и я решил это собрать в докер - обновить. И тут вылезло, что у нас работа с ребитом делается через неактуальные методы с предпоследней бетта-подверсией парсера.

Ответьте, пожалуйста про nowait - Андрей там спрашивал в ветке про ребит.
И мы завтра поправим приложение и протестим с обновленным парсером.
Там в принципе подправить несколько строчек -- заменить тут:
<pre>
########################################
@main[][locals]
	$MAIN:iSCRIPT_NUMBER($request:argv.1)

	$MAIN:oAMQP[^createAmqp[]]
	^createQueue[$oAMQP;work]

	^oAMQP.consume[
		$.queue[$hQUEUES.work]
		$.no_ack(false)
		$.nowait(false)
		$.callback[$processingMessage]
	]
	$result[]

########################################
@createQueue[oAmqp;sQueueType][locals]
	^oAmqp.declare_queue[
		$.queue[$hQUEUES.[$sQueueType]]
		$.passive(false)
		$.durable(true)
		$.auto_delete(false)
		$.nowait(false)
	]
$result[]
</pre>

По опыту эксплуатации пока вроде под те задачи, что были, вполне хватает.]]></description>
<author>sergei v.2</author>
<pubDate>Tue, 08 Sep 2026 20:24:31 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87202</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87202</guid>
</item>
<item>
<title>А вот вам сборка в виде DockerImages c parser3-3.5.2b-amqp-httpd и parser3-3.5.2b-amqp-cron-sshd</title>
<description><![CDATA[Пример запуска парсера в докере в качестве веб-сервера на порту 9000

cat run-parser3-httpd.sh
<pre>#!/bin/bash


run_container(){
local USER_NAME=$1

local GR_ID=$(id -g $USER_NAME)
local U_ID=$(id -u $USER_NAME)

if [ -z ${4+x} ]; then port=&quot; &quot;; else port=&quot; -p ${4}:9000 &quot;; fi

docker stop api-parser3-${2}
docker rm api-parser3-${2}
docker run --net my-net --name api-parser3-${2} ${port} \
    -e TZ=Europe/Moscow \
    -e USERID=$U_ID \
    -e GROUPID=$GR_ID \
    --expose 9000 \
    --restart always \
    -v ${3}:/p3-app \
    -v ${3}/../_logs/${2}/parser3.log:/usr/local/parser3/parser3.log \
    -v /home/dialog/etc/nginx/vhosts/dialog/:/etc/nginx-dialog/ \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -d sprikhodko/parser3-3.5.2b-amqp-httpd:fedora44
}



docker pull sprikhodko/parser3-3.5.2b-amqp-httpd:fedora44

run_container &quot;user_vasya&quot; &quot;project_name1&quot; &quot;/home/user_vasya/sites/project_name1-api&quot;
run_container &quot;user_vasya&quot; &quot;project_name2&quot; &quot;/home/user_vasya/sites/project_name2-api&quot;
run_container &quot;user_petya&quot; &quot;project_name1&quot; &quot;/home/user_petya/sites/project_name1-api&quot;</pre>

Пример запуска парсера в докере для выполнения консольных команд с запуском через cron + ssh доступ в контейнер для ci/cd проекта через ssh-порт:

cat run-parser3-cron-ssh.sh

<pre>#!/bin/bash


run_container(){
local USER_NAME=$1

local GR_ID=$(id -g $USER_NAME)
local U_ID=$(id -u $USER_NAME)

echo $USER_NAME
echo $U_ID
echo $GR_ID

if [ -z ${4+x} ]; then port=&quot; &quot;; else port=&quot; -p ${4}:22 &quot;; fi

docker stop cron-parser3-${2}
docker rm cron-parser3-${2}
docker run --net my-net --name cron-parser3-${2} ${port} \
    -e TZ=Europe/Moscow \
    -e USERID=$U_ID \
    -e GROUPID=$GR_ID \
    --restart always \
    -v ~/docker/.ssh/${1}/:/home/web/.ssh/ \
    -v /home/${1}/sites/:/home/web/sites/ \
    -v ${3}:/p3-app \
    -v ${3}/../_logs/${2}/parser3-cron.log:/usr/local/parser3/parser3.log \
    -v ${3}/../_logs/${2}/parser3.log:/usr/local/parser3/parser3-api.log \
    -d sprikhodko/parser3-3.5.2b-amqp-cron-sshd:fedora44
}

docker pull sprikhodko/parser3-3.5.2b-amqp-cron-sshd:fedora44

run_container &quot;user_vasya&quot; &quot;project_name1&quot; &quot;/home/user_vasya/sites/project_name1-api&quot; &quot;60022&quot;
run_container &quot;user_petya&quot; &quot;project_name1&quot; &quot;/home/user_petya/sites/project_name1-api&quot; &quot;60122&quot;</pre>

Если хочется только cron без ssh, то можно использовать образ sprikhodko/parser3-3.5.2b-amqp-cron:fedora44

Внутри контейнеров корень сайта /p3-app/app/www/
Тут пишем команды для крона: /p3-app/app/cron/crontab.txt (последняя строчка должна заканчиваться энтером)

:latest использовать на надо. Там лежит мягко говоря не последняя версия. Надо на старых проектах код привести к самой свежей версии парсера и обновить latest.

Почему fedora, а не alpine? Потому что надо в образ было добавлять некоторые утилиты, а в alpine бывают проблемы с этим. Но можно наверное и заморочиться.]]></description>
<author>sergei v.2</author>
<pubDate>Tue, 08 Sep 2026 17:14:46 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87201</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87201</guid>
</item>
<item>
<title>2 человека это уже 20%, что вполне не плохо. И проектов больше одного :) (-)</title>
<author>sergei v.2</author>
<pubDate>Tue, 08 Sep 2026 17:02:49 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87200</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87200</guid>
</item>
<item>
<title>через ident например (из пакета rcs)</title>
<description><![CDATA[Чтобы было проще разбираться с багами, в бинарник парсера давно зашиты точные версии всех файлов, из которых он собран:

&gt;ident parser.parser3.cgi 
parser.parser3.cgi:
     $Id: parser3.C,v 1.367 2024/12/19 02:47:46 moko Exp $
     $Id: pa_threads.C,v 1.10 2024/11/04 03:53:25 moko Exp $
     $Id: pa_threads.h,v 1.39 2024/11/04 03:53:25 moko Exp $
     $Id: pa_common.C,v 1.336 2024/12/23 16:59:17 moko Exp $
     $Id: pa_common.h,v 1.196 2024/12/23 18:30:55 moko Exp $
     $Id: pa_hash.h,v 1.104 2024/11/04 03:53:25 moko Exp $
     $Id: pa_array.h,v 1.102 2024/12/23 16:59:17 moko Exp $
     $Id: pa_stack.h,v 1.34 2024/11/04 03:53:25 moko Exp $
     $Id: execute.C,v 1.426 2024/12/23 16:59:17 moko Exp $
     $Id: pa_opcode.h,v 1.59 2024/11/04 03:53:25 moko Exp $
     $Id: pa_operation.h,v 1.13 2024/11/04 03:53:25 moko Exp $
     $Id: pa_vcode_frame.h,v 1.44 2024/11/04 03:53:25 moko Exp $
     $Id: pa_wwrapper.h,v 1.55 2024/11/04 03:53:26 moko Exp $
     $Id: pa_exception.C,v 1.63 2024/11/04 03:53:25 moko Exp $
     $Id: pa_exception.h,v 1.75 2024/12/11 03:22:23 moko Exp $
     $Id: pa_globals.C,v 1.217 2024/12/23 16:59:17 moko Exp $
     $Id: pa_globals.h,v 1.120 2024/11/04 03:53:25 moko Exp $
...]]></description>
<author>moko</author>
<pubDate>Tue, 08 Sep 2026 16:17:25 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87199</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87199</guid>
</item>
<item>
<title>А куда делся ключ nowait для declare?</title>
<description><![CDATA[Исчез <b>nowait</b> и появились <b>internal</b> и <b>exclusive</b>.

За что они отвечают?]]></description>
<author>virusav</author>
<pubDate>Tue, 08 Sep 2026 16:13:36 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87198</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87198</guid>
</item>
<item>
<title>Хорошо скачали и скомпилили неплохо :)</title>
<description><![CDATA[докер образ закешировался с тем же именем и тегом :(
надо было делать предварительно на всякий случай
docker pull ...
перед 
docker run ...

у пасрера сейчас тоже одна версия 3.5.2b но по факту добавляются новые фичи и по сути версии разные и как их быстро отличать не понятно]]></description>
<author>sergei v.2</author>
<pubDate>Tue, 08 Sep 2026 15:59:30 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87197</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87197</guid>
</item>
<item>
<title>256 файлов хватит всем (Билл Гейтс) (-)</title>
<author>Sumo</author>
<pubDate>Tue, 08 Sep 2026 14:39:16 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87196</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87196</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[https://www.parser.ru/news/

<blockquote>При задании $response:status меньше 100 он будет возвращен в виде кода выхода процесса парсера.</blockquote>

Есть подозрение, что в коде используется указанная выше возможность, хотя создана она скорее для консольных скриптов, а не CGI. В CGI варианте статус (как и положено) попадает в заголовок ответа и предсказуемо не нравится apache. Так что ищите, где в коде $response:status[99].

Сложно сказать, что тут правильно делать. В отличие от консольных скриптов, apache код выхода особо не интересен и смысла задавать его нет.]]></description>
<author>moko</author>
<pubDate>Tue, 08 Sep 2026 14:15:30 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87195</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87195</guid>
</item>
<item>
<title>Поясню ситуацию</title>
<description><![CDATA[Есть папки:
<blockquote>folder_1
folder_2
folder_3</blockquote>

При вызове метода из класса в папке <b>folder_2</b> нужно вызвать метод из класса в папке <b>folder_1</b> по относительному пути, для чего и нужен путь к классу, в котором происходит вызов.

Делать <b>^reflection:method_info[$self.CLASS_NAME;название метода]</b> из этого же метода как-то странно.
Если другой класс отнаследовался от текущего, то путь должен браться относительно него:
<blockquote>../folder_1/...</blockquote>]]></description>
<author>virusav</author>
<pubDate>Tue, 08 Sep 2026 14:04:53 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87194</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87194</guid>
</item>
<item>
<title>Возможно плохо скачали?</title>
<description><![CDATA[Нужный коммит на github есть:
https://github.com/artlebedev/parser3/commit/a9029835edf3ca68a33ea4ea4ecab1e8cc472dd1]]></description>
<author>moko</author>
<pubDate>Tue, 08 Sep 2026 13:54:20 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87193</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87193</guid>
</item>
<item>
<title>Код уже связан с файлом :)</title>
<description><![CDATA[Чтобы показывать исключение. Хранится понятно не путь для каждой инструкции, а просто номер файла в таблице загруженных файлов - один байт.]]></description>
<author>moko</author>
<pubDate>Tue, 08 Sep 2026 13:50:57 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87192</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87192</guid>
</item>
<item>
<title>Откуда брать версию?</title>
<description><![CDATA[Скачали версию с гитхаба и собрали с нужными ключами под линукс.
Запустили пример https://raw.githubusercontent.com/artlebedev/parser3/ab29cc6de49ed41e13269d19efa08033f37d6ee1/tests/451-curl.html с указанием своего урла, но скрипт сломался с ошибкой:
<pre>f4_files
is array, form option value can be string, table or file only</pre>

С AMQP работает старый формат объявления очереди <b>declare_queue</b> и не работает новый <b>declare</b>.

Откуда надо брать исходники с последними правками по парсеру и AMQP?]]></description>
<author>virusav</author>
<pubDate>Tue, 08 Sep 2026 13:49:02 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87191</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87191</guid>
</item>
<item>
<title>Так уже и собирается...</title>
<description><![CDATA[В свое время спрашивал, под какую вам нужно OS и добавил соответствующую сборку:
https://www.parser.ru/forum/?id=87009

Ссылки в ночных сборках на нее нет по одной простой причине - API amqp еще не стабилизировано. Чтобы доработать API дважды просил обратной связи и так и не получил ее:

https://www.parser.ru/forum/?id=87055
https://www.parser.ru/forum/?id=87052]]></description>
<author>moko</author>
<pubDate>Tue, 08 Sep 2026 13:43:45 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87190</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87190</guid>
</item>
<item>
<title>^reflection:method_info[]</title>
<description><![CDATA[^reflection:method_info[имя класса;имя метода]
^reflection:method_info[метод]   [3.4.5]

...
    $.file[полный путь к файлу, в котором определен метод]   [3.4.1] 
...

В обсуждаемом случае в самом методе можно сказать ^reflection:method_info[$method]]]></description>
<author>moko</author>
<pubDate>Tue, 08 Sep 2026 13:29:32 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87189</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87189</guid>
</item>
<item>
<title>[client 10.2.1.5:41855] Invalid status line from script &apos;parser3.exe&apos;: 99</title>
<description><![CDATA[Такие вот ошибки в логе апача появляются, в какую сторону копнуть? Что то я в поиске вроде ничего на тему не нашел
Иногда код ошибки другой - 1 вместо 99]]></description>
<author>Maxx</author>
<pubDate>Tue, 08 Sep 2026 13:21:31 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87188</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87188</guid>
</item>
<item>
<title>Конкретно сейчас этой фичей пользуются два человека на одном проекте :)</title>
<description><![CDATA[И для них (вас) фичу и сделали. Поэтому все очень френдли. Амесли вы еще и сборку наладите, то наверняка ссылку поставить с парсер.ру будет возможно. ;)]]></description>
<author>Sumo</author>
<pubDate>Tue, 08 Sep 2026 09:10:43 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87187</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87187</guid>
</item>
<item>
<title>Путь передаётся классу в метод auto</title>
<description><![CDATA[Куда и какмего сохранить — дело класса]]></description>
<author>Sumo</author>
<pubDate>Tue, 08 Sep 2026 09:08:18 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87186</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87186</guid>
</item>
<item>
<title>Так может тогда выкладывать бинарники двух версий сразу? (-)</title>
<author>sergei v.2</author>
<pubDate>Tue, 08 Sep 2026 08:54:58 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87185</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87185</guid>
</item>
<item>
<title>В том числе поэтому парсером пользуется 10 человек в мире и все они активно общатся между собой на этом форуме :)</title>
<description><![CDATA[Мне ничего не мешает. А многим ОЧЕНЬ мешает. Вместо того, чтобы зайти на официальный сайт и скачать под свою ос в один клик нужный дистрибутив и за 5 минут его запустить мы советуем пойти скачать исходники и полдня или неделю развлекаться с компиляцией из исходников. Очень френдли :((

Версия под freebsd есть, правда я не знаю сколько людей этой ос ещё пользуются (наверное столько же сколько турбо паскалем и ассемблером), но дистрибутив регулярно компилится под freebsd (и это хорошо!).

А серверами очередей пользуются сейчас на всех проектах практически (ну может не на всех, но очень часто). Сделали классную фичу в языке наконец. И сделали так, чтобы ею было простым гражданам максимально сложно воспользоваться. Чтобы они сказали &quot;да лучше я пойду напишу на пхп это&quot;.

Я могу понять что это может кому-то не надо. До этого всегда был парсер с поддержкой xml и без. Я всегда использовал с поддержкой. Не знаю зачем и кому нужен был без поддержки. Нужен ли этот зоопарк недоверсий?? Или нужен удобный швейцарский нож, в котором сразу всё есть.
Написать &quot;apt install -y librabbitmq*&quot; всяко проще и быстрее чем собрать парсер из исходников.]]></description>
<author>sergei v.2</author>
<pubDate>Tue, 08 Sep 2026 08:52:26 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87184</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87184</guid>
</item>
<item>
<title>Путь нужен для класса</title>
<description><![CDATA[Мы подключили класс и находимся в нем.
Есть <b>$self</b>, есть различные методы в <b>reflection</b>.

Для класса также не хранится путь и никак его получить нельзя?)]]></description>
<author>virusav</author>
<pubDate>Tue, 08 Sep 2026 07:24:19 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87183</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87183</guid>
</item>
<item>
<title>В общем случае никак.</title>
<description><![CDATA[Метод может быть где угодно, в том числе и не в файле. Хранить для каждго метода еще и дисковый путь — это напрасная трата памяти. :)]]></description>
<author>Sumo</author>
<pubDate>Tue, 08 Sep 2026 07:14:19 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87182</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87182</guid>
</item>
<item>
<title>Параметр в конфиге требует динамическую линковку…</title>
<description><![CDATA[… а Костя написал, что librabbirmq связывается статически.

У меня встречный вопрос — что вам мешает самостоятельно настроить ночные сборки на своей инфраструктуре с требуемыми параметрами конфигурации? Это же тривиальная задачка на полдня. ;)]]></description>
<author>Sumo</author>
<pubDate>Tue, 08 Sep 2026 07:08:15 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87181</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87181</guid>
</item>
<item>
<title>А все-таки как получить к текущему файлу из него?)</title>
<description><![CDATA[Файл подключен с методом <b>@method</b>, в котором нужно узнать путь к этому файлу.]]></description>
<author>virusav</author>
<pubDate>Tue, 08 Sep 2026 06:25:49 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87180</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87180</guid>
</item>
<item>
<title>А если по умолчанию отключать amqp?</title>
<description><![CDATA[Если в конфиге нет специального параметра, то amqp не будет работать.
Драйвера и прочие настройки закомментированы и ничего не ломают.

В исходниках есть параметр <b>WITH_AMQP</b>: сделать что-то подобное в конфиге.]]></description>
<author>virusav</author>
<pubDate>Tue, 08 Sep 2026 06:11:32 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87179</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87179</guid>
</item>
<item>
<title>Увы, но не получится</title>
<description><![CDATA[С amqp идет статическая линковка, то есть парсер в принципе не запустится, если на сервере нет librabbitmq.so.4. Что понятно большинству не очень подходит.]]></description>
<author>moko</author>
<pubDate>Mon, 07 Sep 2026 23:54:45 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87178</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87178</guid>
</item>
<item>
<title>А можно сборку по умолчанию (в том числе и ночную) делать within amqp support?</title>
<description><![CDATA[amqp полезная штука и постоянно помнить на каком проекте у тебя с amqp, а где без, и жонглировать версиями при обновлениями -- такое себе.
Ну чуть больше этот бинарник и что?]]></description>
<author>sergei v.2</author>
<pubDate>Mon, 07 Sep 2026 23:10:10 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87177</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87177</guid>
</item>
<item>
<title>Сделано для curl:load и file::load</title>
<description><![CDATA[Доступно в ночных сборках.]]></description>
<author>moko</author>
<pubDate>Sun, 06 Sep 2026 23:15:28 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87176</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87176</guid>
</item>
<item>
<title>Спасибо. (-)</title>
<author>virusav</author>
<pubDate>Thu, 27 Aug 2026 15:26:35 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87175</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87175</guid>
</item>
<item>
<title>сейчас такой возможности нет, но доработать несложно, сделаю (-)</title>
<author>moko</author>
<pubDate>Thu, 27 Aug 2026 13:54:01 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87174</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87174</guid>
</item>
<item>
<title>Отправка массива файлов через curl</title>
<description><![CDATA[Добрый день.
В доке говорится, что в <b>httppost</b> можно передать строку, файл или таблицу из одного столбца.

Каким образом можно отправить массив файлов через <b>curl</b> в одном поле, чтобы файлы приходили в коллекции <b>form:files.поле</b>?]]></description>
<author>virusav</author>
<pubDate>Thu, 27 Aug 2026 10:30:23 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87173</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87173</guid>
</item>
<item>
<title>обновил (-)</title>
<author>Spearance</author>
<pubDate>Thu, 27 Aug 2026 07:11:18 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87172</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87172</guid>
</item>
<item>
<title>— Таблицы ...</title>
<description><![CDATA[неплохо внутри table дополнить замену  табов на ^#09
(увеличивает об&apos;ем, зато &quot;таб символ&quot; сносит)]]></description>
<author>AK666</author>
<pubDate>Sat, 22 Aug 2026 21:10:29 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87171</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87171</guid>
</item>
<item>
<title>Библиотека - копия на GitHub</title>
<description><![CDATA[https://github.com/artlebedev/parser3-lib - <a href="/lib/">библиотека</a> в развернутом виде скопирована на GitHub, описания переведены в Markdown. Приветствуются использование, замечения и лайки. :)

И в ней необычное пополнение - <a href="https://github.com/artlebedev/parser3-lib/tree/main/s3">S3 сервер</a> на парсере. :)]]></description>
<author>moko</author>
<pubDate>Thu, 20 Aug 2026 03:28:05 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87170</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87170</guid>
</item>
<item>
<title>Минимайзер Parser кода</title>
<description><![CDATA[Понимаю всю абсурдность этого в нынешних условиях:

— сжатие никакое, а сервера мощные
— копеечная выгода
— можно развернуть с помощью ИИ или бьютифаера

Но, захотелось мне чтобы файлы были поменьше и чтобы обывателю было просто скучно их открывать.

К сути, написан на <i>node.js</i>, использую его хуком ко всем *.p файлам при сохранении в проект. Можно вызывать просто:

<pre>node ParserMinimizer.js /путь/к_исходному_файлу.p /путь/куда_положить_сжатый_файл.p</pre>

Что умеет:
— Удаляет комментарии, включая многострочные ^rem{ ... }
— Минифицирует код Parser 3 (удаляет лишние переводы строк)
— Минифицирует SQL запросы (удаляет лишние переводы строк)
— Таблицы ^table::create{} дополняет ^#0A чтобы были в одну строку
— Немного прибирается в пробелах между тегами, не трогает &lt;pre&gt; и &lt;textarea&gt;

Не умеет нормально обрабатывать:
<pre>$var[Тут

текст

какой-то]</pre>

Я сам так никогда не пишу, если будет запрос, подумаю как сделать.

В самом коде минимайзера всё подписано, можно править под себя, особенно SQL конструкции. Я не использую базовые типа <i>^void:sql{}</i> (раскомментируйте если используете).

Ссылка на <a href="https://github.com/Spearance/Parser-Minimizer">GitHub</a>, как всегда замечания сюда под постом или в ишью.


P.S. Мишин код авторизации из примеров сжал с 1500 до чуть больше 100 строк.]]></description>
<author>Spearance</author>
<pubDate>Fri, 31 Jul 2026 06:30:39 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87168</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87168</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[А конфигурационный auto.p (тот что рядом с  cgi лежит) вы тоже перенесли в новое место? Там ведь тоже могло быть что то прописано.

Тут чудес особо быть не может, если копия 1 в 1 и версия парсера та же, то такая ошибка как у вас по идее появиться не должна. Найдите в логе где формируется этот запрос (он очевидно невалидный и никакая версия mysql его не пропустит), там скорее всего какая то переменная типа and id= $ID, найдите место где она инициализируется и дальше по цепочке.]]></description>
<author>Maxx</author>
<pubDate>Sun, 19 Jul 2026 15:24:32 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87167</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87167</guid>
</item>
<item>
<title>гадаем на кофейной гуще</title>
<description><![CDATA[но, может проблема в my.cnf (my.ini) gjl mysql, с помощью него настраивается можно ли писать/читать в БД null вместо даты и прочие вольности. Здесь уже лучше анализировать вместе с ошибками кода.]]></description>
<author>Spearance</author>
<pubDate>Sun, 19 Jul 2026 15:03:55 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87166</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87166</guid>
</item>
<item>
<title>^print($i)[$s;$b] или ^print($i)[$s]($b)</title>
<description><![CDATA[В Парсере можно и нужно чередовать скобки. Типичный пример — оператор for. ;)]]></description>
<author>Sumo</author>
<pubDate>Sun, 19 Jul 2026 11:09:35 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87165</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87165</guid>
</item>
<item>
<title>Смена типа переменной (int) при передаче в метод</title>
<description><![CDATA[Добрый день.

При передаче переменной с типом <b>int</b> в метод получаю переменную <b>string</b>:
<pre>@main[]
	$i(123)
	$s[123]
	$b(true)
	^print[$i;$s;$b]

@print[i;s;b]
	i=&gt;$i.CLASS_NAME, s=&gt;$s.CLASS_NAME, b=&gt;$b.CLASS_NAME
	^try{
		^i.inc[]
	}{
		$exception.handled(true)
		$exception.comment
	}</pre>

Получаем:
<pre>i=&gt;string, s=&gt;string, b=&gt;bool
string method not found</pre>

Если все параметры метода числовые, то поможет вызов <b>^print(a;b;c)</b>.

Каким образом можно передать переменную <b>int</b> в метод с параметрами разного типа, чтобы внутри получить число?
Хеш не предлагать.)]]></description>
<author>virusav</author>
<pubDate>Sun, 19 Jul 2026 09:21:58 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87164</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87164</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[Добрый вечер, спасибо большое за помощь, удалось решить вопрос откатом на Ubuntu 20.04 и использованием библиотеки от CentOS 6.4, на современном движке и библиотеках сайт к сожалению не взлетает, жалуется на синтаксис, видимо код сайта не совсем валидный, есть предположение что на новом движке правила валидации SQL запросов стали более жесткими.]]></description>
<author>vasya99</author>
<pubDate>Fri, 17 Jul 2026 18:14:22 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87163</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87163</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[Если судить по 3.4.4, то получается, что парсер остался тот же, что был на старом хостинге? Тогда при корректном переносе файлов сайта и базы данных все должно работать, как и раньше. Чудес не бывает, надо проверять корректность переноса. Есть конечно небольшая вероятность, что дело в изменении версии сервера БД, но очень небольшая. Если с файлами/БД сами проблем не найдете, логичнее обратиться к разработчику сайта, но если он недоступен - можете послать SSH доступ и URL сайта на mailbox@parser.ru, посмотрю в воскресенье.]]></description>
<author>moko</author>
<pubDate>Fri, 17 Jul 2026 12:03:50 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87162</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87162</guid>
</item>
<item>
<title>Ответ</title>
<description><![CDATA[Здесь https://www.parser.ru/download/linux/ есть 3.4.6 смотрите внизу. В сравнении с 3.4.4 там не много изменилось — попробуйте]]></description>
<author>Spearance</author>
<pubDate>Fri, 17 Jul 2026 06:41:25 GMT</pubDate>
<link>http://www.parser.ru/forum/?id=87161</link>
<guid isPermaLink="true">http://www.parser.ru/forum/?id=87161</guid>
</item>
</channel>
</rss>