PHP: How do I avoid reading partial files that are pushed to me with FTP?
Using the lock_upload_files
configuration option of vsftpd
leads to locking files with the fcntl()
function. This places advisory lock(s) on uploaded file(s) which are in progress. Other programs don't need to consider advisory locks, and mv
for example does not. Advisory locks are in general just an advice for programs that care about such locks.
You need another command line tool like lockrun
which respects advisory locks.
Note: lockrun
must be compiled with the WAIT_AND_LOCK(fd)
macro to use the lockf()
and not the flock()
function in order to work with locks that are set by fcntl()
under Linux. So when lockrun
is compiled with using lockf()
then it will cooperate with the locks set by vsftpd
.
With such features (lockrun
, mv
, lock_upload_files
) you can build a shell script or similar that moves files one by one, checking if the file is locked beforehand and holding an advisory lock on it as long as the file is moved. If the file is locked by vsftpd
then lockrun
can skip the call to mv
so that running uploads are skipped.
If locking doesn't work, I don't know of a solution as clean/simple as you'd like. You could make an educated guess by not processing files whose last modified time (which you can get with filemtime()
) is within the past x minutes.
If you want a higher degree of confidence than that, you could check and store each file's size (using filesize()
) in a simple database, and every x minutes check new size against its old size. If the size hasn't changed in x minutes, you can assume nothing more is being sent.