zoukankan      html  css  js  c++  java
  • PHP函数:fsockopen简介

     

       

    打开网络的 Socket 链接。  
    语法: resuce fsockopen(string hostname, int port, int [errno], string [errstr], int [timeout]);
    返回值: 资源;
    函数种类: 网络系统;
    内容说明:
      目前这个函数提供两个 Socket 资料流界面,分别为 Internet 用的 AF_INET 及 Unix 用的 AF_UNIX。
     

       在 Internet 中,参数 hostname 及 port 分别代表网址及端口号。
        在 UNIX 中,参数hostname 表示到 socket 的路径,port 配置为 0。timeout可省略表示多久没有连
        上就中断。该函数返回文件指针,供文件函数使用,包括 fgets()、fgetss()、fputs()、fclose()
        feof()。参数 errno 及 errstr 可省略,做错误处理使用。该函数使用阻塞模式 (blocking mode) 处理,
        可用 set_socket_blocking() 转换成无阻塞模式。

    实例:
       <?php
          $fp = fsockopen("php.wilson.gs", 80, &$errno, &$errstr, 10);
          if(!$fp) {
              echo "$errstr ($errno)<br> ";
          } else {
              fputs($fp,"GET / HTTP/1.0 Host: php.wilson.gs ");
              while(!feof($fp)) {
                  echo fgets($fp,128);
              }
              fclose($fp);
          }
      ?>
    备注:fputs() 函数写入文件(可安全用于二进制文件)。fputs() 函数是 fwrite() 函数的别名。

    fsockopen() — Open Internet or Unix domain socket connection

    一、如何禁用fsockopen()
    下面是两种常用的禁用fsockopen的方法。
    1、修改php.ini,将 disable_functions = 后加入 fsockopen
    2、修改php.ini,将 allow_url_fopen = On 改为 allow_url_fopen = Off

    二、如何解决fsockopen函数被禁用
    1、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。
    具体操作:搜索程序中的字符串 fsockopen( 替换为 pfsockopen(。示例如下
    修改前:
    $fp = fsockopen($host, 80, $errno, $errstr, 30);

    修改后:
    $fp = pfsockopen($host, 80, $errno, $errstr, 30);
    2、如果服务器同时禁用了pfsockopen,那么用其他函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数不同。
    具体操作:搜索程序中的字符串 fsockopen( 替换为 stream_socket_client(,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。示例如下
    修改前:
    $fp = fsockopen($host, 80, $errno, $errstr, 30);

    修改后
    $fp = stream_socket_client($host."80", $errno, $errstr, 30);
    3、如果PHP版本低于5.0,fsockopen被禁用,又没有stream_socket_client()怎么办呢?自己写一个函数实现fsockopen的功能,参考代码:
    function b_fsockopen($host, $port, &$errno, &$errstr, $timeout) {
     $ip = gethostbyname($host);
     $s = socket_create(AF_INET, SOCK_STREAM, 0);
     if (socket_set_nonblock($s)) {
      $r = @socket_connect($s, $ip, $port);
      if ($r || socket_last_error() == EINPROGRESS) {
       $errno = EINPROGRESS;
       return $s;
      }
     }
     $errno = socket_last_error($s);
     $errstr = socket_strerror($errno);
     socket_close($s);
     return false;
    }

    具体操作:1.首先找到使用fsockopen函数的代码段,将上面代码加至其上端,搜索该代码段中的字符串fsockopen( 替换为 b_fsockopen(。
    2.因为fsockopen函数返回文件指针所以可以被文件函数操作,但是这个b_fsockopen函数没能返回文件指针,需要继续修改代码段:用socket_read(替换掉 fread(,用socket_write(替换掉fwrite(,用socket_close(替换掉fclose(。

  • 相关阅读:
    (转)Java线程:线程的同步与锁
    (转)线程栈模型与线程的变量、线程状态转换
    (转)概念与原理
    Oracle 技术支持之现场优化的思维路径
    oracle复合索引的选择和使用
    oracle中sql执行性能关注点
    oracle中位图索引和B-tree索引的区别
    oracle锁表
    oracle索引的理解
    oracle海量数据中提升创建索引的速度
  • 原文地址:https://www.cnblogs.com/lemon66/p/4102727.html
Copyright © 2011-2022 走看看