簡體   English   中英

用於上傳文件的PHP腳本在終端中工作,但不能與incron一起自動調用

[英]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

最后結果是,它一直是代理設置問題

無論出於何種原因,apache webserver以及incron / cron都無法識別機器中設置的環境變量(http_proxy,https_proxy ......)

因此, 直接在我的curl命令中設置代理和代理端口為我解決了問題。

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

有關設置代理代理 端口的更多信息,請參閱提供的鏈接。

謝謝大家的積極貢獻,我很高興我終於找到了解決問題的方法!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM