2011-11-07 10 views
0

나는 erlang 포트를 사용하여 erlang을 통해 PHP 코드를 평가하려고합니다. 문제는 평가할 데이터가 커질 때 구문 분석 오류이 발생합니다. 그러나 데이터가 작 으면 올바른 결과를 얻고 있습니다. 데이터 길이가 더 클 때 데이터를 잘라내어 평가를 위해 php로 보내기 전에 생각합니다. erlang 포트에서 보내거나받을 수있는 데이터 길이에 제한이 있습니까? 또는 다른 이유로이 오류입니까?얼랭 포트 데이터 전송 길이

나는 새로운 포트를 열어 open_port (포트 이름, PortSettings)을 이용하고 있고 PortSettings에 내가 설정하고 [{패킷을, 4}, exit_status] 내 포트 옵션으로.

답변

0

터플은 포트의 다른 쪽 끝을 처리하기 위해 시작된 프로그램이 4 바이트 길이 접두사 형식으로 데이터를 예상한다고 말합니다. 이러한 데이터를 처리하는 방법을 알고 있다고 말하는 php(1) 프로그램의 경우 문서에서 아무 것도 볼 수 없습니다. 아마도 짧은 입력을 위해 작동하는 유일한 이유는 전송중인 데이터가 127 바이트 미만인 경우 길이 접두사가 ASCII처럼 보일 수도 있다는 것입니다. 빨리 끝나면 PHP는 아마도 UTF-8 디코딩 오류로 실행 중일 것입니다.

대신 여기 spawn라고 말하고 싶습니다. 유닉스와 비슷한 파이프 상호 작용 : 표준 포트로 보내진 데이터는 시작된 프로세스에서 stdin으로 보내지고 stdout으로 보내는 모든 것은 다시 Erlang 프로세스로 돌아옵니다.

이렇게하는 것이 유일한 문제는 각 트랜잭션에서 php(1)을 다시 시작한다는 것입니다. 이것은 비싸 보일지 모르지만, fork(2) 시스템 호출의 상대적 효율성으로 인해 유닉스 유형 시스템에서 그렇게 나쁘지는 않습니다. Windows를 사용 중이거나 벤치마킹 한 결과 시스템과 같은 FastCGI를 실제로 만들어야하는 경우 운이 좋지 않을 수 있습니다. 패킷 화 된 입력을 처리하기 위해 작성하는 프로그램에 PHP를 내장하는 데는 libphp이 없으며 php(1)을 포트의 다른 쪽 끝에서 활성 상태로 유지하는 방식으로 실행할 방법이 없습니다. Erlang 고유의 템플리트 시스템으로 전환하는 것이 더 나을 것입니다.

또한 open_port()에 전달 된 exit_status 아톰은 spawn을 사용하지 않는 한 아무 작업도 수행하지 않습니다.

+0

죄송합니다. 예, 포트 이름에 대해 스폰을 사용하고 있습니다. 보낸 데이터가 stdin으로 가고 PHP가 stdout으로 전송 중이며 그 결과는 erlang 프로세스로 되돌아갑니다. 하지만 당신이 "이 문제를 해결하는 유일한 방법은 각 트랜잭션에서 php (1)를 다시 시작한다는 것입니다."라고 말할 때 나는 이해하지 못했습니다. 이 진술을 설명해 주시겠습니까? – niting112

+0

Erlang 프로그램이'port_close() '를 호출 할 때까지'php (1)'이 표준 출력에서 ​​EOF를 얻을 때까지 처리 된 결과를 반환하지 않을 것입니다. '. 그런 다음 다른 문서를 처리하기 위해 새로운 PHP 포트를 열어야합니다. PHP 프로세스를 계속 실행하는 것이 더 효율적입니다. 이것은 포트를 열 때 모든 패킷 및 행 구분 기호와 관련된 것입니다. 하나의 트랜잭션과 다음 트랜잭션을 구별하는 방법입니다. 독립 실행 형 PHP 인터프리터는이를 지원하지 않으므로 매번 다시 실행해야합니다. –