PHP文件上传和卷曲

时间:2011-01-12 04:14:29

标签: php linux curl centos

我有一个问题。

我有一个处理文件上传的脚本,在文件上传完成后,我通过 curl 将$ _FILES数据发送到另一个本地脚本,该脚本处理文件并将其放入适当的位置

问题是,它使用以下卷曲设置在我的本地完美运行:

curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

我运行Windows 7,但是当我将脚本移动到我的专用服务器(CentOS)时,它就停止了工作。

在进行一些研究后,当文件上传时,它存储在 / tmp 目录中。

事实证明,在我的curl调用之前,上传到 / tmp 的文件是已删除。众所周知,一旦脚本完成执行,PHP就会删除tmp文件上传。

我可以在CURL中使用一个设置来绕过这个问题吗?它本地工作正常,我只是不明白为什么它不能在我的CentOS服务器上工作..

UPDATE :它在我的其他服务器上工作,也在linux上运行......我不知道改变它的具体设置是什么,但似乎每个服务器配置都是不同的。

2 个答案:

答案 0 :(得分:1)

因为您正在使用CURL,所以您正在向Web服务器发送新请求。 您要求Web服务器执行以下操作:

  • 获取上传文件
  • 流程脚本发送
  • 对Web服务器进程的新请求
  • 第二次请求

同时,引擎知道它需要执行以下任务; 整理上传的文件

不同的环境打开了以不同顺序处理这些任务的可能性(例如Linux + Apache vs Windows + IIS)。当它决定整理上传的文件时会解释你所看到的内容:

  • 获取上传文件
  • 流程脚本发送
  • 对网络服务器的新请求
  • < - here
  • 处理第二次请求
  • < - here

在第一个位置,你的脚本会中断,在第二个位置它会起作用。这是因为在处理/运行第二个请求/脚本之前,您的上传文件已被删除。与Marc提到的一样,这是核心功能,因此您需要修改脚本以使用move_uploaded_file(),然后将文件的位置传递给其他脚本。

希望能够说明为什么它在不同的环境中以不同的方式运作。

答案 1 :(得分:0)

当原始上传完成时,您必须使用move_uploaded_file()将文件从/ tmp移出到另一个目录,或者从同一脚本中启动卷曲上传。否则,PHP将清理文件,你无能为力。

自动清理是核心PHP功能,curl不会影响它。