2011-12-15 6 views
1

PHP에서 exec("dir ...")을 호출하여 일부 파일을 나열합니다. 그러나 이상하게 로컬 드라이브에서만 작동합니다. 네트워크 드라이브에서는 0이 아닌 결과 상태 코드를 가지며 결과가 반환되지 않습니다.PHP의 exec()가 네트워크 드라이브에 액세스 할 수 없습니다.

Windows XP Professional에서 Apache를 실행합니다.

이 문제를 해결하기위한 트릭이 있습니까? 또는 오류 메시지를 보려면?

편집 : 나는 아파치는 동일한 사용자에서 실행하고 나는 명령 줄에서 작업을 수행 할 수 있습니다

+1

당신이 네트워크 드라이브에 대한 UNC 경로로를 시도 : 같은

그래서 당신의 라인이 보일 것이다? '\\ sharename \ path \ to \ resource' –

+1

또한 Apache 웹 서버 사용자는 공유에 액세스 할 권한이 있습니까? –

답변

4

나는 "당신이 명령 행에서 그것을 할 수 없다"말을하려고, 내가했다 사실 이었지만 필자는 WinXP Pro SP3을 시험해 보았고, 저를 괴롭 히고 있습니다.

필자는 얼마 전에 (필자가 PHP의 세계에서 훨씬 더 친숙 해졌을 때) PHP를 네트워크 드라이브에 연결해야만했지만, 악몽을 꾸미기는했지만 결국에는 제대로 작동하게되었습니다. 다음을 수행하여

  • "서비스"MMC 스냅인에서 Apache가 실행되는 사용자 계정을 로컬 사용자로 변경합니다. 계정에 네트워크 드라이브에 대한 액세스 권한이없는 순간 (AFAIK) 순간적으로 SYSTEM으로 설정됩니다. 이 작업을 수행 한 후에 서비스를 다시 시작해야합니다.
  • 시도하고 액세스하기 전에 다음 줄을 추가하십시오. 사용자의 요구 사항에 맞게 드라이브 문자, UNC 경로, 사용자 이름 등을 변경하는 system('net use Z: "\\servername\sharename" PASSWORD /user:USERNAME /persistent:no');. 드라이브가 이미 매핑되어 있어도이 작업을 수행하십시오. 나는 exec() 또는 shell_exec() 대신 system()을 사용해야한다는 것을 기억하고있는 것 같습니다. 그렇지 않으면 작동하지 않습니다. 결과적으로 STDOUT으로 전달되는 출력을 중지하려면 출력 버퍼가 필요합니다.

나는 이것이 왜 효과가 있었는지 전혀 알지 못합니다. 비록 외부 프로그램 인 exec()을 사용하지 않고 opendir()fopen() 같은 원시 PHP 함수를 사용하려고했습니다.

dir으로 전화하여 오류 메시지를 보려면 명령 끝 부분에 2>&1을 붙이십시오. 그러면 STDERR이 STDOUT으로 리디렉션되므로 exec()의 결과에 오류 메시지가 표시됩니다.

exec("dir Z:\\some\\path 2>&1") 
관련 문제