2017-03-03 30 views
6

我有一個PHP腳本,使用cURL上傳Sharepoint上的文檔。 如果我在終端中運行scipt,上傳過程可以正常工作。PHP腳本上傳文件在終端中工作,但不是與incron自動呼叫

因爲我想在文件更改時自動調用腳本,我使用incron來檢測相應文件夾中的更改並觸發PHP腳本的調用。

我incron文件如下所示:

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

當我看看系統日誌,我可以看到腳本調用已被incron正確地觸發。但由於某些原因,該文件未上傳到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腳本沒有運行的問題時,第一個嫌疑人總是文件許可,但你似乎完全知道這個問題。第二個嫌疑人可以是shell環境變量。我會嘗試將PHP的'$ _ENV'變量轉儲到可讀的地方並檢查其內容。 –

+0

如果您還沒有嘗試過,請嘗試將您的腳本STDOUT和STDERR路由到cron調用中的文件,並查看它告訴您的內容! –

+0

感謝您的意見。 在incron中添加「> /var/www/[folder]/Log.log 2>&1」給我的命令不會給出任何輸出 或者我做錯了嗎? – user2550641

回答

0

最後事實證明,這是一個問題與代理設置

無論出於何種原因,Apache網絡服務器,以及在incron/cron的不承認已在機器中設置 (HTTP_PROXY,https_proxy ...)

因此環境變量,設置代理而直接在我的curl命令中的proxyport爲我解決了這個問題。有關設置proxyproxyport

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

更多信息可以在所提供的鏈接找到。

謝謝大家的積極參與,我很高興終於找到了解決我的問題的解決方案!

0

如果說所有的作品,當你

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

手動運行命令行而不是通過incron那麼最有可能的問題是與user誰運行incrone命令

選項1)嘗試識別運行incrone命令的用戶,然後切換到該用戶並再次運行php /var/www/[further path]/uploadToSharepoint.php

選項2)嘗試chmod到0777您的掃描目錄並再次用incron進行測試

+0

嘗試了兩種方法,沒有任何結果:-(incron是由root執行的,以及控制檯; chmod已被設置爲777,但不起作用。謝謝您的建議 – user2550641

0

根據您的問題和意見,它似乎無法以任何方式工作。

按照您的代碼,我不是很肯定的功能,您使用

$pathToUpload=getTeamPath($newest_file); 

希望它讓你正確上傳路徑。 秒您正在使用CURLAUTH_NTLM。我記得有一次,我不得不做了類似的工作,我曾使用CURLAUTH_BASIC &它的工作。所以請嘗試一下。

另外CURLOPT_USERPWD嘗試在此包含域。作爲

curl_setopt($ch, CURLOPT_USERPWD, 'domain\\username:password'); 

此外,您可以嘗試設置CURLOPT_POSTFIELDS,其中的數據將是您的文件中獲取的內容例如:

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

此外,默認情況捲曲將努力使GET請求。我覺得它應該是POST或PUT請求。所以請確定方法,嘗試爲

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

我剛纔讀的SCANDIR功能的文檔頁面: http://php.net/manual/en/function.scandir.php

它描述了第二個參數(sorting_order):

默認情況下,排序順序按字母順序升序排列。如果 可選sorting_order設置爲SCANDIR_SORT_DESCENDING,那麼 排序順序按字母順序降序排列。如果它設置爲 SCANDIR_SORT_NONE,那麼結果是未排序的。

當你作爲sorting_order不排序基於在給定的目錄中的文件創建或修改的時間,但基於有關文件(降序排名不分先後)的名字排序順序指定1

您在代碼中有以下兩行:

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

第二行的變量命名建議$files[0]應該是最新的文件,但是這可能往往並非如此。

當您在臨時目錄中有多個文件或目錄時,這會引起混淆,因此可以解釋爲什麼第一次嘗試可行,第二次嘗試不行。

一個建議是編輯incron文件,並使用[email protected]$#作爲參數傳遞給你的PHP腳本,如:

/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 "$#" 

使用第二種形式只有剛剛被修改或剛剛創建的文件名作爲PHP腳本的參數給出。

然後你就可以改變這一行:

$newest_file = $files[0]; 

要這樣:

$newest_file = $argv[1]; 

注意,儘管如此,對於工作,你需要啓用這個選項: http://php.net/manual/en/ini.core.php#ini.register-argc-argv

相關問題