Archive for category PHP

PHP session超时问题

在PHP4.0中加入了对Session的支持,方便了我们很多程序,比如购物车等等!
在很多论坛中,Session也用于处理用户的登陆,记录下用户名和密码,使得用户不必每次都输入自己的用户名和密码!但是一般的Session的生命期有限,如果用户关闭了浏览器,就不能保存Session的变量了!那么怎么样可以实现Session的永久生命期呢?
大家知道,Session储存在服务器端,根据客户端提供的SessionID来得到这个用户的文件,然后读取文件,取得变量的值,SessionID可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……

要实现Session的永久生命期,首先需要了解一下php.ini关于Session的相关设置(打开php.ini文件,在“[Session]”部分):
1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递;
2、session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“PHPSESSID”;
3、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用!
4、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!
还有很多的设置,不过和本文相关的就是这些了,下面开始讲使用永久Session的原理和步骤。

前面说过,服务器通过SessionID来读取Session的数据,但是一般浏览器传送的SessionID在浏览器关闭后就没有了,那么我们只需要人为的设置SessionID并且保存下来,不就可以……
如果你拥有服务器的操作权限,那么设置这个非常非常的简单,只是需要进行如下的步骤:
1、把“session.use_cookies”设置为1,打开Cookie储存SessionID,不过默认就是1,一般不用修改;
2、把“session.cookie_lifetime”改为正无穷(当然没有正无穷的参数,不过999999999和正无穷也没有什么区别);
3、把“session.gc_maxlifetime”设置为和“session.cookie_lifetime”一样的时间;
设置完毕后,打开编辑器,输入如下的代码:
————————————————————————————
<?
session_start();
session_register(\’count\’);
$count++;
echo $count;
?>
————————————————————————————
然后保存为“session_check.php”,用浏览器打开“session_check.php”,看看显示的是不是“1”,再关闭浏览器,然后再打开浏览器访问“session_check.php”,如果显示“2”,那么恭喜了,你已经成功;如果失败的话,请检查你前面的设置。

但是如果你没有服务器的操作权限,那就比较麻烦了,你需要通过PHP程序改写SessionID来实现永久的Session数据保存。查查php.net的函数手册,可以见到有“session_id”这个函数:如果没有设置参数,那么将返回当前的SessionID,如果设置了参数,就会将当前的SessionID设置为给出的值……
只要利用永久性的Cookie加上“session_id”函数,就可以实现永久Session数据保存了!
但是为了方便,我们需要知道服务器设置的“session.name”,但是一般用户都没有权限查看服务器的php.ini设置,不过PHP提供了一个非常好的函数“phpinfo”,利用这个可以查看几乎所有的PHP信息!
————————————————————————————

<?phpinfo()?>
————————————————————————————
打开编辑器,输入上面的代码,然后在浏览器中运行这个程序,会见到PHP的相关信息(如图1所示)。其中有一项“session.name”的参数(图中已经标出),这个就是我们需要的服务器“session.name”,一般是“PHPSESSID”。
记下了SessionID的名称后,我们就可以实现永久的Session数据储存了!
打开编辑器,输入下面的代码:
————————————————————————————
<?
session_start(); // 启动Session
session_register(\’count\’); // 注册Session变量Count
if(isset($PHPSESSID)) {
session_id($PHPSESSID);
} // 如果设置了$PHPSESSID,就将SessionID赋值为$PHPSESSID,否则生成SessionID
$PHPSESSID = session_id(); // 取得当前的SessionID
$count++; // 变量count加1
setcookie(\’PHPSESSID\’, $PHPSESSID, time()+3156000); // 储存SessionID到Cookie中
echo $count; // 显示Session变量count的值
?>
————————————————————————————

保存之后,利用和刚才拥有服务器权限时候的检测一样的方法,检测是否成功的保存了SessionID。

  • Share/Bookmark

PHP session 失效不传递的解决办法

PHP中,session不能传递到下一个页面去,一般有两种情况:

我们先写个php文件:<?=phpinfo()?>, 传到服务器去看看服务器的参数配置。

转到session部分,看到session.use_trans_sid参数被设为了零。

这个参数指定了是否启用透明SID支持,即session是否随着URL传递。我个人的理解是,一旦这个参数被设为0,那么每个URL都会启一个session。这样后面页面就无法追踪得到前面一个页面的session,也就是我们所说的无法传递。两个页面在服务器端生成了两个session文件,且无关联。(不知道这样理解对不对?请高手指教。)

所以一个办法是在配置文件php.ini里把session.use_trans_sid的值改成1。

当然我们知道,不是谁都有权限去改php的配置的,那么还有什么间接的解决办法呢?

下面就用两个实例来说明吧:

文件1 test1.php

<?php
//表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//将session的name赋值为Havi
$_SESSION['name']=”Havi”;
//输出session,并设置超链接到第二页test2.php
echo “<a href=\”test2.php\”>”.$_SESSION['name'].”</a>”;
?>

文件2: test2.php

<?php
表明是使用用户ID为标识的session
session_id(SID);
//启动session
session_start();
//输出test1.php中传递的session。
echo “This is “.$_SESSION['name'];
?>

所以,重点是在session_start();前加上session_id(SID);,这样页面转换时,服务器使用的是用户保存在服务器session文件夹里的session,解决了传递的问题。

不过有同鞋会反映说,这样一来,多个用户的session写在一个SID里了,那Session的价值就发挥不出来了。所以还有一招来解决此问题,不用加session_id(SID);前提是你对服务器的php.ini有配置的权限:

output_buffering改成ON,道理就不表了。

第二个可能的原因是对服务器保存session的文件夹没有读取的权限,还是回到phpinfo.php中,查看session保存的地址:

session.save_path: var/tmp

所以就是检查下var/tmp文件夹是否可写。

写一个文件:test3.php来测试一下:

<?
echo var_dump(is_writeable(ini_get(“session.save_path”)));
?>

如果返回bool(false),证明文件夹写权限被限制了,那就换个文件夹咯,在你编写的网页里加入:

//设置当前目录下session子文件夹为session保存路径。
$sessSavePath = dirname(__FILE__).’/session/’;

//如果新路径可读可写(可通过FTP上变更文件夹属性为777实现),则让该路径生效。
if(is_writeable($sessSavePath) && is_readable($sessSavePath))
{session_save_path($sessSavePath);}

 最后一种方法挺不错的,不用改php配置,作为临时解决方法很管用,我今天的一个问题就是这么解决的,谢谢作者

大功告成。

  • Share/Bookmark

php 实时显示输出

ob_end_flush();

flush();

  • Share/Bookmark

Tags:

msn官方在线状态接口(JSON形式)

MSN提供了查询MSN在线状态的接口:

http://messenger.services.live.com/users/zxxmicki@live.com/presence/?cb=showpresence

zxxmicki@live.com请更改为自己的MSN ID

返回数据是JSON形式的字符串,如下:

showpresence({ “icon”:{ “url”:”http\u003a\u002f\u002fwww.wlmessenger.net\u002fstatic\u002fimg\u002fpresence\u002fAway.gif”,”height”:16,”width”:16 },”statusText”:”Away”,”status”:”Away”,”displayName”:”zhuang”,”id”:”zxxmicki\u0040live.com”,”result”:{ “code”:200,”response”:”OK” } });

可用preg_match()函数直接进行判断得到在线状态

  • Share/Bookmark

Tags: , , , ,

EMS 查询接口

EMS官方并没有提供查询接口,并在近几年加大接口复杂度

主要的问题是验证码和cookie问题

要保证提取到的myEmsbarCode和验证图片来源一致,cookie也要一致

攻关了,用curl实现本地调用查询,代码还在完善,暂不开放

  • Share/Bookmark

Tags:

判断客户端操作系统的语言

一、通过JavaScript判断客户端操作系统的语言。通过JavaScript判断的事实上是系统的语言,相对比较准确.就算有人把浏览器语言改成其它语言,如日文(ja),仍能准确识别.但因为JavaScript本身的限制,这种方法缺乏可靠性.

<script type=”text/javascript”>
sysLanguage=navigator.systemLanguage?navigator.systemLanguage:navigator.language;
if(sysLanguage == ‘zh-cn’ || sysLanguage == ‘zh-CN’){
alert(‘OK’);

window.location.href=’nddbc.html’;
}
</script>

二、如何利用ASP判断客户端操作系统语言,其实很简单,就是利用Request.ServerVariables(“HTTP_ACCEPT_LANGUAGE”)。

代码:

<%=Request.ServerVariables(“HTTP_ACCEPT_LANGUAGE”)%>

如果使用的是中文操作系统,则输出的语言类型结果为:

zh-cn

三、PHP只能检测到浏览器语言。。。

  • Share/Bookmark

Tags: , , , , , , ,

GOOGLE翻墙代码

<?php
ini_set(‘max_execution_time’, 60);//脚本最大允许执行时长祿  表示没有限制
ini_set(‘memory_limit’, ’128M’);//限制最大占用的内存 28M
ini_set(‘error_reporting’, 0);
ini_set(‘display_errors’, 0);
ini_set(‘magic_quotes_runtime’, 0);//默认为off,意为不转义从文件读取或数据库中查询获得的数据
ini_set(‘magic_quotes_sybase’, 0);//是否采用Sybase形式的自动字符串转义★★
ini_set(‘default_mimetype’, ‘text/html’);//设置默认mime类型为text/html
ini_set(‘default_charset’,'UTF-8′);//设置默认编码为UTF-8
ini_set(‘default_socket_timeout’, ’60′);//默认socket超时(祿
ini_set(‘date.timezone’, ‘UTC’);//设置时区 //date_default_timezone_set(‘UTC’);
//检查gzip加速支持情儿
if ( extension_loaded(‘zlib’) && strstr($_SERVER["HTTP_ACCEPT_ENCODING"],”gzip”) ) {
 ob_start(‘ob_gzhandler’);
} else {
 ob_start();
}
//header(‘Content-Type: text/html; charset=UTF-8′);
//header(‘Content-language: zh-CN’);
//header(‘Expires:-1′);
header(‘Server: gws’);
header(‘X-Powered-By: gushu’); 

$str1 = array(
     ‘<title>Google</title>’,
     ‘Google 搜索</title>’,
     ‘www.google.com.hk’,
     ‘zh-TW’
     );
$str2 = array(‘
     <title>CrazyLemon提供Google在线翻墙搜索服务</title>’,
     ‘CrazyLemon提供Google在线翻墙搜索服务</title>’,
     ‘www.crazylemon.net/google’,
     ‘zh-CN’
     );
     //echo $_SERVER["QUERY_STRING"];
if(!empty($_SERVER["QUERY_STRING"])){
 $q = str_replace(‘hl=zh-TW’,'hl=zh-CN’,$_SERVER["QUERY_STRING"]);
 $url = ‘http://www.google.com.hk/search?’.$q;
}else{
 $url = ‘http://www.google.com.hk/’;
}
$user_agent = $_SERVER["HTTP_USER_AGENT"];
$referer_url = ‘http://www.gushu.cn/’;
//$url 需要抓取的页面地址
//$user_agent 需要返回的user_agent信息 如“baiduspider”或“googlebot
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
//curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt ($ch, CURLOPT_REFERER, $referer_url);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
/*
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_COOKIE, $_COOKIE);
curl_setopt ($ch, CURLOPT_POST, $_POST);
*/
if(!curl_errno($ch))
{
 $google =str_replace(“/search”,”/google/search”, curl_exec ($ch));

 echo str_replace($str1,$str2,$google);
}
curl_close($ch);

ob_end_flush();
?>

如何把一段文本里的A标签都去掉?

preg_replace(array(“/\<a[^\>]+\>/i”,”/\<\/a\>/i”), “”, $string);

  • Share/Bookmark

Tags: , , , , , , , , , , , , , ,

php远程下载文件到服务器

由于所买的虚拟主机没有申请SSH或根本不提供SSH访问,无法直接在shell里用get命令获取远程数据,在转移数据时只能通过FTP下载到本地再上传到另一台主机上,速度很慢,如果能直传就好了

解决方法如下,写个PHP文件在A主机上,直接通过PHP脚本下载B主机上的文件到A主机,代码如下:

<form method=”post”>
文件地址:<input name=”url” size=”50″ /><br>
操作密码:<input name=”pwd” size=”30″ />
<input name=”submit” type=”submit” />
</form>
<?php
$pwd=’abcd’;
if ($_POST['pwd']!=$pwd)
exit(‘Sorry ,you are not validate user!’);
// maximum execution time in seconds
set_time_limit (24 * 60 * 60);
if (!isset($_POST['submit'])) die();
// folder to save downloaded files to. must end with slash
$destination_folder = ‘temp/’;
 
$url = $_POST['url'];
$newfname = $destination_folder . basename($url);
$file = fopen ($url, “rb”);
if ($file) {
$newf = fopen ($newfname, “wb”);
if ($newf)
while(!feof($file))
{
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}
if ($file)
{
fclose($file);
}
if ($newf) {
fclose($newf);
echo ‘OK,File has been downloaded!’;
}
?>

基中$pwd是操作密码,这样不会被人乱下东西挤爆硬盘了

  • Share/Bookmark

Tags: , , , , , , , , ,

ecshop设置模板报错的解决方法

装了ecshop的默认模板,点设置模板时,报如下错误

Maximum execution time of 30 seconds exceeded in …… admin/includes/lib_template.php

这个是ECShop的一个鸡肋问题,有一个暴力解决方法。

删除:themes\XXX\libs.xml

直接删除模板下的这个配置文件,基本上第三方的模板都能设置了。这个确实是个鸡肋的功能,无法自动生成libs.xml文件,配置错误就会导致设置模板功能出错。

  • Share/Bookmark

Tags: , , ,

另一种跳转方式

<?php
$ch = curl_init(“http://www.baidu.com/”);
curl_exec($ch);
curl_close($ch);
?>

这样,比定位根目录或用301重定向方便多了,直接取目标网站过来

  • Share/Bookmark

Tags: , ,