2017-03-03 4 views
6

cURL을 사용하여 Sharepoint에서 문서를 업로드하는 PHP 스크립트가 있습니다. 터미널에서 scipt를 실행하면 업로드 프로세스가 정상적으로 작동합니다.파일을 업로드하는 PHP 스크립트는 터미널에서 작동하지만, incron은 자동 호출이 아닙니다.

이 파일이 변경 될 때마다 자동으로 스크립트를 호출하고 싶습니다. incron을 사용하여 해당 폴더의 변경 사항을 감지하고 PHP 스크립트 호출을 트리거합니다.

내 incron 파일은 다음과 같습니다 : 나는 시스템 로그에서보고있을 때, 나는 스크립트 호출이 incron 제대로 트리거 된 것을 볼 수 있습니다

/var/www/[further path]/temp IN_MODIFY,IN_CREATE /usr/bin/php /var/www/[further path]/uploadToSharepoint.php 

. 그러나 어떤 이유로 파일은 Sharepoint에 업로드되지 않습니다. 또한 전역 쓰기 권한이있는 파일을 만들려고했지만 내 문제가 해결되지 않았습니다. 여기

-rwxrwxrwx 1 www-data www-data 49058 Mär 3 10:28 [file].xlsx 

나는 나의 스크립트 전화 했어된다

가 'database.php'를 포함;

$username="[username]"; 
    $password="[password]"; 

    $localFileURL="/var/www/[further path]/temp/"; 
    $files = scandir($localFileURL, 1); 
    $newest_file = $files[0]; 
    $pathToUpload=getTeamPath($newest_file); 


    uploadDocument($pathToUpload . '/' . $newest_file, $localFileURL . $newest_file,$username, $password); 

    function uploadDocument($dest, $localFile,$username, $password){ 
      $fp = fopen($localFile, 'r'); 

    // Connecting to website. 
      $ch = curl_init(); 

      curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password); 
      curl_setopt($ch, CURLOPT_URL, $dest); 
      curl_setopt($ch, CURLOPT_UPLOAD, 1); 
      curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeout 
      curl_setopt($ch, CURLOPT_INFILE, $fp); 
      curl_setopt($ch, CURLOPT_NOPROGRESS, false); 
      curl_setopt($ch, CURLOPT_BUFFERSIZE, 128); 
      curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFile)); 
      curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); 
      curl_exec ($ch); 

      if (curl_errno($ch)) { 

        $msg = curl_error($ch); 
      } 
      else { 
        $msg = 'File uploaded successfully.'; 
      } 
      curl_close ($ch); 
    } 

정말 도움이됩니다.

편집 : 나는 지금도 정상적인 crontab을 사용하여 테스트를 진행했으며이 방법도 작동하지 않습니다. 오류를 인쇄하지 않고 스크립트를 실행하고 루프를 수행하지만 파일을 업로드하지는 않습니다. 인증과 관련이있을 수 있습니까?

+0

실행중인 cron 스크립트에 문제가있는 경우 첫 번째 용의자는 항상 파일 사용 권한이지만이 문제를 완전히 알고있는 것으로 보입니다. 두 번째 용의자는 쉘 환경 변수가 될 수 있습니다. 나는 PHP의'$ _ENV' 변수를 읽을 수있는 곳으로 버리고 그 내용을 검사하려고합니다. –

+0

아직 시도하지 않았다면 스크립트 STDOUT 및 STDERR을 cron 호출의 파일로 라우팅하여 그 내용을 확인하십시오! –

+0

의견을 보내 주셔서 감사합니다. "> /var/www/[folder]/Log.log 2> & 1"을 내 명령에 추가하면 출력되지 않습니다. 아니면 잘못하고 있습니까? – user2550641

답변

0

:이 옵션이 설정을 On으로 할 필요가 작업 $argv에 대한 그 생각

$newest_file = $argv[1]; 

그런 다음이 줄을 변경할 수 있습니다 프록시 설정을 사용하여 문제가 발생했습니다. .아파치 웹 서버뿐만 아니라 (HTTP_PROXY, https_proxy를 ...)

따라서 컴퓨터에 설정 한 환경 변수를 인식하지 않는 incron/크론은 프록시 설정 어떤 이유를 들어

내 curl 명령에서 직접 프록시 포트이 문제를 해결했습니다. proxyproxyport 설정에 대한

curl_setopt($ch, CURLOPT_PROXY, '[ip.ip.ip...]'); 
curl_setopt($ch, CURLOPT_PROXYPORT, '[port]'); 

자세한 내용은 제공된 링크에서 찾을 수 있습니다.

적극적인 참여에 감사드립니다. 드디어 내 문제에 대한 해결책을 찾았습니다.

0

당신이) 모든 작품은 당신이 명령 줄에서

> php /var/www/[further path]/uploadToSharepoint.php 

수동으로 실행할 때 아닌 incron을 통해 다음 대부분의 아마 문제가 incrone가

옵션 1 명령 실행 user 함께 있다고하면 시도 상좌 명령을 실행 한 사용자를 확인한 다음 해당 사용자로 전환하여 다시 실행하십시오. php /var/www/[further path]/uploadToSharepoint.php

옵션 2) 0777 스캔 디렉토리로 이동하여 다시 테스트하십시오.

+0

은 모두 작동했습니다 :-(incron은 루트뿐만 아니라 콘솔, chmod는 777로 설정되었지만 작동하지 않습니다. 제안 해 주셔서 감사합니다. – user2550641

0

질문과 의견에 따라 어느 쪽이든 작동하지 않습니다. 코드 당으로

, 난 당신이
$pathToUpload=getTeamPath($newest_file); 

를 사용하는 당신에게 올바른 업로드 경로를 제공 희망 한 기능에 대해 매우 확실하지 않다. 둘째로 CURLAUTH_NTLM을 사용 중입니다. 내가 비슷한 작업을 한 후에는 내가 사용한 시간이 CURLAUTH_BASIC & 일 때가되었다는 것을 기억합니다. 그래서 함께 시도해보십시오.

CURLOPT_USERPWD 도메인을 포함 시키십시오.기본 컬에 의해 또한

$data = file_get_contents($file); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 

요청을받을 수 있도록 노력할 것입니다 :
curl_setopt($ch, CURLOPT_USERPWD, 'domain\\username:password'); 

으로 또한 당신은 데이터가 파일 내용 예를 얻을 수있을 것입니다 CURLOPT_POSTFIELDS 설정을 시도 할 수 있습니다. POST 또는 PUT 요청이어야한다고 생각합니다. http://php.net/manual/en/function.scandir.php

그것은 두 번째 매개 변수 (sorting_order) 설명 : 그래서 난 그냥 위해 scandir 기능의 문서 페이지를 읽어

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); 
0

로 지정하는 방법으로 시도해보십시오 기본적으로

을, 정렬 된 순서는 오름차순으로 알파벳순으로 표시됩니다. 선택적 sorting_order가 SCANDIR_SORT_DESCENDING으로 설정된 경우 정렬 순서는 내림차순으로 영문자 순입니다. SCANDIR_SORT_NONE으로 설정하면 결과가 정렬되지 않습니다.

이 종류의 주어진 디렉토리에있는 파일의 생성 및 수정 시간을 기준으로하지만, (알파벳 순) 파일의 이름에 대한 정렬 순서를 머물게하지 않습니다 sorting_order 당신이 1를 지정

.

당신은 당신의 코드에서이 두 라인을 가지고 :

$files = scandir($localFileURL, 1); 
$newest_file = $files[0]; 

두 번째 줄의 변수 이름은 최신 파일이어야한다 $files[0]을 제시하지만, 이것은 아마도 종종 아니다.

임시 디렉토리에 여러 개의 파일이나 디렉토리가있을 때 혼란을 겪을 수 있습니다. 따라서 첫 번째 시도가 작동하고 두 번째 시도가 실패하는 이유를 설명 할 수 있습니다.

/var/www/[further path]/temp IN_MODIFY,IN_CREATE /usr/bin/php /var/www/[further path]/uploadToSharepoint.php "[email protected]/$#" 

또는 보안 문제는이 양식을 사용 어쩌면 인해 :

/var/www/[further path]/temp IN_MODIFY,IN_CREATE /usr/bin/php /var/www/[further path]/uploadToSharepoint.php "$#" 

한 가지 제안은 incron 파일을 편집하고 같은 당신의 PHP 스크립트에 매개 변수로 [email protected]$#을 사용하는 것입니다

두 번째 양식을 사용하면 방금 수정되었거나 방금 생성 된 파일 이름 만 PHP 스크립트의 매개 변수로 제공됩니다. 이에

$newest_file = $files[0]; 

: 마지막으로 http://php.net/manual/en/ini.core.php#ini.register-argc-argv