2013-12-14 2 views
0

inotify PECL 확장자를 사용하여 PHP로 작성된 파일 모니터링 데몬에서 작업하고 있습니다. inotify 이벤트가 발생하면 알려주므로 거의 끝났습니다. 내가 제대로 이해한다면PHP Inotify - 정수 값에서 비트 마스크 확인

Array 
(
    [0] => Array 
     (
      [wd] => 2 
      [mask] => 1073741840 
      [cookie] => 0 
      [name] => collaphoto 
     ) 

    [1] => Array 
     (
      [wd] => 2 
      [mask] => 1073741856 
      [cookie] => 0 
      [name] => filewatcher 
     ) 

    [2] => Array 
     (
      [wd] => 2 
      [mask] => 1073741840 
      [cookie] => 0 
      [name] => filewatcher 
     ) 

) 

은, 각각의 서브 어레이는 해당 이벤트에 대한 정보, 개인 이벤트 :

inotify_read($fd)의 반환 값

은 다음과 같습니다 배열입니다. wd은 inotify 인스턴스의 설명 자입니다. mask은 이벤트를 트리거 한 플래그의 정수 값입니다. 예 : IN_ATTRIB 또는 IN_ACCESS, cookie은이 이벤트를 대기열의 다른 이벤트에 연결하는 고유 ID이고 name은 디렉토리 또는 파일입니다. 그것은 바뀌었다. name은 디렉토리가 inotify으로 감시되는 경우에만 제공됩니다.

제 질문은 비트 마스크가 mask 값을 기반으로 트리거 된 것을 어떻게 알아낼 수 있습니까? Bit Masks를 다루는 데는 아직 경험이 거의 없으므로 쉽게 해결할 수 있습니다. 우리는 일정한 모델 변경 처리하기위한 괜찮은 전략을 마련하기 위해 매우 자주 발생하고 어려울 수있는 이벤트에 대해 얘기하고 있기 때문에

Full List of inotify Flags

+0

흠 ... 나는이 작업을 수행하는 우아한 방법을 생각하려고 해요. 상수 이름을 가진 배열을 만든 다음 루프를 반복하고 $ key => $ value 형식의 foreach 루프를 찾을 때까지 비교해 보았습니까? – Zarathuztra

+0

아이디어가 있어요. 나는 그걸 시도 할 수도 있습니다. 또 다른 메모에서는 프로그램에서 어떤 이벤트를 청취 할 수 있는지를 알 수 있으므로 반복적으로 실행하고 플래그를 전환하여 매번 수신 대기하고 값을 기록하는 방법에 대해 생각했습니다. 그러나 들어야 할 깃발이 많이 있습니다. P – Goldentoa11

+0

확실히! 필자는 파일 시스템을 모니터링하는 것에 대해 이야기하고 있기 때문에이 작업을 수행하는 최선의 최선의 방법을 알아 내려고 노력하고 있습니다. – Zarathuztra

답변

0

그것은 정말 내가 생각할 수있는 가장 우아한 해결책이 아니다 , 파일 시스템 변화를 관찰합니다. 그런 일을 처리하기위한 나의 무차별 한 방법이 있습니다.

우리는 상수의 마스터 목록 (모두 아래에있는 것은 물론 가치가 있음)을 가지고 있으며, 상수 중 하나와 일치해야하는 파일 시스템에서 되돌아 오는 숫자 값이 있습니다.

무엇을할까요? 자, 숫자 값을 문자열 화하여 숫자 값이 키이고 명명 된 상수가 값인 연관 배열을 만듭니다. 이 배열은 일종의 자리 표시 자이며 수정할 예정이 없으므로 가능한 한 일정하게 유지하려고 시도합니다. 배열을 상수로 선언 할 수는 없지만 일부는 hacks입니다. 또한 하나의 복사본 만 존재하도록 정적으로 설정하고 구조에서 탐색 시간을 최대화하는 방법을 찾을 수 있는지 확인하는 것이 좋습니다. 이는 파일 시스템이 얼마나 변화하고 배열에서 수행해야하는지 조회를 기반으로 할 수 있지만, PHP가 해시 테이블을 잘 수행하고 O (1) 시간에 연관 배열을 유지하는 한 안전해야합니다.

참고 : 그냥 경우에 당신은 당신의 키가되는 방법 인 상태 메모리 문제로 실행 : The scoop on PHP array sizes