2011-04-29 4 views
13

파일이 FTP를 통해 내 서버에 푸시됩니다. Drupal 모듈에서 PHP 코드로 처리합니다. O/S는 Ubuntu이고 FTP 서버는 vsftp입니다.PHP : FTP로 나에게 푸시 된 부분 파일을 읽지 않으려면 어떻게해야합니까?

정기적으로 새 파일을 확인하고 SimpleXML로 처리 한 다음 "완료"폴더로 이동합니다. 부분적으로 업로드 된 파일은 어떻게 처리합니까?

vsftp의 lock_upload_files 기본값은 yes입니다. 파일을 먼저 이동하려고 시도하고 현재 업로드중인 파일에서 이동이 실패 할 것으로 예상했습니다. 최소한 커맨드 라인에서는 그런 일이 일어나지 않는 것 같습니다. 대용량 파일을 업로드하고 이동하기 시작하면 새로운 위치에서 계속 증가합니다. 디렉터리 항목이 잠겨 있지 않은 것 같습니다.

SimpleXML로로드하기 전에 성공했는지 확인하기 위해 'a'또는 'r +'모드로 fopen을 시도해야하나요? 아니면 더 좋은 방법이 있습니까? 난 그냥 SimpleXML로드 실패를 감지 할 수있을 것 같아요 ... 그 지저분 해 보인다.

발신자를 제어 할 수 없습니다. 그들은 업로드 및 이름 변경을하지 않습니다.

감사

+1

잠금을 확인하지 않으면 파일의 마지막 수정 시간을보고 해당 파일이 아직/수정되지 않았는지 확인할 수 있습니다. – deceze

답변

3

잠금이 작동하지 않는 경우, 당신이 원하는만큼/깨끗한 간단한 해결책을 알고하지 않습니다. 마지막으로 수정 한 시간 (filemtime()으로받을 수 있음)이 지난 x 분 이내에있는 파일을 처리하지 않으면 교훈있는 추측을 할 수 있습니다. 당신이보다 신뢰의 높은 수준을 원하는 경우에

, 당신은 확인하고 간단한 데이터베이스 (filesize() 사용) 각 파일의 크기를 저장하고, 모든 X분는 옛 크기에 대한 새 크기를 확인할 수 있습니다. 크기가 x 분으로 변경되지 않은 경우 더 이상 전송되지 않는다고 가정 할 수 있습니다.

+0

감사합니다. filemtime은 가장 쉬운 솔루션 인 것 같습니다. 그것들은 단지 시간당 한 번씩 검사하는 작은 파일들입니다. 그래서 마지막 순간에 기록되지 않았다면 나는 괜찮을 것입니다. 나는 fopen을 시도한 다음 무리와 독점적 인 자물쇠를 얻었지만 항상 성공합니다. 나는 vsftp가 lock_upload_files = YES 일 때 또는 실제로 잠금에 대해 많이 이해하지 못한다고 생각합니다. 나는 권고 자물쇠의 개념을 이해하므로 vsftp가 사용하는 것이 아니라고 생각합니다. – tetranz

1

이전 대답을 선택하면 파일을 복사 한 다음 고정 된 간격으로 복사 한 파일과 원래 파일의 크기를 비교할 수 있습니다.

크기가 일치하면 업로드가 완료되고 복사본을 삭제하고 파일을 사용하십시오.

크기가 맞지 않으면 파일을 다시 복사하십시오.

반복.

2

lsof linux 명령은 열린 파일을 시스템에 나열합니다. PHP에서 shell_exec()으로 실행하고 출력을 구문 분석하여 FTP 서버에서 사용중인 파일을 확인하는 것이 좋습니다.

4

lock_upload_files 구성 옵션을 vsftpd으로 사용하면 fcntl() 기능을 사용하여 파일을 잠급니다. 진행중인 업로드 파일에 자문 잠금 장치를 배치합니다. 다른 프로그램은 권고 자물쇠를 고려할 필요가 없으며, 예를 들어 mv은 권장하지 않습니다. 권고 자물쇠는 일반적으로 그러한 자물쇠를 돌보는 프로그램에 대한 조언 일뿐입니다. 자문 잠금을 고려하는 lockrun과 같은 다른 명령 줄 도구가 필요합니다.

: lockrun은 리눅스에서 fcntl()가 설정 잠금 작업을 위해 lockf() 아닌 flock() 기능을 사용하기 위해 WAIT_AND_LOCK(fd) 매크로를 컴파일해야합니다.따라서 lockrunlockf()으로 컴파일하면 vsftpd으로 설정된 잠금과 협조합니다. 같은 기능을 가진

(lockrun, mv, lock_upload_files) 파일을 이동할 때이 파일이 사전에 잠겨 있으면 확인하고 그것이에 자문 잠금을 보유하고, 파일을 하나씩 이동 쉘 스크립트 또는 유사한을 구축 할 수 있습니다 . 파일이 vsftpd에 의해 잠긴 경우 lockrun은 실행중인 업로드를 건너 뛰도록 mv으로 건너 뛸 수 있습니다.

0

다른 아이디어가 있습니다. 업로드 디렉토리의 일부 또는 전부에 액세스 할 수있는 수퍼 유저 (루트가 아닐 수도 있지만) FTP 사용자를 만드십시오. 업로드 된 파일을 디스크에서 바로 읽는 PHP 코드 대신 로컬 FTP 서버에 연결하고 파일을 다운로드하십시오. 이렇게하면 vsftpd가 잠금을 처리합니다 (lock_upload_files을 사용하도록 설정 한 경우). vsftp가 독점/쓰기 잠금을 해제 한 후에 만 ​​파일을 다운로드 할 수 있습니다 (작성이 완료되면).

귀하의 의견에 flock (및 실패 방법)을 시도한 것을 언급하셨습니다. 실제로 vsftpd가 잠기는 것과 일치하는 것을 시도하는 것은 고통 스럽지만, dio_fcntl은 가치가있을 것입니다.

0

몇 년 전만해도 문제가 해결 된 것 같습니다.

일부 패턴을 사용하여 필요한 파일을 찾으면 다른 이름을 사용하도록 파일 업로드 담당자에게 요청하고 업로드가 완료되면 파일 이름을 바꿀 수 있습니다.

관련 문제