2009-06-16 3 views
6

30 분 동안 PHP 소스와 씨름 한 후, 나는 포기했습니다. : P 질문입니다 - PHP flock() 함수 호출은 Gentoo Linux 시스템에서 어떤 시스템 콜을 호출합니까? 나는 그것과 함께 몇 가지 문제 (예 : 블록 - 30 초 -에 - 하나 - 20 - 루프 - 반복 종류의 문제)와 나는 왜 그런지 알고 싶습니다.PHP flock() - 내부적으로 무엇입니까?

답변

0

내가 묻는 것을 오해하고있는 것이 아니라면, PHP의 flock()은 Gentoo의 유닉스 시스템 기능 flock()에 대한 호출입니다. 그것들은 동일한 의미론을 가지고있다.

+0

의미 - 예. 그러나 실제로 flock()이라고 부릅니까? –

+0

지금 PHP 사본을 실행하고 있지 않기 때문에 증명할 수는 없지만 믿습니다. 그렇습니다. strace로 직접 해보지 않으시겠습니까? –

+1

서버에 대한 FTP 액세스 만 있습니다. –

0

네트워크 또는 장착 된 드라이브에서 사용하고 있습니까? 당신이 겪고있는 것이 deadlock이고 그 중 일부는 comments in the documentation입니다.

The documentation for flock.

+0

Gentoo Linux를주의 깊게 읽으십시오. 하지만 전체 설정은 약간 복잡하므로 아래에서 무엇을 부르는 지 알고 싶기 때문에 전체 그림을 직접 만들 수 있습니다. –

+0

아니, 그건 확실한 교착 상태가 아니야. 하지만 제가 의심하는 다른 것들이 있습니다. –

+1

아, 방금 파일이 NFS 마운트에 있음을 알았습니다. 그리고 호스트 박스는 또한 (로드 균형 잡힌 웹 서버로) 무리를 지어 주려고합니다. –

3

// example: $stream = fopen(FILE, 'rb') or die('???'); 
$md = stream_get_meta_data($stream); 
echo $md['wrapper_type'];
flock($stream);
이 경우 plainfile을 인쇄하면 php 함수 flock()에 대한 호출은 flock()을 호출하는 php_stdiop_set_option (...)에 의해 처리됩니다. PHP가 HAVE_FLOCK으로 컴파일되었는지 여부에 따라 시스템 호출 flock()이거나 fcntl()을 사용하는 flock_compat.c에 정의 된 함수 일 수 있습니다. 내 젠투 시스템에서 PHP는 HAVE_FLOCK으로 컴파일되었습니다.

주/스트림/plain_wrapper.c @ 정적 INT php_stdiop_set_option (...) :

  case PHP_STREAM_OPTION_LOCKING: 
      if (fd == -1) { 
       return -1; 
      } 

      if ((zend_uintptr_t) ptrparam == PHP_STREAM_LOCK_SUPPORTED) { 
       return 0; 
      } 

      if (!flock(fd, value)) { 
       data->lock_flag = value; 
       return 0; 
      } else { 
       return -1; 
      } 
      break;