PHP curl在将数据输出到文件时下载失败,但在将数据打印到标准输出时下载成功


PHP curl fails to download data when outputting to a file but ok when printing to stdout

这个问题已经困扰我好几个小时了。

我似乎不明白为什么PHP cURL不会将数据下载到文件。(CURLOPT_FILE设置为本地文件。)我没有得到任何数据。我定期检查目标文件的文件大小,它总是为零。为了给你一个背景,我下载了一个90kb的jpeg文件(用于测试目的)。

这是在我的本地计算机(XP)上工作,但不是在我正在工作的网站(Windows Server 2003)。

我做了几个测试,使这个场景更加奇怪。

  1. 我禁用CURLOPT_FILE将curl返回的数据打印到标准输出中,并打印二进制数据

  2. 之前经历过被阻止的网站(因为服务器实现访问控制),我尝试从internet explorer访问该文件,我能够看到它。

  3. 我以前有过下载被阻止的经历,我试着从ie下载文件,它被下载了。

  4. 文件由fopen(", 'w')创建,但大小仍然为0。尽管这个成功的文件创建,我认为也许PHP有文件系统写权限的问题,我设置了exe,甚至由非管理员用户运行。

有人发生过这种事吗?

任何提示将不胜感激。我真的卡住了。

谢谢。

下面是我设置的curl选项:

$connection = curl_init($src);
// If these are not set, curl_exec outputs data.
// If these are set, curl_exec does not send any data to the file
// pointed to by $file_handler. $file_handler is not null
// because it is opened as write (non-existing file is created)
curl_setopt($connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt( $connection, CURLOPT_FILE, $file_handler );

PS:我正在使用命令行而不是浏览器进行这些测试。

您可能没有权限写入文件。

我不认为你必须设置CURLOPT_RETURNTRANSFER,如果你是从命令行运行一定要运行php与管理员权限。不知道它在windows中是如何工作的,但在linux中,我总是sudo我运行的每个命令行脚本。

另外,如果php的安全模式,确保也给目录相同的(UID)所有者作为php文件。嗯,但是既然你可以创建文件(文件大小为0),它可能与权利无关……您是否可以检查服务器上的*open_basedir* PHP设置?如果设置了cUrl,则不允许使用文件协议…你检查过服务器上的日志文件了吗?

您可能需要弄清楚运行php的用户,如果运行php脚本的用户(调用php的用户)没有被授权写入文件目录或/path/to/file,您可能需要调整文件权限