php curl函数采集网页出现乱码问题解决方法

 更新时间:2016年11月25日 17:37  点击:1624
curl乱码有两个方面的原因一个是因为我们采集页面的php页面编码与远程文档编码不致导致的,另一种可能是页面进入了gzip压缩传输导致的,那么我们要如何解决这些问题呢?

gzip压缩传输导致乱码

今天在采集京东的时候发现返回的数据是乱码,网上说可能和压缩有关,看了一下京东的头信息的确进行gzip加密,好吧,那就解压吧

 代码如下 复制代码

$return = gzdecode($return); //将return的字符进行解码

另一种解决办法

curl_setopt($ch, CURLOPT_ENCODING, 'gzip');


页面编码问题

 代码如下 复制代码

mb_convert_encoding($str, 'utf-8', 'GBK,UTF-8,ASCII');就行了

Undefined index是告诉我们变量未定义或变量申明有点问题才会告诉我们一个并不致命的warning,那么我们要如何来解决这些问题呢?下面一聚教程小编来给各位整理了一些解决warning问题的方法。

1.找到未定义变量进行处理

 代码如下 复制代码

addslashes(htmlspecialchars(isset($_POST[$str])?$_POST[$str]:''));


2.把错误给过滤掉

 代码如下 复制代码

@$page=$_GET["page"];

3.修改php.ini配置文件进行所有错误过滤

 代码如下 复制代码

error_reporting = E_ALL & ~E_NOTICE

或者
ini_set( ‘error_reporting’, E_ALL ^ E_NOTICE );

ini_set( ‘display_errors’, ’0′ );

4.在程序中直接加一个处理

 代码如下 复制代码

if (!$cfg['debug']) {
 error_reporting(0);
 ob_start('ob_gzhandler');
} else {
 error_reporting(E_ALL ^ E_NOTICE);
}

5.在php文件最开始处加如下一句代码

 代码如下 复制代码

error_reporting(0);

总结:

上面所有方法中最好的方法是方法一,这样在对程序性能上是有很好的帮助,如果你页面错误过多直接过滤掉会影响性能的哦,我以前介绍过一篇这样的文章大家可在本地搜索。

在使用php curl获取网页内容有些网站提示405 method not allowed状态码了,这个问题我分析了出问题的网站是因为ipv6而导致了,所以我们只要简单的调整一下就可以解决这个问题了,下面一起来看看吧。

1.php curl ipv4使用例子

 代码如下 复制代码

/**
 * http测试
 * 注:PHP版本5.2以上才支持CURL_IPRESOLVE_V4
 * @param $url 网站域名
 * @param $type 网站访问协议
 * @param $ipresolve 解析方式
 */
public function web_http($url,$type,$ipresolve) {
//设置Header头
$header[] = "Accept: application/json";
  $header[] = "Accept-Encoding: gzip";
$httptype = function_exists('curl_init');
if (!$httptype) {
$html = file_get_contents($url);
} else {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//输出头信息
curl_setopt($ch, CURLOPT_HEADER, 1);
//递归访问location跳转的链接,直到返回200OK
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
//不对HTML中的BODY部分进行输出
curl_setopt($ch, CURLOPT_NOBODY, 1);
//将结果以文件流的方式返回,不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//以IPv4/IPv6的方式访问
if($ipresolve=='ipv6') {
curl_setopt($ch,CURLOPT_IPRESOLVE,CURL_IPRESOLVE_V6);
}else{
curl_setopt($ch,CURLOPT_IPRESOLVE,CURL_IPRESOLVE_V4);
}
//添加HTTP header头采用压缩和GET方式请求
curl_setopt( $ch, CURLOPT_HTTPHEADER, $header );
curl_setopt($ch,CURLOPT_ENCODING , "gzip");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
//清除DNS缓存
curl_setopt($ch,CURLOPT_DNS_CACHE_TIMEOUT,0);
//设置连接超时时间
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,15);
//设置访问超时
curl_setopt($ch,CURLOPT_TIMEOUT,50);
//设置User-agent
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11');
if($type=="https") {
//不对认证证书来源的检查
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//从证书中检查SSL加密算法是否存在 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
}
//执行Curl操作
$html = curl_exec($ch);
//获取一个cURL连接资源句柄的信息(获取最后一次传输的相关信息)
$info = curl_getinfo($ch);
curl_close($ch);
}
return $info;
}

上面代码在ipv4是没有任何问题了,如果在了ipv6网站就会返回405 method not allowed状态码了,那么我们查看了php手册发现只要简单的修改一下即可。

以上为我编写的一个基本curl访问的方法,因为我这里需要通过使用IPv6的方式,所以加了相应的选项,相信大家能看的明白,平时经常用到的选项上面都有出现,大家根据需要摘取。

405/Method Not Allowed,表示不支持请求的方法,这个错误不常见。

导致403错误是要是由于curl默认是用post方式进行提交访问的,post方式在此域名下是没有权限的,如我在测试www.111cn.net的时候就出现了此问题,在我修改为get的方式,并且增加了header头后,即可正常访问,个人推测,或许是亚马逊那边基本上都是采用get的方式,才会被认为是人为的点击,对post做了相应屏蔽。

ipv6增加了如下代码:

 代码如下 复制代码

//设置Header头
$header[] = "Accept: application/json";
$header[] = "Accept-Encoding: gzip";
//添加HTTP header头采用压缩和GET方式请求
curl_setopt( $ch, CURLOPT_HTTPHEADER, $header );
curl_setopt($ch,CURLOPT_ENCODING , "gzip");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

命令行的形式为:


curl -v www.111cn.net


IPV6下curl超时问题

 代码如下 复制代码

<?php

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
//设置curl默认访问为IPv4
if(defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')){
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
}
//设置curl请求连接时的最长秒数,如果设置为0,则无限
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
//设置curl总执行动作的最长秒数,如果设置为0,则无限
curl_setopt ($ch, CURLOPT_TIMEOUT,$timeout*3);
$file_contents = curl_exec($ch);
curl_close($ch);

 
注:curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4) 只有在php版本5.3及以上版本,curl版本7.10.8及以上版本时,以上设置才生效。

phpmyadmin中显示中文是如下图乱码,但是我们利用php连接mysql数据库之后发现并没有这个问题,那么问题原因就是我们数据库内容没问题只存在了phpmyadmin编码设置问题了,下面来简单的介绍问题解决方法吧。

phpmyadmin界面乱码

效果如我们的中文表都是乱码了(注意:我使用的是国外的linux空间了,使用国内的没问题)

 

phpmyadmin中中文乱码 英文没问题(但在网页显示正常)

出现这个问题我们一可以不使用国外主机现成的phpmyadmin了,我们自己下载一个phpmyadmin上传上去,这样一般可以解决问题,如果不行我们参考下面办法

phpmyadmin乱码解决

1. 因为MySQL的默认编码是latin1,所以首先我们需要修改一下PHPMyAdmin的编码转换。修改libraries目录下面的select_lang.lib.php文件,将

 代码如下 复制代码
[indent]
'utf-8' => 'utf8',
修改成
'utf-8' => 'latin1',
[/indent]


2. 接下来还要修改一下页面的编码显示,将

 代码如下 复制代码
[indent]
'zh-gb2312' => array('zh|chinese simplified', 'chinese_simplified-gb2312', 'zh'),
修改成
'zh-gb2312-utf-8' => array('zh|chinese simplified', 'chinese_simplified-gb2312', 'zh'),
[/indent]

也就是在zh-gb2312后面增加-utf-8,这样页面编码就支持UTF-8了。

3. 首先选择zh-gb2312-utf-8进入PHPMyAdmin,这个时候浏览GB2312编码的数据正常,但是浏览UTF-8的数据是乱码。如果浏览UTF-8的数据的话,进入首页,然后在Language里面选择zh-utf-8就可以了

php页面中文乱码

如果是程序页面错误我们可参考一面方法

数据库中,所有表和有中文的字段指定使用编码:utf8_unicode_ci,注意表和字段都需要指定!

:数据库连接的时候指定编码:

 代码如下 复制代码

mysqli_query($db_conn, "SET NAMES utf8");//指定脚本到数据库的编码

mysqli_query($db_conn, "set character_set_client=utf8"); //指定mysql内部的数据到磁盘编码

mysqli_query($db_conn, "set character_set_connection=utf8");//指定mysql的连接层编码

mysqli_query($db_conn, "set character_set_results=utf8");//指定mysql查询磁盘到数据结果的编码

这样页面问题也就解决了

下面是一个朋友在使用yii时碰到PHP warning Illegal offset type错误问题的解决办法,有需要的朋友参考一下。

一句话,错在用对象作为数组的键。比如说,以下代码就会引发这个warning:

 代码如下 复制代码

$arr = array();
  
class a
  
{
  
}
  
$o = new a;
  
echo $arr[$o];


具体说来,我是在做Yii多语言站点的时候触发这个warning的,我写了一句:

 代码如下 复制代码

Yii::app()->language = Yii::app()->request->cookies['lang'];


在下面一句报错:
 代码如下 复制代码

$this->_files[$category][$language]=$this->basePath.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.$category.'.php';
124         }


Yii::app()->language = Yii::app()->request->cookies['lang']->value;

代码如下

PHP warning Illegal offset type错误解决办法

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • 总结android studio注意事项及打不开等问题解决方法

    经过一段时间的使用,总结了android studio打不开等问题的6种解决方法及android studio注意事项,希望对大家有所帮助。 1 首次运行,建立好项目需要下载一些东西,如果...2016-09-20
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31