繁体   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