如何为PHP CURL中的PROGRESSFUNCTION设置触发间隔?
如何为PHP CURL中的PROGRESSFUNCTION设置触发间隔?
嘿,这个问题我之前也踩过坑!CURL本身并没有提供直接设置PROGRESSFUNCTION触发间隔的参数,但我们完全可以自己在回调函数里加个简单的时间判断来实现,操作起来很直观。
核心思路就是记录上一次执行进度逻辑的时间,每次回调触发时先判断当前时间和上次的时间差是否达到你想要的间隔,只有满足条件时才执行你的进度处理代码。具体实现可以这样做:
- 首先在回调函数里用一个
static变量来存储上一次触发的时间(static变量能在函数多次调用之间保留值,不会每次都重置) - 每次回调时获取当前的精确时间戳,计算和上次的时间差
- 当时间差大于等于你设定的间隔(比如1秒、0.5秒)时,才执行进度相关的逻辑,同时更新上一次触发的时间
给你个实际的代码例子参考:
function progress_upload($resource, $download_size, $downloaded, $upload_size, $uploaded) { // 这里设置你想要的触发间隔,单位是秒(比如0.5就是半秒触发一次) $trigger_interval = 1; // 用static变量保存上一次执行进度逻辑的时间 static $last_exec_time = 0; $current_time = microtime(true); // 检查时间差是否达到间隔要求 if ($current_time - $last_exec_time >= $trigger_interval) { // 这里写你原本要处理的进度逻辑,比如输出上传进度 echo "上传进度:" . round(($uploaded / $upload_size) * 100, 2) . "%\n"; // 更新最后一次执行的时间 $last_exec_time = $current_time; } } // 你的CURL初始化代码 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "你的上传目标地址"); curl_setopt($ch, CURLOPT_POST, true); // 其他CURL选项... curl_setopt($ch, CURLOPT_NOPROGRESS, 0); curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress_upload'); // 执行CURL请求 curl_exec($ch); curl_close($ch);
这样一来,哪怕CURL每秒触发几十次回调,我们的进度逻辑只会按照你设定的间隔执行,完美解决触发太频繁的问题~
备注:内容来源于stack exchange,提问作者Max Amini
相关产品推荐
相关产品推荐

