curl out of memory window下PHP调用curl报内存不够

 更新时间:2016年11月25日 17:38  点击:1896
本文章来给大家介绍关于在window下PHP调用curl报内存不够(curl out of memory)错误的解决办法,有碰到此类问题的朋友可参考。


今天在调用新浪微博api的时候(官网下载的sdk),发现发布图片微博的时候不成功,报错说:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4294962523 bytes) in XXXsdksinasaetv2.ex.class.php on line 396
实在想不明白啊,不就上传个图片嘛,至于需要这么大内存吗!?

开始想官网提供的sdk,如果是代码有问题肯定其他开发者也碰到了,于是乎去新浪微博开发平台找答案,怪的很没人说起(不知道是大家都没碰到这问题还是咋的)。没办法,只能请谷歌。

一查还真有点头绪了,大部分出现这个问题的都是因为:用curl请求https,由于在获取证书的时候出问题了,这帖子感觉说的还行:CURLOPT_SSL_VERIFYPEER惹得祸,感兴趣的童鞋可以去看一下。但这个不是我这的原因,不扯远了,继续解决自己的错误。

照上面的帖子行不通,继续找。

但是这个里面的一句话给提醒了我,"出问题的服务器是Windows,工作的是linux。"。这有戏啊,问题可能出在php版本或跟操作系统上,于是把代码那linux上一测试,发现还真的没问题,大喜。
于是加了个关键字"window"重新搜了一遍,还真是这样,php官网果断的出现在了搜索结果里面里面,答案就在这:http://windows.php.net/。

 

看一下自己php的版本 5.2.5,活该出问题,不勤快点升级。

不多说,不过在写文章的时候又发现了这个(使用微博api发带图片的微博,提示内存不够,这哥们可比我惨多了,估计把所得内存都加上了之后才发现有点不头,哈哈),得来的全不费功夫啊(可惜这时候问题已经被我发现了,只是还没解决)。

解决方法:简单的解决方法就是升级一下php,敬业一点的方法当然就是自己改改代码,怎么改这 是个问题,我表示我不敬业,而且都懒得去升级。

中文乱码多半是编码导致的我们只要调整一下输出编码即可解决中文乱码问题,下面我们看simplexml_load_file中文乱码解决办法。

在PHP5.0 中,simplexml_load_file()是一个很好的读取和处理XML文件的函数,但是在读取和处理中文时会出现乱码,经过研究发现,如果是中文内容,必须经过iconv编码转换,否则显示为乱码。

 代码如下 复制代码

$xml=simple_load_file('xml文件');

  foreach($xml->soft as $temp){

  echo $temp->name; //这就是软件名称了。 

  echo $temp->mem; //这就是软件说明了。

}

英文正确中文乱码,这个我估计就是编码问题了。

后来网上找到了相关文章,如核心一句

1、如果xml的encoding与文件类型不符,立刻报错
2、simplexml可以处理gbk的XML,即文件内容和encoding都为gbk(ANSI格式)
3、不管文件内容是什么,处理完了,都是UTF8.


具体方法如下:

 代码如下 复制代码

$chname = iconv('utf-8', 'gb2312', $table->param["name"]);

实现将编码为'utf-8'的XML文件内容转换为 gb2312 格式的内容。

中文编码采用gb2312格式输出。

还有一种办法本人没测试过直接摊贩页面编码转成uft8

 代码如下 复制代码

header("Content-type: text/html; charset=utf-8");
//因为wordpress默认编码是utf-8,但IE默认识别为gb2312,所以用header发一下编码
$url="http://www.111cn.net";
$xml =  simplexml_load_file($url);
//载入远程XML文件
$title=$xml->channel->title;
//根据节点获取博客标题(不循环)
echo $title."<br />";
//如果节点循环了,可以用foreach循环取出
foreach($xml->channel->item as $item){
 echo $item->title."<br />";
}
//循环取出文章标题

以前我做一个获取url的功能,当时使用的是在linux系统,结果我使用REQUEST_URI可以,但在windows中好像方法不一样了,今天我又看到这样一篇文章,现在转给各位参考。

 

php在windows IIS平台运作的时候,有些东西和在Linux apache下不太一样。

今天遇到个神奇的问题,就是用$URI=$_SERVER["REQUEST_URI"];

在linux下看到的是urlrewrite静态化以后的地址 /exy/exk/list-3/

windows下返回的是原来的地址 /exy/article.php?page=3

这时候发现windows下有个办法HTTP_X_REWRITE_URL

这个数组,linux下没有
所以代码小修改下以兼容两个平台。(更换服务器真是各种水土不服)

 代码如下 复制代码

$URI = $_SERVER["HTTP_X_REWRITE_URL"];
if($URI==null){
$URI=$_SERVER["REQUEST_URI"];
}
//print_r($_SERVER);
echo $URI;

这样就两个平台都能正确的显示了。

我们利用java把数据写入然后利用php读出,但这样利用php读出时发现了在memcache乱码问题出来了,下面我来给大家介绍memcache乱码的解决办法。

java读取php写入memcache内容

故事背景:我用java插入一条数字记录,用php读取无法正确读取。

今天发现如果使用MemCachedClient来插入一条数字,或者java的对象,那么在php调出来就是乱码。

对象可以理解,简单的数字也会乱码

 代码如下 复制代码
mcc.set("a",25);

php中出来的是乱码,同时如果采用telnet的方式来进行查询
get a

出来问号。

翻了一圈说要改类包。

最后发现个问题,如果改用字符串,那么java和php就能通用了。

 代码如下 复制代码
mcc.set("a","25″);

而且telnet 192.168.0.1 11211进入进行get也能得出正确的数字了。

本来我要对a这个值进行加法运算,觉得采用int会方便一些,居然和php读取memcache的时候有冲突。还是来回进行变量类型转换吧。

如果你也在使用java写入memcache,php读出memcache,通用一个字符串存储,就可以避免很多问题了。

不是java的类包不行。


java读取php写入memcache内容

当前需求:php将key为"my_key",value为"my_value"写入到memcache中,然后用java连接memcache读取my_key的值my_value。

php端的代码为:

 代码如下 复制代码

<?php
                $mem=new Memcache;
                $mem->connect("192.168.1.20",27688);
                $mem->set("my_key","my_value",FALSE , 86400);
                $my_v=$mem->get("my_key");
                var_dump($my_v);
               $mem->close();
?>

经检测,php写入后,用php和在memcache命令行都能获取的很好。

但是,用下面的java代码获取,却获取到null

 代码如下 复制代码

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

public class CacheReader {

static private MemCachedClient client =new MemCachedClient();
static{
   String[] servers = { "192.168.1.20:27688"};
   SockIOPool pool = SockIOPool.getInstance();
   pool.setServers(servers);
   pool.initialize();
}
public void   get(String name){
   System.out.println(client.get(name));
}
public static void main(String[] args) {
   new CacheReader().get("my_key");
}
}

一开始,我还以为是我的编码的问题,或者是某些参数设置的问题。后来,我想可能是各种memcache的客户端的寻址方式不太一样吧。几经周折,还是间接的解决了这个问题:我更换了java端的memcache的客户端,采用net.spy.memcached.MemcachedClient就可以了。代码如下:

 代码如下 复制代码

import java.io.IOException;
import java.net.InetSocketAddress;

import net.spy.memcached.MemcachedClient;

public class SpyMem {
public static void main(String[] args) {
   try {
    MemcachedClient c=new MemcachedClient(new InetSocketAddress("192.168.1.20",27688));
    System.out.println(c.get("my_key"));
    c.shutdown();
   } catch (IOException e) {
    e.printStackTrace();
   }
}
}

今天要在MySQL 存储php中json_encode格式信息,英文时没有问题,但是中文时就碰到了遇到中文时, 会变成一堆类似uxxxx信息.


1. 原因分析:

在存储到数据库时!MySQL 不会存储 unicode 字符:

MySQL 仅支持从基本的多语种平面字符 (0×0000-0xFFFF)。请尝试存储一个同义词相反:)

更新: MySQL 5.5.3 上 (其中尚未 GA), 支持补充字符如果您使用 UTF8MB4 编码。

json_encode中文的时候,会把每个中文字符encode成“uxxxx”

而存进数据库的时候,“”被屏蔽了,直接变成”uxxxx”

2. 解决问题:

知道是什么原因就好解决问题了,你可以选择其他存储方式;

或者再对症下药进一步转义””为“\”,以保留””

我们的解决方案:

1. 避免json_encode将中文转换unicode编码.

PHP5.4版本,已经给Json新增了一个选项: JSON_UNESCAPED_UNICODE。加上这个选项后,就不会自动把中文编码了。

$test = json_encode("深圳", JSON_UNESCAPED_UNICODE);

 

2. 先将中文字段urlencode,json_encode后,再用urldecode,也可以保证中文不会被转成unicode。

$test =urldecode(json_encode(array(&#039;brief&#039;=>urlencode(&#039;简介&#039;),&#039;title&#039;=>urlencode(标题)));


3. 进一步转义””为“\” 避免unicode中文前’'被mysql当成特殊字符去除

[!--infotagslink--]

相关文章