【问题标题】:capturing curl stdout into variable in PHP将 curl 标准输出捕获到 PHP 中的变量中
【发布时间】:2009-12-04 16:45:30
【问题描述】:

任务

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

这可行,但我无法捕获 curl 标准输出输出

$result = shell_exec('curl -v http://domain.com/images/dir/dir/dir/file.jpg --user 用户名:密码 -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);

谢谢

【问题讨论】:

  • 你真的必须使用 curl 吗?你可以直接打开网址。

标签: php ftp curl


【解决方案1】:

根据 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
【解决方案2】:

$dest 需要是通过

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

这对你有用吗?

【讨论】:

  • 可能会起作用,但是我想避免创建存根文件然后写入它。我确定我的“...CURLOPT_FILE”行不正确,因为源计算机上不存在该文件
【解决方案3】:

这通过重定向标准输出来修复它:2>&1

所以这行得通: $result = shell_exec('curl -v http://domain.com/images/dir/dir/dir/file.jpg --user 用户名:密码 -o /usr/www/htdocs/images/dir/dir/dir/file.jpg 2>&1');

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

【讨论】:

    【解决方案4】:
        /**
    *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;
    }
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        最近更新 更多