2013-06-25 8 views
3

외부 PHP 드라이브에있는 tar.gz 아카이브를 자동으로 압축 해제하고 스캔하기 위해 PHP 스크립트 작업을하고 있습니다. 스크립트가 아카이브를 찾으면 USB 드라이브에 임시 디렉토리를 만들어 아카이브 압축을 풉니 다. (이 스크립트는 동시에 여러 번 실행될 수 있기 때문에) 고유 한 임시 디렉토리 이름을 보장하려면 다음을 수행하십시오. 나는과 같이, 현재 시간의 MD5의 임의의 5 자리 부분을 사용하여 파일 이름 : USB 드라이브가 서버 파일 시스템에 장착되지 않기 때문에PHP : shell_exec ("mkdir") 및 shell_exec ("rm -rf)의 이상한 문제

$temp = "/media/$driveName/".substr(md5(microtime()), rand(0, 26), 5);

, 나는 PHP의이 내장 사용할 수 없습니다 파일 관리 명령 (mkdir(), glob() 등) 대신 exec() 또는 shell_exec()로 실행되는 터미널 명령을 사용하여 파일 시스템과 만 상호 작용할 수 있습니다. 그래서, 실제로 위의 이름으로 임시 디렉토리를 생성, 나는 기본 터미널 mkdir 명령 사용

shell_exec("tar -xzf $archivePath -C $temp");

:

shell_exec("mkdir $temp");

다음, 나는 임시 디렉토리에 압축 파일을 추출 마지막으로 아카이브 분석이 끝나면 임시 디렉토리와 그 내용을 삭제합니다.

그러나, 나는이 이상한 문제로 실행 해요 :

  1. 은 때때로, 매 5 실행 중 어쩌면, 임시 디렉토리는 손상된 이름으로 작성됩니다. ls directory을 사용하여 표시하면 06191v??????.???v???과 비슷합니다. 그러나 탭 키를 사용하여 cd 명령을 자동으로 채울 때 더 긴 문자열 (예 : 06191v\342\226\200\342\225\232.\342\211\2100v\342\226\200/)이 채워집니다. 나는 문자열이 shell_exec()에 전달되기 직전에 괜찮다는 것을 안다. (나는 올바른 길이로 제한하기 위해 substr()을 사용하려고 시도 했음에도 불구하고) 그리고 첫 번째 슬래시 다음에 나오는 일련의 문자 (그래서 342에서 시작)는 처음 다섯 문자가 무엇이든 관계없이 항상 동일합니다 (초기 5와 슬래시 사이의 문자는 항상 문자이지만 다른 경우 무작위 임). 그러나 그것 이외에, 나는 손실에있다.

  2. 어떤 이유에서든 스크립트 끝에있는 임시 디렉토리를 삭제하는 데 사용하는 shell_exec("rm -rf $temp");은 두 번 실행하면 작동합니다. 한 번 실행하면 rm: cannot remove '/media/FILESYSTEM/f3637': Directory not empty이라는 오류가 발생합니다.이 오류는 -rf이이 오류를 무시해야하므로 이상합니다. 이 동작은 서버의 명령 프롬프트에서도 복제 될 수 있습니다.

나는 온라인으로 문제 중 하나에 관련된 아무것도 찾을 수없는 것, 그래서 난 그냥 내가 바보 같은 실수가 아니라 내 설치 또는 USB 드라이브에 문제를 만들고 있다는 희망하고있다. 어떤 도움을 주셔서 미리 감사드립니다!

편집 : 실제로는 첫 번째 문제 일 수 있습니다. shell_exec("tar -xzf") 명령을 실행하여 내 아카이브의 압축을 풀면 결과 디렉토리 은 항상에 몇 가지 이상한 문자가 추가됩니다.예를 들어 BOOT라는 압축 된 디렉토리가있는 실행의 경우 압축 해제 된 디렉토리는 터미널에 BOOT??w??????.???w???으로 표시되고 에코 출력은 BOOT²w▀╚.∙wâ–€으로 표시됩니다. 탭을 사용하여 cd 명령을이 디렉토리에 채우면 거의 동일한 패턴을 가진 문자열이 나타납니다 : BOOT\302\262w\342\226\200\342\225\232 2.\342\210\231w\342\226\200/. 99 %는 스크립트 실행에 영향을 미치지 않지만 때때로 스크립트가 디렉토리를 스캔하지 못하게합니다.

답변

0

이 세 가지 문제는 동일한 솔루션을 한 것으로 밝혀 : USB 드라이브 이외의 곳 임시 보관을합니다. 여분의 문자가 무엇인지 알 수는 없지만 임시 디렉토리 위치를 Linux/tmp 디렉토리로 옮겼을 때 한 번씩 사라졌습니다.

0

# 1의 경우 몇 가지 이상한 문자가 들어가는 것 같습니다.

내 컴퓨터에 이것을 시도하고 작동 듯 : '.'

<?php 

for($x = 0; $x < 30 ; $x++) 
    shell_exec('mkdir ' . substr(md5(microtime()), rand(0, 26), 5)); 
    sleep(1); 

내가 따옴표 내부에서 변수를 분리하여 다시 추가

-Ken

+0

이 문제는 임시 디렉토리의 이름을 변수에 저장할 수 있어야한다는 것입니다 (터미널 명령을 사용하여 찾을 수는 있지만 불필요한 원형 교차로처럼 보입니다). 나는 이것을 다음과 같이 시도했다 :'shell_exec ("mkdir". $ temp);'그러나 차이를 만드는 것처럼 보이지 않았다. – NinjaBlob

+0

$ temp 변수를 에코 할 수 있습니까? 내 추측은 일부 비 ASCII 문자가 거기에 들어가는 것입니다. –

+0

시도했지만, 여전히 같은 문제가있었습니다 : 'ob_start(); echo $ temp; $ temp = ob_get_clean(); ' – NinjaBlob