PHP session_start()很慢问题分析与解决办法
最近在做东西的时候发现一个问题
有一个接口挂了 ,然后进行测试访问地址的时候,浏览器就一直处于等待响应的状态
怎么访问都不行,只有重启web服务器才行。
如果不重启web服务器进行代码调试,总发现在session_start()的时候就不能进行下去了
问题原因后来终于明白了:
因为浏览器发送的请求还是在web服务器中建立了线程进行了请求的处理,由于session是在服务器端存储
而浏览器处于等待响应的状态就是表明了web服务器正在处理你的请求,但是由于响应超时时间很长,你也许进行了下一次的调试。
在上一个请求还未死亡之前,它一直占用着你的session资源,而session资源是不能共享的,你再次请求的就一直会在等待session资源的获取。
也就是说只有等你上一个请求结束的时候你才能正常获取session资源并且进入代码的解析
以前发现PHP页面调用session_start()方法时很慢,甚至会用上几十秒钟,现在终于发现原因。
解决办法
因为session使用文件,多个请求时会锁住Session文件,尽量在不用Session时尽早释放Session.
使用 session_write_close() 方法
例如
代码如下 | 复制代码 |
session_start(); //starts the session |
百度查证后得知
PHP生成UTF-8编码的CSV文件用Excel打开中文显示乱码,是由于输出的CSV文件中没有BOM。
我们只要简单处理一下即可
那么如何在PHP中输出BOM呢?
在所有内容输出之前
代码如下 | 复制代码 |
print(chr(0xEF).chr(0xBB).chr(0xBF)); |
例.php生成csv时我们可以这样
代码如下 | 复制代码 |
<?php |
还有一种办法就是使用Office
打开Microsoft Office 2010 Excel,数据-自文本,如图:
导入此csv格式文件,同样要求选择编码,如图:
这里选择UTF-8,打开后,发现乱码消除,如图:
补:UTF-8是在互联网上使用最广的一种unicode编码的实现方式。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度
如果你使用的是apache或者linux系统那么url中文乱码这个问题是很常见事情,下面小编来给大家介绍一下php中url传递中文乱码问题解决办法,希望此方法对各位同学有帮助哦。在使用 ?id=”中文” 传递中文参数时,出现了乱码,这是经过了二次转码后的结果,其中,在 php 中,url 中是不可以直接传输中文的,对于这点,一直心存不满,没办法呀,谁让咱没一套解决方案呢,不知道别的语言是不是也出现这样的问题。
对于网上所说的在首页添加 header(“content-type:text/html;charset=utf-8″); 这样的代码,以及把数据库页面等等设置成 utf8 的解决方案根本无效,始终传递过来的中文是乱码。
尽管所有 04ie.com站点PHP 我都是用的统一的 utf8 编码,但始终传递过去是乱码,后来测试了几个浏览器,发现 360 可以传递过去,而 IE 不行,后来再使用 $msg = iconv(‘gbk’,'utf-8′,$_GET["msg"]); 进行转换,测试几个浏览器后,大多还是显示乱码的问题。
最后总结了一点,对于 GET[] 过去的值,url 中不可以直接传输中文,如果必须要传输的话,用 urlencode() 方法来处理中文。对于 POST[] 不知道怎么样,暂时还没有做过实验。
再来PHP手册上查下urlencode()的使用:
urlencode() 本函数将字符串以 URL 编码。例如空格就会变成加号。Homepage 中 form 资料传送就是用 urlencode 编码后再送出
原来如此,我说呢为什么从form表单提交过来的就没有问题,但是url传递过来的就乱码
本工具分别实现两种方式的Encode与Decode:
中文 -> GB2312的Encode -> %D6%D0%CE%C4
中文 -> UTF-8的Encode -> %E4%B8%AD%E6%96%87
Html中的URLEncode:
编码为GB2312的html文件中:/中文.rar -> 浏览器自动转换为 -> /%D6%D0%CE%C4.rar
注意:Firefox对GB2312的Encode的中文URL支持不好,因为它默认是UTF-8编码发送URL的,但是ftp://协议可以,我试过了,我认为这应该算是Firefox一个bug。
编码为UTF-8的html文件中:/中文.rar -> 浏览器自动转换为 -> /%E4%B8%AD%E6%96%87.rar
PHP中的URLEncode:
代码如下 | 复制代码 |
<?php //GB2312的Encode echo urlencode("中文-_. ")."n"; //%D6%D0%CE%C4-_.+ echo urldecode("%D6%D0%CE%C4-_. ")."n"; //中文-_. echo rawurlencode("中文-_. ")."n"; //%D6%D0%CE%C4-_.%20 echo rawurldecode("%D6%D0%CE%C4-_. ")."n"; //中文-_. ?> |
除了“-_.”之外的所有非字母数字字符都将被替换成百分号“%”后跟两位十六进制数。
urlencode和rawurlencode的区别:urlencode将空格编码为加号“+”,rawurlencode将空格编码为加号“%20”。
如果要使用UTF-8的Encode,有两种方法:
一、将文件存为UTF-8文件,直接使用urlencode、rawurlencode即可。
二、使用mb_convert_encoding函数:
代码如下 | 复制代码 |
<?php $url = '/中文.rar'; echo urlencode(mb_convert_encoding($url, 'utf-8', 'gb2312'))."n"; echo rawurlencode(mb_convert_encoding($url, 'utf-8', 'gb2312'))."n"; //http%3A%2F%2Fs.%2F%E4%B8%AD%E6%96%87.rar ?> |
实例:
代码如下 | 复制代码 |
<?php function parseurl($url="") { $url = rawurlencode(mb_convert_encoding($url, 'gb2312', 'utf-8')); $a = array("%3A", "%2F", "%40"); $b = array(":", "/", "@"); $url = str_replace($a, $b, $url); return $url; } $url="ftp://ud03:password@s./中文/中文.rar"; echo parseurl($url); //ftp://ud03:password@s./%D6%D0%CE%C4/%D6%D0%CE%C4.rar ?> |
JavaScript中的URLEncode:
如:%E4%B8%AD%E6%96%87-_.%20%E4%B8%AD%E6%96%87-_.%20
encodeURI不对下列字符进行编码:“:”、“/”、“;”、“?”、“@”等特殊字符。
如:/%E4%B8%AD%E6%96%87.rarhttp%3A%2F%2Fs.%2F%E4%B8%AD%E6%96%87.rar
看来也只有用 urlencode() 方法来处理中文了,在传递之前要先进行编码,传递过去之后再进行解决就可以了,那么利用如下两个函数:编码:”.urlencode(‘中文’).”,解码:”.urldecode(‘中文’).”,括号里的中文就是传递的字符了。
如下:传递页面先进行04ie.com编码:td.php?id=”.urlencode(‘中文’).”,接受页面进行解码即可:urldecode(id).”。
后来附一个函数
代码如下 | 复制代码 |
|
在一台处理网络支付的服务器迁移的时候,发现不能支付。
1.PHP版本为5.3.3
2.系统为Red Hat 4.1.2-54
查看apache的错误日志,发现是加密文件中一个函数bcmul()报错:
PHP Fatal error: Call to undefined function bcmul() in /php_rsa.php on line xxx
这个函数是PHP数学扩展中的一个。使用 bcscale() 来设置全局默认的小数位数,具体用法如下:
<?php
echo bcmul('1.34747474747', '35', 3); // 47.161
echo bcmul('2', '4'); // 8
?>
解决:
使用如下命令:
yum install php-bcmath
就安装好了。
如果出现下面这种情况:
Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.yun-idc.com * extras: mirrors.yun-idc.com * rpmforge: ftp.riken.jp * updates: mirrors.yun-idc.com Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package php-bcmath.x86_64 0:5.1.6-40.el5_9 set to be updated --> Processing Dependency: php-common = 5.1.6-40.el5_9 for package: php-bcmath --> Running transaction check ---> Package php-common.x86_64 0:5.1.6-40.el5_9 set to be updated --> Processing Conflict: php53-common conflicts php-common --> Finished Dependency Resolution php53-common-5.3.3-13.el5_9.1.x86_64 from installed has depsolving problems --> php53-common conflicts with php-common Error: php53-common conflicts with php-common You could try using --skip-broken to work around the problem You could try running: package-cleanup --problems package-cleanup --dupes rpm -Va --nofiles --nodigest
就需要使用yum update 之后再yum install php53-bcmath就好了
此函数在php.ini中的选项:
[bcmath] ; Number of decimal digits for all bcmath functions. ; http://www.php.net/manual/en/bc.configuration.php#ini.bcmath.scale bcmath.scale = 0
BC 数学库配置选项
php中关于mysql的操作非常简单,然而最近在做一个小工具的时候发现php写入mysql的数据库中出现了中文字符的乱码,这个乱码的问题纠结了我好久,明明英文字符写入正常,但是中文就是乱码!
一开始我感觉是我建立mysql数据库的时候没有设置UTF-8字符集,然而后来我发现即使我设置了这个字符集还是不能解决问题,写入mysql的字符串照样乱码。
解决这个问题其实很简单.
1.在建表的时候设置编码类型为gb2312_chinese_ci.
2.在PHP页面的数据库连接语句加一行mysql_query("SET NAMES 'gb2312'",$link); 例如
代码如下 | 复制代码 |
$db_host="localhost"; $link=mysql_connect($db_host,$db_user,$db_password); |
写入页面和读取页面都加入这行.这样在MYSQL里面的中文就能正常显示了.
另外种办法修改配置文件my.cnf
代码如下 | 复制代码 |
[mysqld] default-character-set=utf8 |
重新启动MYSQL改过 这个改了就是把 character_set_server 设成utf8
好了到这些关于php写入mysql中文乱码问题就解决了,当然我们主要是注意页面与数据库之间的编码然后使用mysql_query()进行设置。
相关文章
PHP session_start()很慢问题分析与解决办法
本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25php中json_decode()和json_encode()用法与中文不显示解决办法
本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.json_decode(...2016-11-25- 在php中我们如果要导入excel数据我们通常会使用phpexcel插件了,但是有朋友会发与使用phpexcel导出数据出现身份证后四位是0000情况了,下面我们就来看解决办法。 最...2016-11-25
- 401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
- Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
- 今天用CPAN安装Term::ReadLine,报了个这样的错误 Going to read /root/.cpan/sources/modules/03modlist.data.gz Can't locate object method "data" via package "C...2016-11-25
- 下面给大家介绍phpstudy访问速度慢的解决办法。1、修改mysql数据库链接地址为ip地址127.0.0.1。2、使用最新版本,这个坑了我好久时间。下面一段内容是关于phpstudy启动失败的解决办法。php5.3、5.4和apache都是用vc9编...2015-11-24
- 自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果...2014-05-31
- 分享给大家php判断上传文件类型的方法,大家一起学习学习。/** * 读取文件前几个字节 判断文件类型 * @return String */ function checkTitle($filename){ $file=fopen($filename, "rb"); $bin=fread($file, 2); /...2015-10-21
PHP分布式框架如何使用Memcache同步SESSION教程
本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25- 因此,正确的原子操作是真正被执行过的。是物理执行。在当前事务中确实能看到插入的记录。最后只不过删除了。但是AUTO_INCREMENT不会应删除而改变值。1、为什么auto_increament没有回滚?因为innodb的auto_increament的...2014-05-31
android.os.BinderProxy cannot be cast to com解决办法
本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20- 1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21- 对于乱码这个问题php开发者几乎都会有碰到过,我们下面主要是介绍了php文件乱码和页面乱码。PHP页面转UTF-8编码问题 1.在代码开始出加入一行: header("Content-Type: text/html;charset=utf-8"); 2.PHP文件编码问题...2015-10-21
- 这篇文章主要介绍了C#中的session用法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
Python3使用Selenium获取session和token方法详解
这篇文章主要介绍了Python3使用Selenium获取session和token方法详解,需要的朋友可以参考下...2021-02-17- 下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
Ubuntu15下mysql5.6.25不支持中文的解决办法
apt-get install 安装的,不是源码包安装的mysql1 修改mysql的配置文件/etc/mysql/conf.d/mysql.cnf在[mysql]的下方加入如下语句:(注:这个文件下没有配置,只有【mysql】)no-auto-rehash default-character-set=utf8/etc/...2015-10-21- 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 ...2014-06-07