首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cURL中由popen()和fread()执行的实时命令输出

cURL中由popen()和fread()执行的实时命令输出
EN

Stack Overflow用户
提问于 2016-08-03 23:12:18
回答 1查看 609关注 0票数 0

我正在为我们技术团队的一部分构建一个内部工具套件,涉及到在世界各地的一组远程服务器上运行命令。我遇到了一个小问题,但我想不出一个容易解决的办法。以下是工具集这一特定部分的处理过程:

  • 主服务器上的Web表单、用户输入类型的检查和主机名/IP
  • 将输入变量提交到主服务器上的PHP,该脚本将URL构建为cURL,并将其针对远程服务器(本例中仅限于一个远程服务器)并回显其输出。
  • 远程服务器接收带有变量的PHP脚本的web请求,运行适合请求的linux shell命令,并通过cURL将其输出返回给主服务器。

所以,这一切都很好,但我决定使用traceroute和ping工具,并让它们通过使用popen()和fread()实时输出浏览器的进度,示例如下:

代码语言:javascript
复制
#Get the variables
$type = $_GET['type'];
$hostname = $_GET['host'];

#Start switch to decide what to do
switch ($type) {
  case "trace":
      $cmd = "traceroute $hostname";
      while (@ ob_end_flush());
      $proc = popen($cmd, 'r');
      echo "<pre>";
      while (!feof($proc))
        {
          echo fread($proc, 4096);
          @ flush();
        }
      echo "</pre>";
    break;
  case "ping":
      $cmd = "ping -c 5 " . $hostname;
      while (@ ob_end_flush());
      $proc = popen($cmd, 'r');
      echo "<pre>";
      while (!feof($proc))
        {
          echo fread($proc, 4096);
          @ flush();
        }
      echo "</pre>";
   break;
}

当直接针对远程服务器在浏览器中运行时,上面的操作很好。但是,当然,从主服务器上卷曲它不会返回实时输出,它只是在到达断点时返回完成的输出。这是令人沮丧的,因为会有5-10个这样的东西同时运行在一个页面上,而且像跟踪器这样的东西,我真的不想等到30跳超时,然后用户才能得到它的任何输出。

所以我的问题是..。我怎样才能让cURL模仿上面的popen和fread这样的实时PHP输出?cURL甚至可以这样做吗?我是否可以使用另一个PHP函数从远程URL获得实时输出,直到它中断?

EN

回答 1

Stack Overflow用户

发布于 2016-08-04 09:10:18

可以,通过CURLOPT_PROGRESSFUNCTION / CURLOPT_WRITEFUNCTION..。未经测试,但我认为会出现这样的情况:

代码语言:javascript
复制
$ch=curl_init();
$buffer='';//your download buffer goes here.
function progressfunc($ch,$totalDownloadSize,$bytesDownloaded,$totalRequestSize,$bytesUploaded){
    global $buffer;
    echo $buffer;
    $buffer='';
    //echo str_repeat('<span></span>',100);//if you have buffering issues, this is an ugly workaround...
    flush();
};
function writefunc($ch,$data){
    global $buffer;
    static $written=0;
    $buffer.=$data;
    $written+=strlen($data);
    return $written;
};
if(!curl_setopt_array($ch,array(
CURLOPT_WRITEFUNCTION=>'writefunc',
CURLOPT_PROGRESSFUNCTION=>'progressfunc',
CURLOPT_URL=>'slow_download'
))){
    throw new RuntimeException('curl_setopt_array error. errno:'.curl_errno($ch).' error:'.curl_error($ch));
}
curl_exec($ch);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38755083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档