在PHP中将curl stdout捕获到变量中

时间:2009-12-04 16:45:31

标签: php ftp curl

任务

将二进制文件从远程媒体处理服务器下载到Web服务器。

这有效,但我无法捕捉curl stdout输出

$ result = shell_exec('curl -v http://domain.com/images/dir/dir/dir/file.jpg --user username:password -o /usr/www/htdocs/images/dir/dir/dir/file.jpg');

注意: 我没有运气使用PHP curl包装器来完成这项任务,部分原因是我从未使用PHP curl包装器进行FTP下载。

问题 有人可以解释如何捕获我正在炮轰的命令的输出或使用PHP curl包装器的简单示例吗?

这是我尝试的内容,而我所困扰的部分是如何将新文件放在目标服务器上 - 错误的行是CURLOPT_FILE行。我不想创建存根文件,打开它然后写入它。

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $ftpserver.$file['directory'].$filename); #input
curl_setopt($curl, CURLOPT_FILE, $dest); #output
curl_setopt($curl, CURLOPT_USERPWD, "$user:$password");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);

由于

5 个答案:

答案 0 :(得分:2)

根据PHP手册中的a comment,您必须确保在正确写入文件之前关闭curl流和文件处理程序。我将复制此处的示例用于搜索目的:

<?php

$fh = fopen('/tmp/foo', 'w');
$ch = curl_init('http://example.com/foo');
curl_setopt($ch, CURLOPT_FILE, $fh);
curl_exec($ch);
curl_close($ch);

# at this point your file is not complete and corrupted

fclose($fh);

# now you can use your file;

read_file('/tmp/foo');

?>

另外,我会讨论使用CURLOPT_RETURNTRANSFER和CURLOPT_FILE的优点,因为CURLOPT_RETURNTRANSFER告诉curl返回curl_exec()的结果。如果您只是将它写入文件,则可能不需要它。

答案 1 :(得分:0)

$ dest需要是通过

打开的文件资源
$dest = fopen("filename.ext", "w");

这对你有用吗?

答案 2 :(得分:0)

这通过重定向stdout输出来修复它:2&gt;&amp; 1

这样可行: $ result = shell_exec('curl -v http://domain.com/images/dir/dir/dir/file.jpg - 用户名:密码-o /usr/www/htdocs/images/dir/dir/dir/file.jpg 2&gt;&amp; 1');

能够使用PHP curl包装器会很棒但是如果它意味着在源计算机上打开存根文件然后写入它。 curl命令行版本只是在文件上移动,漂亮而整洁。如果有人知道如何使用PHP包装器做我想做的事情,我很想知道你是怎么做的。

答案 3 :(得分:0)

    /**
*Downloads a binary file into a string
*@param string $file URL's file 
*@param string $ref  Referer
*@return string $downloaded_binary string containing the binary file
*/
function download_file($file, $ref)
{
    $curl_obj = curl_init();    
    curl_setopt($curl_obj, CURLOPT_URL, $file);
    curl_setopt($curl_obj, CURLOPT_REFERER, $ref);
        curl_setopt($curl_obj, CURLOPT_BINARYTRANSFER, 1);
        curl_setopt($curl_obj, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl_obj, CURLOPT_MAXREDIRS, SPDR_MAX_REDIR);                           
    curl_setopt($curl_obj, CURLOPT_FOLLOWLOCATION, TRUE); //followlocation cannot be used when safe_mode/open_basedir are on
    curl_setopt($curl_obj, CURLOPT_SSL_VERIFYPEER, FALSE);               
        $downloaded_binary = curl_exec($curl_obj);    

        curl_close($curl_obj);
        return $downloaded_binary;
}

答案 4 :(得分:0)

我认为这样做的方法是使用ob_start()

ob_start();
curl_exec($curl);
$result = ob_get_clean();