php用fsockopen来GET网页不成功-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

php用fsockopen来GET网页不成功

2016-03-09 14:11:28 1984 1

代码:

<?php
class Http {
const CRLF = " ";
protected $fp = null;
protected $errno = -1;
protected $errstr = 'error';
protected $fenxi = array();
protected $method = '';
protected $out = '';
//我觉得不需要下面两个
protected $lineone = array();
protected $linetwo = array();
public function __construct($url) {
$this->conn($url);
//$this->same($this->method);
}
public function __destruct() {
$this->close();
}
public function conn($url) {
$this->fenxi = parse_url($url);
if (empty($this->fenxi['port'])) {
$this->fenxi['port'] = 80;
}
$this->fp = fsockopen($this->fenxi['host'], $this->fenxi['port'], $this->errno, $this->errstr, 3);
if (!$this->fp) {
echo $this->errstr;
}
}
public function same($method) {
$this->lineone[0] = $method . ' ' . $this->fenxi['path'] . ' ' . 'HTTP/1.1';
$this->linetwo[0] = 'Host:' . ' ' . $this->fenxi['host'];
$arr = array_merge($this->lineone, $this->linetwo);
$string = implode(self::CRLF, $arr);
if ($method == 'GET') {
$this->get($string);
} elseif ($method == 'POST') {
$this->post($string);
} else {
echo "method error";
exit;
}
}
public function get($str) {
//如果还要写别的东西 写在下面拼接
//这里直接处理$str
fwrite($this->fp, $str);
while (!feof($this->fp)) {
$this->out .= fread($this->fp, 1024);
echo "ok";exit;
}
$this->show();
}
public function post($str) {
}
public function close() {
fclose($this->fp);
}
public function show() {
echo $this->out;
}
}
$test = new Http('http://news.163.com/13/0613/09/9187CJ4C00014JB6.html');
$test->same('GET');
?>
PHP
取消 提交回答
全部回答(1)
  • 小旋风柴进
    2019-07-17 18:56:04

    要把http相关协议参数补齐,还有最后面要加两个换行。另外get代码里read了第一次后就exit了,所以没有调用show()。下面是改后的代码。

         public function same($method) {
            $string = implode(self::CRLF, 
                [$method . ' ' . $this->fenxi['path'] . ' ' . 'HTTP/1.1',
                 'Host:' . $this->fenxi['host'],
                 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
                 'Connection:close',
                 '',
                 ''
                ]);
            echo $string;
            if ($method == 'GET') {
                $this->get($string);
            } elseif ($method == 'POST') {
                $this->post($string);
            } else {
                echo "method error";
                exit;
            }
        }
    
        public function get($str) {
            //如果还要写别的东西 写在下面拼接
            var_dump($this->fp);
            //这里直接处理$str
            $result = fwrite($this->fp, $str);
    
            while (!feof($this->fp)) {
                $read = fread($this->fp, 1024);
                $this->out .= $read;
            }
            $this->show();
        }

    上面的参数主要是针对GET的,如果是POST方式,要增加相应的Content-Type和Content-Length协议参数

    0 0
相关问答

1

回答

网页中一段php报错,不知道原因求解答?报错

2020-06-20 16:44:11 271浏览量 回答数 1

6

回答

linux wdcp升级PHP、MySql、Zend 7安装memcache支持DiscuzX3.2

2015-12-06 11:34:22 11771浏览量 回答数 6

4

回答

请问有没有ECS 的win2003 32位 一键安装IIS PHP mysql的安装包

2015-11-14 13:33:28 4881浏览量 回答数 4

1

回答

ECSWINDOWS2012配置好PHP环境,mysql客户端连接出现如下错误

2015-10-23 13:41:05 5196浏览量 回答数 1

2

回答

ECSWINDOWS2012配置好PHP环境,mysql客户端连接出现如下错误

2015-10-23 13:30:20 4643浏览量 回答数 2

2

回答

PHP,mysql怎么样能导出excel文件,本地测试正常,上传后就不正常了

2015-09-27 14:48:18 4627浏览量 回答数 2

3

回答

救命啊……centos7开机启动nginx、php、ftp、mysql怎么设置?

2015-09-17 14:41:55 8222浏览量 回答数 3

1

回答

在Debian 7系统安装 nginx + php + mysql 基本环境(译)

2015-08-31 13:59:00 8038浏览量 回答数 1

2

回答

在CentOS 6系统上安装php 5.4和mysql 5.5

2015-08-26 22:41:46 10015浏览量 回答数 2

1

回答

php针对mysql的常用操作

2015-07-20 10:50:39 7570浏览量 回答数 1
2709
文章
6591
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载