PHP 真正的ZIP文件操作类
Skylin 在开发的过程中有时候我们可能需要使用到用zip来压缩和解压缩某个包,但是不是所有服务器我们都能控制(比如虚拟主机商提供的),所以我们可能在很多环境下都不能使用PHP的ZIP扩展库,下面是我经常会用到的一个zip的PHP类,这里我的本意是想说我们大家可以研究下zip的格式,至于压缩数据其实就是使用到了PHP的gz相关的函数。
Posted in PHP |
No Comments »
Skylin 在开发的过程中有时候我们可能需要使用到用zip来压缩和解压缩某个包,但是不是所有服务器我们都能控制(比如虚拟主机商提供的),所以我们可能在很多环境下都不能使用PHP的ZIP扩展库,下面是我经常会用到的一个zip的PHP类,这里我的本意是想说我们大家可以研究下zip的格式,至于压缩数据其实就是使用到了PHP的gz相关的函数。
Posted in PHP |
No Comments »
Skylin 以前PHP被认为只能用来编写服务器端的CGI程序,如果说PHP能够开发Windows下的GUI(图形用户界面)程序,你相信吗?最近,PHP的开发小组成功开发出了捆绑GTK+的PHP,那么就可以开发Windows下的GUI程序了。
一、建立PHP/GTK运行环境:
其实GUI程序和普通的PHPCGI程序没有什么区别,不过是PHP/GTK程序由GTK的类来生成GUI界面而已,他们同样是开放源代码,靠PHP来解析建立窗口。如果你已经建立好了PHP的调试环境,那么安装PHP/GTK环境比较简单:
1、下载php_gtk.dll(这个dll文件用于解析PHP源程序里面的GTK代码),下载后将其解压到PHP的扩展(extension)目录中;
2、下载其他PHP/GTK的dll文件(一共6个),将他们解压缩到Windows的system32目录里面;
3、打开php.ini,在扩展设置部分“Windows Extensions”最下面加入“extension=php_gtk.dll”的语句,建议先备份php.ini,避免修改失败使得建立好的PHP运行环境作废;
现在就建立好了PHP/GTK的运行环境了。当然,你也可以不作第二步,而改为在每个PHP/GTK程序源代码的第一行加入“dl(’php_gtk.dll’)”来动态加载GTK的支持。
如果你还没有建立PHP运行环境,那么安装要更加简单:
1、下载整个PHP/GTK的捆绑支持包,然后将他们解压缩到c盘的PHP4目录下面;
2、将winnt目录下面的dll文件拷贝到Windows的system32目录中,将php.ini文件拷贝到Windows的目录中;
建 立好了PHP/GTK的运行后,可以用命令行模式的PHP来运行一个PHP/GTK程序:在运行中输入“c:\php4\php -q gtkprogrampath”,其中“c:\php4\php”改为PHP.EXE的路径,“gtkprogrampath”就是PHP/GTK程序的 路径。比如:“c:\php4\php -q c:\php4\samples\hello.php”将会运行PHP/GTK运行包中附带的例子“hello world”程序。
二、编译PHP/GTK程序:
如果你作出一个PHP/GTK的应用程序,还需要对方的电脑建立PHP的运行环境并且使用PHP命令行模式来解析才可以执行的话,那就过于复杂了。那么怎么样才可以编译一个PHP/GTK的程序呢?经过一番搜索,笔者发现了PHPCompiler这个软件。
PHPCompiler由www.deskcode.com开发(http://www.deskcode.com/phpcompiler),可以将PHP编译成为EXE可执行文件,内置了PHP的支持,如果你要编译一个PHP/GTK程序,必须建立PHP/GTK的运行环境(参照前面的步骤)。要编译一个PHP/GTK程序的步骤如下:
1、打开PHPCompiler,在“Script to”选择希望编译的PHP程序源代码,在“Destination”处选择编译成功后的EXE文件的路径;
2、点击“Compile”按钮,会弹出一个对话框询问使用的编译模式(如果是PHP/GTK程序就选择no,是单纯的PHPCGI程序就选择yes);
3、然后又会弹出一个对话框询问是否拷贝php4ts.dll文件到编译后的EXE文件的目录,选择yes。
经过上面的步骤,一个PHP/GTK程序就成功编译了,但是对于编译PHP/GTK程序还有几个需要注意的地方:
1、编译完成后的可执行文件如果需要执行,PC机上面必须具有GTK运行环境所需的几个dll文件(就是前面下载的那几个),如果需要作成应用程序,可以在安装的时候将几个dll文件拷贝到system32目录中(不过这样子程序也就不是“绿色软件”了^_^)。
2、 PHPCompiler本身对于PHP的支持非常好,但是有些人试过用一些需要扩展支持的函数,比如“gzopen”等等,在编译之前还好好的,编译完毕 后就不能用了。其实编译完成后的可执行文件,相当于了只有默认的PHP支持(连GTK支持都没有了),所以如果在程序中应用了任何需要扩展支持的函数,都 必须动态的加载支持函数的dll文件,比如“dl(’php_gtk.dll’)”,这样子编译完成后才不会出错。
3、运行一个编译后的可执行文件,都会先弹出一个DOS窗口,然后自动关闭,因为每个GUI窗口都是通过GTK来“绘制”出来的,所以必须会有那个窗口。
4、或许以前PHP还不能说是真正的OOP(面向对象程序)语言,但是到了PHP/GTK,任何一个窗口都由GTK对象来“绘制”,如果没有过硬的OOP功底,是很难写出GUI程序的。
三、PHP/GTK资源:
1、http://gtk.php.net:PHP/GTK的官方网站;虽然说是官方网站,但是确简陋的很,出了一个FAQ和邮件列表,几乎找不到任何有用的东西了,
2、http://www.phpgtk.com:一个界面比较好的PHP/GTK网站,有最新的版本信息。
3、http://developer.gnome.org/doc/API/gtk/gtkobjects.html:PHP/GTK函数和类的大全/手册网站,里面有十分丰富的PHP/GTK资料。
4、http://www.phpuk.org/gtk/:非官方版本的GTK手册网站,简单易懂。
如果大家认为E文比较难看,也可以来zphp.com[url]http://dl.itbulo.com/’[/url]>下载最新的PHP/GTK运行环境和支持包。
PHP-GTK开发入门全集(1)
1. PHP-GTK介绍
1.1 PHP-GTK
PHP-GTK是PHP的延伸模组,它可以让程序设计师写出在客户端执行的、且独立的GUI的程序。这个模组不允许在浏览器上显视GTK+的程序,它一开始就是开发来写独立的GUI程序的。
1.2 GTK
GTK原本是为GIMP,一个GUI的影像处理软体而开发的。GTK+是GIMP的套装工具。GTK+从这里开始发展,直到现在已经成为Gnome的中心 (Gnome是一个桌面环境)。后来GTK+也已经被推广到BeOS和Win32,使得它成为PHP延伸模组的最佳选择,维持PHP可以跨平台并可以用 PHP为Linux,BeOS,Windows等平台开发视窗接口的程序。
2. PHP-GTK概念
2.1 前言
接下来就要教各位一点点比较观念性的东西罗┅因为这章的概念都是非常重要的,所以就算不懂,也还是要慢慢的看懂它,不然┅以后就┅。还有,接下来的内容不 建议没有程序设计经验的读者阅读,因为有很多的观念很容易会搞不清楚。还有,接下来该用英文的部分我都会用英文,这样大家在看国外文件的时候才不会不知所 措,加油吧!!如果对本章有任何不懂之处,请自行查阅
PHP-GTK Manual:http://gtk.php.net/manual/en/
2.2 Widget(s)
Widget是一个GUI程序中基本的functions和forms。最常用的几个Widget是:label、button、window、 frame和text box。所有的widget都是来自于一个抽象的基本class─GtkWidget。每个widget都是一个class
一个Widget一生大概都有五个时期:
1. 建立(Creation):宣告一个对象(declaring an object)
2. 放置(Placement):将它加入一个容器中(adding it to a container)
3. 信号连接(Signal Connection):接收信号以及进行动作(the action it will perform)
4. 显示(Display):它是否是可见的(whether it is viewable or [...]
Posted in PHP |
No Comments »
Skylin 用了很久php了却很少有机会用php进行一些二进制操作。 最近用php写一个socket客户端连接一个用C++语言开发的游戏服务端。 服务器端开发人员使用了二进制的形式来定义协议的格式。协议格式如下: 包头(2bytes)+加密(1byte)+命令码(2bytes)+帧内容 1.包头的内容是记录帧内容的长度; 2. 加密:0表示不加密,1表示加密; 3. 命令码为服务端命令识别符号; 一开始不了解php原来有pack可以来组装二进制包, 走了弯路,让服务端开发人员用C语言帮忙开发了的几个内存操作函数,按照协议规则返回二进制包,然后我将这几个方法编译成一组扩展函数供php使用。 话归正题,本文是介绍如何使用pack和unpack这两个方法的。php官方手册举例太少,不能很容易理解,特别是那些格式化参数的使用。 转摘的参数中文说明: pack/unpack 的摸板字符字符 含义 a 一个填充空的字节串 A 一个填充空格的字节串 b 一个位串,在每个字节里位的顺序都是升序 B 一个位串,在每个字节里位的顺序都是降序 c 一个有符号 char(8位整数)值 C 一个无符号 char(8位整数)值;关于 Unicode 参阅 U d 本机格式的双精度浮点数 f 本机格式的单精度浮点数 h 一个十六进制串,低四位在前 H 一个十六进制串,高四位在前 i 一个有符号整数值,本机格式 I 一个无符号整数值,本机格式 l 一个有符号长整形,总是 32 位 [...]
Posted in PHP |
No Comments »
Skylin 可以通过PHP来产生EXCEL档
—————————-
Excel Functions
—————————-
将下面的代码存为excel.php ,然后在页面中包括进来
然后调用
1. Call xlsBOF()
2. 将一些内容写入到xlswritenunber() 或者 xlswritelabel()中.
3.然后调用 Call xlsEOF()
也可以用 fwrite 函数直接写到服务器上,而不是用echo 仅仅在浏览器上显示。
<?php
// —– begin of function library —–
// Excel begin of file header
function xlsBOF() {
echo pack(”ssssss”, 0×809, 0×8, 0×0, 0×10, 0×0, 0×0);
return;
}
// Excel end of file footer
function xlsEOF() {
echo pack(”ss”, 0×0A, 0×00);
return;
}
// Function to write a Number (double) into Row, Col
function xlsWriteNumber($Row, $Col, [...]
Posted in PHP |
No Comments »
Skylin 在我们编写一个项目的时候,可能经常会碰到动态内容的下拉框,单选框,复选框,而且编写这些动态的控件的过程中总会觉得破环了代码的HTML与PHP的分离的特征。
这里我把下拉框,单选复选框并入了PHP中,使用PHP针对这三种比较难搞的控件分别做了一套类,这些类比较简单,下面我只写出演示,源代码请在下面下载。
下拉框演示:
<?php
$scalearr = array(’1 - 49人’,’50 - 99人’,’100 - 499人’,’500 - 999人’,’1000人以上’);
$scale = new SelectBox(”scale”); //实例化对象
$scale->AddItem(”请选择…”,”-1″,1); //给下拉框添加项
foreach($scalearr as $label=>$value)
{
$scale->AddItem($value,$label);
}
$scale->CheckItem_value(1); //选中第二项,就是50 - 99人
$html = $scale->GetSelectHtml(); //获得下拉框的HTML代码
?>
new SelectBox(name,app)有两个参数,第一个参数是这个下拉框控件的name和id是什么,第二个参数是在这个下拉框中<select>添加附加属性,这样我们可以为下拉框编写JS或样式
AddItem($name,$value,$Checked=0,$append=”)有四个参数,前面两个我就不多说了,第三个是是否设置当前项为默认选中,第四个参数是可以对<option>添加附加属性
单选演示:
<?php
$showmap = new RadioBox(’showmap’);
$showmap->AddItem(’0′,’ 不开启 ’,”,$js=’onclick=”HideMap()”‘,1); //添加项
$showmap->AddItem(’1′,’ 开启’,”,$js=’onclick=”ShowMap()”‘);
$html = $showmap->GetSelectHtml(); //获得下拉框的HTML代码
?>
new RadioBox(’showmap’)只有一个参数,表示单选框的name和id
AddItem($value,$label,$space=’ ‘,$js=”,$Checked=0)前面两个参数不多说,第三个参数,表示当前项右边会附加什么东西?比如我们使用 (空格)这样可以设置每个项的间隔距离,$js参数我想一眼就可以看出来是干什么用的,它不只可以使用在js上,而且还可以对单选框设置附加属性,$checked是是否设置当前项为默认选中
复选框演示:
<?php
$checkbox = new CheckBox(’checkbox’);
$checkbox->AddItem(’0′,’ 不开启 ’,”,$js=’onclick=”HideMap()”‘,1); //添加项
$checkbox->AddItem(’1′,’ 开启’,”,$js=’onclick=”ShowMap()”‘);
$html = $checkbox->GetSelectHtml(); //获得下拉框的HTML代码
?>
new CheckBox(’checkbox’)只有一个参数,表示单选框的name和id
AddItem($value,$label,$space=’ ‘,$js=”,$Checked=0)这里与单选框参数一样,可以参考单选框
其中还有很多可用的方法,大家可以查看源代码
源代码下载:box
Posted in PHP |
No Comments »
Skylin 上次为了简便在网上下了一个邮件类来使用,但是中间出现了一些问题(时间久了不记得什么问题了)。后来对其进行了修正,现在释放出完整的邮件发送(SMTP)类。便于大家使用.使用比较简单,这里我就不介绍使用方法了,如果有朋友需要可以留言.
<?php
/***********************************
本类可以发送HTML 格式的正文、附件,采用 base64 编码
本版本是针对个人的发送,与多人群发版本不同的是,每发送到一个人,就重新进行一次编码,在接收端的用户看来,只是发送给他一个人的。
针对多人群发的情况,只发送一次,通过多个 RCPT TO 命令发送到不同的人信箱中,
说明:
请把 $hostname 设为你有权限的 默认 smtp 服务器或是在 new 时指定
把 $charset 改成你的默认 字符集
Html 正文中如有图片,请用绝对路径的引用 ”httP://host/path/image.gif”;
并连上网,以保证程序能读取到图片的数据信息
如果是通过表单提交过来的 Html 正文,请先用 StripSlashes($html_body) 把正文内容进行预处理
Html 中用到的样式表文件,请不要用引用,直接把样式表定义放在html中
*************************************/
class smtp
{
var $hostname=””;
var $port=25;
var $connection=0;
var $debug=0;
var $is_authlogin = true;
var $username = “”;
var $password = “”;
var $timeout=30;
var $err_str;
var $err_no;
var $autocode=true;
var $charset=”utf-8″;
var $subject=””;
var $body=””;
var $attach=””;
var $temp_text_body;
var $temp_html_body;
var $temp_body_images;
var $bound_begin=”=====powered_by_boss_chen_”;
var $bound_end=”_046484063883_=====”;
function smtp($server=”mail.gmail.com”,$username=”*******”,$password=”******”,$port=25,$time_out=20)
{
$this->hostname=$server;
$this->port=$port;
$this->timeout=$time_out;
$this->username = $username;
$this->password = $password;
return true;
}
function outdebug($message)
{
echo htmlspecialchars($message).”\n”;
}
function command($command,$return_lenth=1,$return_code=’2′)
{
if ($this->connection==0)
{
$this->err_str=”没有连接到任何服务器,请检查网络连接”;
return false;
}
if ($this->debug)
$this->outdebug(”>>> $command”);
if (!fputs($this->connection,”$command \r\n”))
{
$this->err_str=”无法发送命令”.$command;
return false;
}
else
{
$resp=fgets($this->connection,256);
if($this->debug)
$this->outdebug(”$resp”);
if (substr($resp,0,$return_lenth)!=$return_code)
{
$this->err_str=$command.” 命令服务器返回无效:”.$resp;
return [...]
Posted in PHP |
No Comments »
Skylin 现在的很多服务器都支持断点续传去下载软件,同时很多下载软件也是断点续传,怎么样才能让PHP也能实现断电续传功能呢?请先看下面的代码。 $fname = ‘./05e58c19552bb26b158f6621a6650899′; $fp = fopen($fname,’rb’); $fsize = filesize($fname); if (isset($_SERVER['HTTP_RANGE']) && ($_SERVER['HTTP_RANGE'] != “”) && preg_match(”/^bytes=([0-9]+)-$/i”, $_SERVER['HTTP_RANGE'], $match) && ($match[1] < $fsize)) { $start = $match[1]; } else { $start = 0; } @header(”Cache-control: public”); @header(”Pragma: public”); if ($start > 0) { fseek($fp, $start); Header(”HTTP/1.1 206 Partial Content”); Header(”Content-Length: ” . [...]
Posted in PHP |
No Comments »
Skylin 在我们编写PHP程序的过程中,我们经常会需要调用外部的链接与外部链接进行通信,首先有两种方法,一种我们使用底层HTTP协议和套接口来模拟浏览器与WEB服务器之间的通信过程,第二种使用PHP给我们提供的一套模拟浏览器与WEB服务器之间的通信。
第一种方法比较麻烦,而且有些功能不好实现(比如SSL,证书等),但是比较灵活。第二种方法虽然提供给我们强大的浏览器与WEB服务器模拟,但是在我们使用过程中需要有PHP的CURL库支持。可以说这两种各有所长,下面我就介绍第二种简单的用法。
下面是一个模拟用户登陆的例子,例子其中有些语句是可以不要的,大家都来试试?:)
$url = “https://xxx/logging.php?action=login”; //登陆地址$fields = “username=xxxxxxxx&password=xxxxxxxxxx”; //提交的登陆数据$cookie_file = “D:\cookie.txt”; //存储登陆之后的COOKIE//登录$ch = curl_init();//指定登陆URL地址curl_setopt($ch, CURLOPT_URL, $url);//设置SSL请求方式(HTTPS)curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);//使用POST方式传输数据curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); //指定POST数据//把登陆之后生成的cookie存入指定文件curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);//返回access字符串,就是把ssl或者其它进行编码的显示字符串编码为正常显示的字符串curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//开始进行请求,把返回(显示)的数据保存到$result$result = curl_exec($ch);curl_close($ch); //关闭连接//登录成功操作,下面的解释和上面一样$url2 = “https://xxx/”;$ch2 = curl_init();curl_setopt($ch2, CURLOPT_URL, $url2);curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch2, CURLOPT_SSL_VERIFYHOST, 2);//发送cookiecurl_setopt($ch2, CURLOPT_COOKIEFILE, $cookie_file);curl_setopt($ch2, CURLOPT_RETURNTRANSFER,1);$result2 =curl_exec($ch2);curl_close($ch2);
Posted in PHP |
No Comments »
Skylin 我的安装环境是centos5,缺省不安装apache mysql等
安装顺序是mysql > apache > php > zend
一、准备工作
安装多线程下载工具
wget http://myget.sourceforge.net/release/myget-0.1.2.tar.gz
tar zxvf myget-0.1.2.tar.gz
cd myget-0.1.2
./configure
make
make install
测试一下是不是正常:
mytget -n 10 http://curl.haxx.se/download/curl-7.17.1.tar.gz
下载相关的软件包:
mytget -n 10 http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.45-linux-i686-icc-glib
c23.tar.gz/from/http://mysql.mirrors.pair.com/
wget http://apache.mirror.phpchina.com/httpd/httpd-2.2.6.tar.gz
wget http://cn2.php.net/get/php-5.2.5.tar.gz/from/this/mirror
wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.2.5-0.9.6.2.patch.gz
wget http://www.zlib.net/zlib-1.2.3.tar.gz
wget http://downloads.sourceforge.net/libpng/libpng-1.2.23.tar.gz
wget http://downloads.sourceforge.net/freetype/freetype-2.3.5.tar.gz wget http://freshmeat.net/redir/libjpeg/5665/url_tgz/jpegsrc.v6b.tar.gz
wget http://www.boutell.com/gd/http/gd-2.0.33.tar.gz
wget http://curl.haxx.se/download/curl-7.17.1.tar.gz
mytget -n 10 http://ftp.acc.umu.se/pub/GNOME/sources/libxml2/2.6/libxml2-2.6.30.tar.gz
mytget -n 10 http://ftp.acc.umu.se/pub/GNOME/sources/libxslt/1.1/libxslt-1.1.22.tar.gz
说明:所有的包全部安装到/usr/local/src目录下。
以下的软件版本的相关性得到测试是相互符合的,如果是换新的版本安装,各位在编译安装的时候要注意是否提示软件相关性的问题!
主要软件:
mysql-5.0.45-linux-i686-icc-glibc23.tar.gz httpd-2.2.6.tar.gz [...]
Posted in PHP |
No Comments »
Skylin 使用HTTPS下载是比较简单的,只需要下面三条语句就可以了。
header(’Pragma:public’); //https加上这句就可以正常下载了header(’Content-type: application/skylin’);header(’Content-Disposition: attachment; filename=”userlist.xls”‘);
Posted in PHP |
No Comments »