当前位置 主页 > 服务器问题 > Linux/apache问题 >

    php 调用远程url的六种方法小结(4)

    栏目:Linux/apache问题 时间:2019-10-16 09:30


    //$reg = '/^(down.*?\.html|\d+_\d+\.htm.*?)$/i';
    $rex = "/([hH][rR][eE][Ff])\s*=\s*['\"]*([^>'\"\s]+)[\"'>]*\s*/i";
    $reg = '/^(down.*?\.html)$/i';
    preg_match_all ($rex, $file_contents, $r);
    $result = ""; //array();
    foreach($r as $c){
    if (is_array($c)){
    foreach($c as $d){
    if (preg_match($reg, $d)){ $result .= $host_url . $d."\n"; }
    }
    }
    }
    return $result;
    }

    //获取指定内容中的多媒体文件
    function get_content_object($str, $split="|--:**:--|"){
    $regx = "/href\s*=\s*['\"]*([^>'\"\s]+)[\"'>]*\s*(<b>.*?<\/b>)/i";
    preg_match_all($regx, $str, $result);

    if (count($result) == 3){
    $result[2] = str_replace("<b>多媒体: ", "", $result[2]);
    $result[2] = str_replace("</b>", "", $result[2]);
    $result = $result[1][0] . $split .$result[2][0] . "\n";
    }
    return $result;
    }

    ?>

    ======================================================

    同一域名对应多个IP时,PHP获取远程网页内容的函数

    fgc就是简单的读取过来,把一切操作封装了
    fopen也进行了一些封装,但是需要你循环读取得到所有数据。
    fsockopen这是直板板的socket操作。
    如果仅仅是读取一个html页面,fgc更好。
    如果公司是通过防火墙上网,一 般的file_get_content函数就不行了。当然,通过一些socket操作,直接向proxy写http请求也是可以的,但是比较麻烦。
    如果你能确认文件很小,可以任选以上两种方式fopen ,join('',file($file));。比如,你只操作小于1k的文件,那最好还是用file_get_contents吧。

    如果确定文件很大,或者不能确定文件的大小,那就最好使用文件流了。fopen一个1K的文件和fopen一个1G的文件没什么明显的区别。内容长,就可以花更长的时间去读,而不是让脚本死掉。

    ----------------------------------------------------
    http://www.phpcake.cn/archives/tag/fsockopen
    PHP获取远程网页内容有多种方式,例如用自带的file_get_contents、fopen等函数。

    <?php

    echo file_get_contents("http://img.jb51.net/abc.php");
    ?>
     但是,在DNS轮询等负载均衡中,同一域名,可能对应多台服务器,多个IP。假设img.jb51.net被DNS解析到 72.249.146.213、72.249.146.214、72.249.146.215三个IP,用户每次访问img.jb51.net,系统会根据负载均衡的相应算法访问其中的一台服务器。
      上周做一个视频项目时,就碰到这样一类需求:需要依次访问每台服务器上的一个PHP接口程序(假设为abc.php),查询这台服务器的传输状态。

      这时就不能直接用file_get_contents访问http://img.jb51.net/abc.php了,因为它可能一直重复访问某一台服务器。

      而采用依次访问http://72.249.146.213/abc.php、http://72.249.146.214/abc.php、http://72.249.146.215/abc.php的方法,在这三台服务器上的Web Server配有多个虚拟主机时,也是不行的。

      通过设置本地hosts也不行,因为hosts不能设置多个IP对应同一个域名。

      那就只有通过PHP和HTTP协议来实现:访问abc.php时,在header头中加上img.jb51.net域名。于是,我写了下面这个PHP函数:
    复制代码 代码如下:
    <?php

    /************************
    * 函数用途:同一域名对应多个IP时,获取指定服务器的远程网页内容
    * 创建时间:2008-12-09
    * 创建人:张宴(img.jb51.net)
    * 参数说明:
    * $ip 服务器的IP地址