Erlang Port Длина передачи данных - PullRequest
0 голосов
/ 07 ноября 2011

Я пытаюсь оценить код php через erlang, используя порты erlang.Проблема в том, что когда оцениваемые данные больше, чем я получаю ошибка разбора от php.Но если данные меньше, я получаю правильный вывод.Я думаю, что когда длина данных больше, erlang усекает данные перед отправкой в ​​php для оценки.Есть ли ограничение на длину данных, которые могут быть отправлены или получены через порт erlang.Или эта ошибка вызвана какой-то другой причиной?

Я использую open_port (PortName, PortSettings) , чтобы открыть новый порт, а в PortSettings я устанавливаю [{packet, 4}, exit_status] в качестве параметров моего порта.

1 Ответ

0 голосов
/ 08 ноября 2011

Кортеж {packet, 4} говорит, что программа, запущенная для обработки другого конца порта, ожидает данные в форме с 4-байтовым префиксом длины.Я не вижу в документации ничего для программы php(1), которая говорит, что знает, как обращаться с такими данными.Вероятно, единственная причина, по которой он работает для коротких входных данных, заключается в том, что префикс длины выглядит, как ASCII, если вы щуритесь, если данные, которые вы отправляете, меньше 127 байт.Как только вы пройдете через это, PHP, вероятно, столкнется с ошибкой декодирования UTF-8.

Я почти уверен, что вы хотите сказать spawn здесь.Это дает вам стандартное Unix-подобное конвейерное взаимодействие: данные, отправленные по порту, отправляются на стандартный запуск запущенного процесса, и все, что он отправляет на стандартный вывод, возвращается в ваш процесс Erlang.

Единственная проблема, делающая это таким образом, -что он перезапускает php(1) для каждой транзакции.Это может показаться дорогим, но это не так уж плохо в любой системе типа Unix, из-за относительной эффективности системного вызова fork(2).Если вы работаете в Windows или протестировали это и обнаружили, что вам действительно нужно построить систему, подобную FastCGI, вам может не повезти.Кажется, нет libphp для встраивания PHP в программу, которую вы пишете для обработки пакетного ввода, и нет способа запустить php(1) таким образом, чтобы он оставался активным на другом конце порта.Возможно, вам лучше переключиться на собственную систему шаблонов Erlang.

Также обратите внимание, что атом exit_status, переданный в open_port(), ничего не делает, если вы не используете spawn.

...