fuser is a handy command when you need to check if a file is currently opened by processes. Here is an implementation in PHP which will work on Linux by scanning the `/proc/<pids>/fd‘ sub-directories.
function fuser($file) {
$pidList = array();
if( ! is_dir('/proc') || ! is_readable('/proc') ) { return array(); }
if( ($pDir = opendir('/proc')) === false ) { return array(); }
while( ($pid = readdir($pDir)) !== false ) {
if( ! preg_match('/^\d+$/', $pid) ) { continue; }
$dir = sprintf('/proc/%s/fd', $pid);
if( ! is_dir($dir) || ! is_readable($dir) ) { continue; }
if( ($fdDir = opendir($dir)) === false ) { continue; }
while( ($link = readdir($fdDir)) !== false ) {
$link = sprintf('%s/%s', $dir, $link);
if( is_link($link) && readlink($link) == $file ) { $pidList[] = $pid; break; }
}
}
return $pidList;
}
This is specific to Linux, as on BSD (and Mac OS X) the information do not seems to be available in clear-form and requires some specific syscalls to get the information from the kernel VM…