[英]PHP script to upload file works in terminal, but not as automatical call with incron
我有一個PHP腳本,使用cURL在Sharepoint上上傳文檔。 如果我在終端中運行scipt,則上傳過程正常。
因為我想在更改此文件時自動調用腳本,我使用incron來檢測相應文件夾中的更改並觸發PHP腳本的調用。
我的incron文件如下所示:
/var/www/[further path]/temp IN_MODIFY,IN_CREATE /usr/bin/php /var/www/[further path]/uploadToSharepoint.php
當我查看syslog時,我可以看到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測試它,這也不起作用。 它執行腳本並循環遍歷它而不打印錯誤,但不上傳文件。 是否有可能與身份驗證有關?
如果你說跑步時一切正常
> php /var/www/[further path]/uploadToSharepoint.php
從命令行手動但不通過incron然后很可能問題是運行incrone命令的user
選項1)嘗試識別運行incrone命令的用戶,然后切換到該用戶並再次運行相同的php /var/www/[further path]/uploadToSharepoint.php
選項2)嘗試chmod到0777掃描目錄並再次使用incron進行測試
根據您的問題和評論,它似乎無論如何都不起作用。
根據您的代碼,我不太確定您使用的功能
$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);
此外,默認情況下curl將嘗試生成get請求。 我覺得應該是POST或PUT請求。 所以請嘗試指定方法為
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
我剛剛閱讀了scandir-function的文檔頁面: http : //php.net/manual/en/function.scandir.php
它描述了第二個參數(sorting_order):
默認情況下,排序順序按字母順序升序排列。 如果可選的sorting_order設置為SCANDIR_SORT_DESCENDING,則排序順序按字母順序降序排列。 如果設置為SCANDIR_SORT_NONE,則結果未排序。
當您指定1
作為sorting_order時,它不會根據給定目錄中文件的創建或修改時間進行排序,而是基於文件名稱的排序順序(按字母順序降序)。
你的代碼中有這兩行:
$files = scandir($localFileURL, 1);
$newest_file = $files[0];
第二行的變量命名表明$files[0]
應該是最新的文件,但通常情況並非如此。
當您在臨時目錄中有多個文件或目錄時,這會讓人感到困惑,因此可以解釋為什么第一次嘗試有效,第二次嘗試沒有。
一個建議是編輯你的incron文件並使用$@
和$#
作為PHP腳本的參數,例如:
/var/www/[further path]/temp IN_MODIFY,IN_CREATE /usr/bin/php /var/www/[further path]/uploadToSharepoint.php "$@/$#"
或者可能因安全問題使用此表單:
/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];
請注意,要使$argv
正常工作,您需要啟用此選項: http : //php.net/manual/en/ini.core.php#ini.register-argc-argv
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.