我想要正确理解CURLOPT_READFUNCTION。
我正在研究Rackspace coudfiles php代码(REST API)。
它有以下几行。
curl_setopt($ch, CURLOPT_READFUNCTION, array(&$this, '_read_cb'));
看看这个功能的定义:
private function _read_cb($ch, $fd, $length)
{
$data = fread($fd, $length);
$len = strlen($data);
if (isset($this->_user_write_progress_callback_func)) {
call_user_func($this->_user_write_progress_callback_func, $len);
}
return $data;
}
你能帮我理解传递给$ fd和$ length的值是什么吗?
我想具体指定$ length值,以块的形式发送文件。
提前致谢。
答案 0 :(得分:5)
我知道这有点像死灵蛋白 - 但其他人可能想知道这是如何运作的。
以下是典型的curl文件put块的外观:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $ret['Location']);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_READFUNCTION, 'curlPutThrottle');
curl_setopt($ch, CURLOPT_INFILE, $fh);
curl_setopt($ch, CURLOPT_INFILESIZE, $size);
$ret = curl_exec($ch);
并且read函数看起来像这样(这个限制为用户定义的$ goal速度并给出CLI显示反馈)
function curlPutThrottle($ch, $fh, $length = false)
{
global $size;
global $current;
global $throttle;
global $start;
/** Set your max upload speed - here 30mB / minute **/
$goal = (300*1024*1024)/(60*10);
if (!$length)
{
$length = 1024 * 1024;
}
if (!is_resource($fh))
{
return 0;
}
$current += $length;
if ($current > $throttle) /** Every meg uploaded we update the display and throttle a bit to reach target speed **/
{
$pct = round($current/$size*100);
$disp = "Uploading (".$pct."%) - ".number_format($current, 0).'/'.number_format($size, 0);
echo "\r ".$disp.str_repeat(" ", strlen($disp));
$throttle += 1024*1024;
$elapsed = time() - $start;
$expectedUpload = $goal * $elapsed;
if ($current > $expectedUpload)
{
$sleep = ($current - $expectedUpload) / $goal;
$sleep = round($sleep);
for ($i = 1; $i <= $sleep; $i++)
{
echo "\r Throttling for ".($sleep - $i + 1)." Seconds - ".$disp;
sleep(1);
}
echo "\r ".$disp.str_repeat(" ", strlen($disp));
}
}
if ($current > $size)
{
echo "\n";
}
return fread($fh, $length);
}
其中:
它返回$ length长度文件中的数据,如果是EOF则返回'。
答案 1 :(得分:3)
此处manual似乎有误:
CURLOPT_READFUNCTION
a的名字 回调函数所在的回调函数 函数有两个参数。该 首先是cURL资源,然后是 second是一个包含数据的字符串 读。必须使用读取数据 这个回调函数。归还 读取的字节数。返回0到 信号EOF。
实际上需要三个参数(参见source code):
CURLOPT_INFILE
设置的PHP流。编辑:已修复此commit。