使用PHP的Socket写的POP3类(二)

 更新时间:2016年11月25日 17:35  点击:2017


//退出登录
function popLogout()
{
if (!$this->getIsConnect() && $this->bolIsLogin)
{
return false;
}
$this->sendCommand("QUIT");
$this->getLineResponse();
if (!$this->getRestIsSucceed())
{
return false;
}
return true;
}

//获取是否在线
function getIsOnline()
{
if (!$this->getIsConnect() && $this->bolIsLogin)
{
return false;
}
$this->sendCommand("NOOP");
$this->getLineResponse();
if (!$this->getRestIsSucceed())
{
return false;
}
return true;
}

//获取邮件数量和字节数(返回数组)
function getMailSum($intReturnType=2)
{
if (!$this->getIsConnect() && $this->bolIsLogin)
{
return false;
}
$this->sendCommand("STAT");
$strLineResponse = $this->getLineResponse();
if (!$this->getRestIsSucceed())
{
return false;
}
if ($intReturnType==1)
{
return $this->strResponse;
}
else
{
$arrResponse = explode(" ", $this->strResponse);
if (!is_array($arrResponse) || count($arrResponse)<=0)
{
$this->setMessage('STAT command response message is error', 2006);
return false;
}
return array($arrResponse[1], $arrResponse[2]);
}
}

//获取指定邮件得Session Id
function getMailSessId($intMailId, $intReturnType=2)
{
if (!$this->getIsConnect() && $this->bolIsLogin)
{
return false;
}

假如你的服务器不容许你读他的LOG文件,那你只好停下来分析你的访问者?做你自己的LOG文件吧!
  你仅需做的事情是用PHP计算实际的点击次数,没有错误,没有象'304 Not Modified' 和 'Internal Server Error' 一样的错误。你的代码将生成自己的LOG文件。


<?php

/* 用户定义变量 */
$logfile = "clf.log"; /*LOG文件写到那里 */
$timezone = " 0100"; /* Timezone correction */
$lookup_size = true; /* 设置文件的权限 */
$document_root = "/usr/local/apache/share/htdocs";

/* 他可能或不可能对相同的客户端记数
* 一定要对$document_root 这个变量进行设置才可以工作
*/

function write_to_log($str) {
if($fd = @fopen($GLOBALS[ "logfile"], "a")) {
fputs($fd, $str);
fclose($fd);
}
}

function get_var($name,$default) {
if($var = getenv($name)) {
return $var;
} else {
return $default;
}
}

if($remote_host = get_var( "REMOTE_HOST", false)) {
$remote_host = get_var( "REMOTE_ADDR", "-");
}
$remote_user = get_var( "REMOTE_USER", "-");
$remote_ident = get_var( "REMOTE_IDENT", "-");
$server_port = get_var( "SERVER_PORT", 80);
if($server_port!=80) {
$server_port = ":" . $server_port;
} else {
$server_port = "";
}
$server_name = get_var( "SERVER_NAME", "-");
$request_method = get_var( "REQUEST_METHOD", "GET");
$request_uri = get_var( "REQUEST_URI", "");
$user_agent = get_var( "HTTP_USER_AGENT", "");
if($lookup_size == true && $document_root) {
$filename = ereg_replace( "?.*", "", $request_uri);
$filename = "$document_root$filename";
if(!$size = filesize($filename)) {
$size = 0;
}
} else {
$size = 0;
}

$date = gmdate( "d/M/Y:H:i:s");
$log = "$remote_host $remote_ident $remote_user [$date $timezone] "".
"$request_method http://$server_name$server_port$request_uri" 200 $sizen";

write_to_log($log);
?>

关于PHP的模板的确是一个说起来轻易做起来麻烦的事情。随便一数大概有20种以上的选择,光pear里面就包含了5中不同的模板,实在让人头疼。

千万不要人云亦云的说这个好那个不好,选择模板之前最好先应该搞清楚模板的真正目的是什么? 简单地说,模板的核心目的就是一个 team work。主要的作用方式有两种:

1、分离HTML和PHP使网页设计师和PHP程序员合作更加愉快。

2、分离显示逻辑和事物逻辑,使得核心事务逻辑的变更和应用程序的扩展更加轻易和灵活,也就是说使得程序员之间合作更加愉快。(这一点经常被人们忽视或者误解,总以为把PHP从HTML中弄出去就叫分离显示逻辑和事物逻辑了,假如这样当初又何苦让PHP和html 混在一起呢?)

搞清楚这个模板的真正目的是什么,就轻易做出正确的选择了。

假如只有你一个php程序员但是需要和其他的网页设计人员一起协同工作,那么选择能够分离HTML和PHP的模板就可以了,phplib (现在似乎集成到 Pear 里面了 http://pear.php.net/package/HTML_Template_PHPLIB)或者

FastTemplate 都是这样的东西,很简单轻易上手。

假如你的网站界面比较丑陋并且主要由程序员来完成,但是功能比较复杂更需要强大的扩展功能,需要分离各个层次包括显示逻辑,那么不要用什么非凡的东西,PHP本身就是最好的模板了。要注重的是在这种情况下,你要非常认真的设计你的程序,始终记住要分离的不是PHP和 html 而是事务逻辑(business logic )和显示逻辑(presentation logic)。这也是为什么我一直对于Smarty 这种东西非常的抵触, 因为这个 Smarty 的语法太复杂了太强大了, 几乎重新发明了一种脚本语言东西, (即使是PHP的程序员也要重新学习它)。更让人费解的是 这种脚本 越是强大,越轻易让人将事务逻辑(business logic )和显示逻辑(presentation logic)混在一起, 破坏了模板的初衷。

假如你既想HTML和PHP分离,得到更好的视觉设计,又想整个系统有非常强大的扩展能力能够适应html,xml,wml各种界面,而且不用去学习复杂的语法的同时提供较高的运行效率,那么这就是一个相当有挑战性的问题了。坏消息是目前还没有一个成熟的模板真正能够达到这样的要求,好消息是完成这样的一个模板并不是很难,假如你尝试过Zope或者是ColdFusion就会发现这种模板的影子,

(wact http://wact.sourceforge.net/ 和 phptal http://phptal.sourceforge.net/ 就是在向这个方向发展,应该很有前途)。

模板和数据的结合(模板的调用)方式主要有两种:推的方式和拉的方式。

推的方式是用PHP将数据推给模板,就是说需要程序员明确地为模板中的每一个变量赋值,将他们绑起来。

而拉的方式则像把php 和 html 混在一起一样,模板种的变量主动把数据拽进来。

说到模板就不能不提到另外两种东西:

phphtmllib 和 quickform(http://pear.php.net/package/HTML_QuickForm) 这两种东西是用传统的方式来通过各种页面构件来完成HTML的页面的 整个页面的构造完全把握再程序员手里,也许很多编写过传统GUI桌面程序的程序员更喜欢这种方式。

更加漂亮的方案

假如做商业软件的话,Flash应该是更漂亮的方案(别搞错了,别以为就你知道php支持ming 和swf库可以动态生成 Flash,我说的不是这个。) 我要说的是支持Flash Remoting 的方案,这种东西才是真正有意义的PHP和flash的结合。由视觉设计师完成flash部分,PHP 程序员通过 flash remoting 的方式将 数据发送到 flash 做成的客户端中。

目前有两种方案:

AMFPHP

http://www.amfphp.org/

由于Macromedia Flash Remoting 传输数据时 使用的是一种特有的更加高效数据格式, 所以AMFPHP通过分析数据格式,在服务器端构造了相应的php类来接收,解析和编码这些数据从而达到交换信息的功能(就像Samba一样,应该属于一种 Hacking 吧)。

PHPObject

http://ghostwire.com/resources/phpobject/

PHPObject 则采用了另外一种方法,通过在flash中嵌入一些actionscript的组件通过开放的格式soap来传送数据。

模板能够改善网站的结构。本文阐述如何通过PHP 4的一个新功能和模板类,在由大量静态HTML页面构成的网站中巧妙地运用模板控制页面布局。

提纲:
===================================

分离功能和布局


避免页面元素重复


静态网站的模板框架

===================================
分离功能和布局

   首先我们来看看应用模板的两个主要目的:

分离功能(PHP)和布局(HTML)


避免页面元素重复

   第一个目的是谈论得最多的目的,它设想的情形是:一组程序员编写用于生成页面内容的PHP脚本,同时另一组设计人员设计HTML和图形以控制页面的最终外观。分离功能和布局的基本思想就是使得这两组人能够各自编写和使用独立的一组文件:程序员只需关心那些只包含PHP代码的文件,无需关心页面的外观;而页面设计人员可以用自己最熟悉的可视化编辑器设计页面布局,无需担心破坏任何嵌入到页面的PHP代码。
   假如你曾经看过几个关于PHP模板的教程,那么你应该已经明白模板的工作机制。考虑一个简单的页面局部:页面的上方是页头,左边是导航条,其余部分是内容区域。这种网站可以拥有如下模板文件:

<!-- main.htm -->
<html>
<head><title>模板示例</title></head>
<body>
<table><tr><td>{HEADER}</td></tr>
<tr><td>{LEFTNAV}</td><td>{CONTENT}</td></tr>
</table>
</body></html>

<!-- header.htm -->
<img src="sitelogo.jpg">

<!-- leftnav.htm -->
<br><a href="foo">Foo</a>
<br><a href="bar">Bar</a>
   可以看出页面如何由这些模板构造而成:main模板控制着整个页面的布局;header模板和leftnav模板控制着页面的公共元素。花括号“{}”里面的标识符是内容占位符。使用模板最主要的好处在于界面设计者能够按照自己的意愿编辑这些文件,比如设置字体、修改颜色和图形,或者完全地改变页面的布局。界面设计者可以用任何普通HTML编辑器或者可视化工具编辑这些页面,因为这些文件都只包含HTML代码,没有任何PHP代码。
  PHP代码全部保存到单独的文件中,这个文件也就是由页面URL实际调用的文件。Web服务器通过PHP引擎解析该文件,然后把结果返回给浏览器。一般地,PHP代码总是动态地生成页面内容,比如查询数据库或者执行某种计算等。下面是一个例子:


<?php
// example.php
require('class.FastTemplate.php');
$tpl = new FastTemplate('.');
$tpl->define( array( 'main' => 'main.htm',
'header' => 'header.htm',
'leftnav' => 'leftnav.htm' ) );

// 此处的PHP代码设置$content使其包含合适的页面内容

方法一:

<?php
$GoTo="index.php";// 假如这里的目标链接取自数据库就实现了动态转向
header(sprintf("Location: %s", $GoTo));
?>

方法二:

<?php echo "<script>window.location ="$PHP_SELF";</script>";?>


方法三:

<?php echo "<META HTTP-EQUIV="Refresh" CONTENT="0;URL=index.php">";?>

[!--infotagslink--]

相关文章

  • php svn操作类

    以前我们开发大型项目时都会用到svn来同步,因为开发产品的人过多,所以我们会利用软件来管理,今天发有一居然可以利用php来管理svn哦,好了看看吧。 代码如下 ...2016-11-25
  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • Php文件上传类class.upload.php用法示例

    本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • php类的使用实例教程

    php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
  • PHP实现递归无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。 递归,简单的说就是一段程序代码的重复调用,当把...2015-10-23
  • C#类中static变量用法分析

    这篇文章主要介绍了C#类中static变量用法,实例分析了static变量使用技巧与相关注意事项,需要的朋友可以参考下...2020-06-25