30 분 동안 PHP 소스와 씨름 한 후, 나는 포기했습니다. : P 질문입니다 - PHP flock() 함수 호출은 Gentoo Linux 시스템에서 어떤 시스템 콜을 호출합니까? 나는 그것과 함께 몇 가지 문제 (예 : 블록 - 30 초 -에 - 하나 - 20 - 루프 - 반복 종류의 문제)와 나는 왜 그런지 알고 싶습니다.PHP flock() - 내부적으로 무엇입니까?
답변
내가 묻는 것을 오해하고있는 것이 아니라면, PHP의 flock()
은 Gentoo의 유닉스 시스템 기능 flock()
에 대한 호출입니다. 그것들은 동일한 의미론을 가지고있다.
네트워크 또는 장착 된 드라이브에서 사용하고 있습니까? 당신이 겪고있는 것이 deadlock이고 그 중 일부는 comments in the documentation입니다.
Gentoo Linux를주의 깊게 읽으십시오. 하지만 전체 설정은 약간 복잡하므로 아래에서 무엇을 부르는 지 알고 싶기 때문에 전체 그림을 직접 만들 수 있습니다. –
아니, 그건 확실한 교착 상태가 아니야. 하지만 제가 의심하는 다른 것들이 있습니다. –
아, 방금 파일이 NFS 마운트에 있음을 알았습니다. 그리고 호스트 박스는 또한 (로드 균형 잡힌 웹 서버로) 무리를 지어 주려고합니다. –
// 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;
http://www.opengroup.org/onlinepubs/009695399/functions/fcntl.html
/etc/standard/flock_compat.c [line 66]
ret = fcntl(fd, operation & LOCK_NB ? F_SETLK : F_SETLKW, &flck);
이 함수를 호출하거나 컴파일 타임에 의존하지 않는 경우 HAVE_FLOCK을 정의합니다. – VolkerK
의미 - 예. 그러나 실제로 flock()이라고 부릅니까? –
지금 PHP 사본을 실행하고 있지 않기 때문에 증명할 수는 없지만 믿습니다. 그렇습니다. strace로 직접 해보지 않으시겠습니까? –
서버에 대한 FTP 액세스 만 있습니다. –