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

开发者社区> 问答> 正文

php用fsockopen来GET网页不成功

2016-03-09 14:11:28 1950 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抓取别人网页数据,可以存储在本地MEMCACHE里面吗?:报错

2020-06-07 21:59:38 294浏览量 回答数 1

1

回答

PHP如何读取WEB服务器上的JS文件源代码,报错

2020-06-20 21:30:31 2427浏览量 回答数 1

1

回答

PHP 读取TXT文件的相关问题,报错

2020-06-20 21:31:25 2479浏览量 回答数 1

1

回答

网站默认的首页 index.php 能访问,但是文件里面找不到这个文件。。

2018-12-13 20:25:57 751浏览量 回答数 1

1

回答

首页index.php文件没有放到htdocs文件夹根目录下 出现403错误

2018-10-12 20:49:10 1229浏览量 回答数 1

1

回答

在浏览器中打开php文件时,是Linux中的哪个用户执行的?

2017-11-30 17:36:53 1714浏览量 回答数 1

0

回答

如何通过IIS7.5和php.ini配置文件调整网站后上传文件大小限制

2017-11-02 15:04:04 2386浏览量 回答数 0

8

回答

文件存贮在阿里云的OSS,PHP怎么实现多文件打包下载?

2017-03-10 11:14:31 11930浏览量 回答数 8

1

回答

新建PHP的utf-8无dom文件,关了再打开变成ANSI了,怎么办?

2016-06-14 14:25:47 2257浏览量 回答数 1

1

回答

关于在linux中定时执行php文件的问题!

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