захватить curl stdout в переменную в PHP - PullRequest
2 голосов
/ 04 декабря 2009

Задача

Загрузка двоичных файлов с удаленного сервера обработки мультимедиа на веб-сервер.

Это работает, но я не могу перехватить вывод curl stdout

$ result = shell_exec ('curl -v http://domain.com/images/dir/dir/dir/file.jpg - имя пользователя пользователя: пароль -o /usr/www/htdocs/images/dir/dir/dir/file.jpg');

Примечание: Мне не повезло с использованием методов PHP curl wrapper для этой задачи, отчасти потому, что я никогда не использовал PHP curl wrappers для загрузки по 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 ]

2 голосов
/ 04 декабря 2009

Согласно комментарию в руководстве по PHP, вы должны быть уверены, что закрыли свой поток 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 (). Возможно, вам это не нужно, если вы просто записываете его в файл.

0 голосов
/ 22 августа 2013

Я думаю, что способ сделать это с помощью ob_start () .

ob_start();
curl_exec($curl);
$result = ob_get_clean();
0 голосов
/ 04 декабря 2009
    /**
*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;
}
0 голосов
/ 04 декабря 2009

Это исправлено путем перенаправления вывода stdout: 2> & 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> & 1');

Было бы замечательно иметь возможность использовать PHP curl-оболочки, но только если это означает открытие заглушки на исходном компьютере и последующую запись в нее. Версия командной строки curl просто перемещается по файлу, красиво и аккуратно. Если кто-нибудь знает, как делать то, что я пытаюсь сделать, используя PHP-обертки, я хотел бы посмотреть, как вы это делаете.

0 голосов
/ 04 декабря 2009

$ dest должен быть файловым ресурсом, открытым через

$dest = fopen("filename.ext", "w");

это у вас работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...