Кортеж {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
.