2011-09-03 4 views
3

posix_mkfifo로 만든 fifo (명명 된 파이프) 파일을 사용하여 "include"문을 사용하는 방법을 찾고있었습니다. 나의 기대가 높았던 것에 따라 나는 그것이 결코 일어나지 않을 것이다라고 확신하고 있었던 행동을 기다리고있는, 페이지를 막기 위해 매우 우울하게하게되었다.fifo (명명 된 파이프) 파일에서 지시문을 include

그래서 ... 논리는 "fopen"-family 함수를 "include"하는 것으로 확실하게 사용되며 fifos는이 방법으로 열 수 있습니다. 나의 유일한 일은 다음을 작성하는 것입니다. 그것은, 그것이 포함될 때까지 어쩌면 자원을 보존하고, 파일을 포함하고, 처리기를 닫고, 파일을 삭제합니다. 그러나 물론 그것은 그렇게 아무것도 아니 었습니다. 나는 include가 파일을 블로킹 방식으로 열고 이것이이 문제가 내 문제의 원인이라고 생각한다. C에서 FIFO를 사용하여 작업 한 결과, 비 차단 오픈 메소드에서 FIFO의 정보가 독자가 읽는 것을 결정할 때까지 보존된다는 것을 알았습니다. 나는 똑같은 행동을 바라고 있었다.

독자가 계속할 수 있도록 동일한 FIFO에 쓰기 위해 다른 페이지를 열려고 시도했지만 실패 할 수도 있습니다. 또한 페이지가 더 이상 응답하지 않았을뿐만 아니라 사용자가 중단하도록 대답하지 못했습니다. 사실 session_start()가 몇 분 동안 두 개의 프로세스에서 사용할 수 없다고 말하면서 몇 분 동안 세션을 차단했기 때문입니다. 한 번 (나는 여기에 오류 메시지에 대해 잘못되었을 수도 있습니다. 나는 잘 기억할 수 있습니다. 그리고 테스트 파일을 삭제했습니다.)

이 문제를 해결할 수있는 방법이 있다면 필자의 질문은 : fifo를 사용하는 것입니다.

마지막으로 이 질문에 대한 답변을 드리겠습니다. 나는이 시스템을 실제 코드와 필요에 따라 동적으로 수정하려는 목적으로 내 시스템을 처리한다고 말합니다. 완전히 뒤집을 수 있습니다. 그리고 그것은 원래의 파일을 읽고, 코드를 확인하고, 생각할 때 그것을 변경 한 다음, 새로운 "루트"폴더에서 파일에 쓰고, 폴더와 파일 계층 구조를 유지 한 다음 파일을 "포함"해야합니다 . 현재 나는 fifos의 사용을 실제 파일로 바꾸었지만 많은 코드를 필터링해야합니다. 그리고 eval은 함수에서 과용 되긴하지만 현재 디렉토리와 스크립트 이름 또는 실제 파일에 특정한 것을 유지하지 못하기 때문에 해결책이 아닙니다. 게다가 많은 것들, 특히 상대 경로를 사용하면 매우 유용합니다. PHP 구문의 이상한 사용. 그래서 나는 아직도 파일에 글을 쓰고있다.

시스템이 끔찍한 시간 소비자와 나쁜 자원 관리자이기 때문에, 나의 원래 생각은 더 가볍고, 메모리에 보관되고, 휘발성이며, 실제로 IPC의 유일한 목적으로 만들어진 FIFO로 작성하는 것이 었습니다. 코멘트에서 제안한 것처럼 관련하여

, 폴

+0

이것은 해결책의 일부로 보인다 : http://stackoverflow.com/questions/580013/how-do-i-perform-a-non-blocking-fopen-on-a-named-pipe-mkfifo (오른쪽의 관련 게시물도 확인하십시오.) – Quasdunk

+0

아마도 스트림 래퍼를 작성한 다음 해당 래퍼를 통해 파일을 포함 할 수 있습니까? 그런 다음 래퍼 코드에서 코드를 변경합니다. 참조 : http://www.php.net/manual/en/function.stream-wrapper-register.php and http://www.php.net/manual/en/class.streamwrapper.php – hakre

+0

@ include 문이 fopen을 처리하는 방식을 제어 할 수 없기 때문에 Quasdunk의 솔루션이 작동하지 않습니다. – khael

답변

0

, 나는 그것을 조금 정교한 것 : 자신의 스트림 래퍼를 작성하고 당신은 프로토콜의 상단에 등록 할 수 있습니다 :

stream_wrapper_register("myfilter", "WrapCode"); 

include('myfilter://path-to-include'); 

# or 

include('myfilter://file://path-to-include'); 

이렇게하면 WrapCode 스트림 래퍼 클래스 내에서 원본 리소스에 대한 스트림을 연 다음 파일에서 투명하게 처리 할 수 ​​있습니다. 이것은 작동 중일 것입니다. 따라서 파일을 어딘가에 저장하는 것에 신경을 쓸 필요는 없습니다 (그러나 여전히 그렇게 할 수 있습니다).

PHP Manual offers an example with a simple stream wrapper class은 어떻게 작동하는지 보여줍니다.

+0

나는 30 분 전에 대답하려고했지만, 나는이 사이트에서 지식의 근원을 찾았지만, 최대의 문자를 놓친 것 같았고, 내 게시물은 등록되지 않았다. 어쨌든 나는 당신이 제시 한 우아한 해결책에 대해 감사 드리고 싶었습니다. 심지어 그것을 시험해보기까지 포장지를 두려워하기도 전에 생각한 것입니다. 그러나 예를 가지고 약간 연주하고 실제로 그것을 이해 한 후에 나는 앞으로 나아갈 가능성에 매료되었다. 다른 사람들이 비슷한 해결책을 찾도록 영감을주기 위해 필자는 코드의 전체 샘플을 반환 할 것입니다. – khael

+0

@paul : 의견을 보내 주셔서 감사합니다. – hakre

+0

답변 해 주셔서 다시 한 번 감사드립니다. 내 서버에서 오프라인으로 테스트 한 후, 이제는 호스팅 서비스 제공 업체의 바보 같은 규칙과 싸우는 중입니다. 저기의 기술 담당자는 래퍼가 무엇인지 모릅니다. 어떤 함수는 이상한 행동을하고, 어떤 것은 래퍼를 사용하고 싶지 않고, 다른 함수는 래퍼를 사용하고 싶지 않으며, 래퍼 내부에서 fread 함수를 사용하지 않으면 함수는 아무것도 반환하지 않습니다. , 나는 이것에 관해 prety 미쳤다. 다시 한 번 나는 어떤 사람들의 어리 석음을 극복 할 수 없다는 현실에 직면하여 머리를 숙이해야합니다. – khael

관련 문제