为加速PHP程序而努力

 更新时间:2016年11月25日 15:20  点击:2136
动态网站的内容加速显示十分重要,本文通过对 PHP 几个函数的深入讨论,提出了 PHP 网页压缩和缓冲的解决方案
一、介绍几个控制 PHP 输出的函数
PHP4 采用了缓冲机制,在你决定发送以前,所有内容只是存在于缓冲中,而不是直接发送给浏览器,虽然你可以用 header 和 setcookie 函数来实现,但是这两个函数相比于功能强大的输出函数来说只是一点“雕虫小技”。让我们来看看这些函数的真本事:
void ob_start(void);
本函数告诉 PHP 处理器把所有输出重定向到内部缓冲,调用这个函数后,就不会有输出到浏览器。
string ob_get_contents(void);
本函数把输出缓冲返回到一个字符串,你可以用来把堆积起来的输出一起发送到浏览器。当然要先关掉缓冲。
int ob_get_length(void);
本函数返回输出缓冲的长度。
void ob_end_clean(void);
本函数清除并关闭缓冲。在输出到浏览器之前你需要使用这个函数。
void ob_implicit_flush ([int flag])
本函数用来控制隐式缓冲泻出,缺省为 off,如果打开时,对每个 print/echo 或者输出命令的结果都发送到浏览器。
二、采用输出控制来压缩 PHP 的输出
在开始之前,要保证你的 PHP4 编译时支持 Zlib。
首先,初始化输出缓冲:
<?php
ob_start();
ob_implicit_flush(0);
?>
然后产生所有的输出内容。
<?php
print("本例为压缩输出!");
?>
页面生成以后,采用:
<?php
$contents = ob_get_contents();
ob_end_clean();
?>
还要检查浏览器是否支持压缩数据,我们采用在变量 $HTTP_ACCEPT_ENCODING 中检查 "gzip, deflate"的办法:
<?php
if(ereg('gzip, deflate',$HTTP_ACCEPT_ENCODING)) {
// 产生 gzip 后的内容
} else {
echo $contents;
}
?>
下面我们分析怎样产生 gzip 输出:
<?php
// 告诉浏览器下面接收的是 gzip 数据。
header("Content-Encoding: gzip");
// 显示 gzip 文件的文件头
// 只要一次就够了
echo "x1fx8bx08x00x00x00x00x00";
// 计算长度和 CRC 校验码
$Size = strlen($contents);
$Crc = crc32($contents);
// 压缩数据
$contents = gzcompress($contents, 9);
我们知道 Zend 有免费的优化引擎针对 PHP 而作,但是 FreeLAMP 这次采用的是一个叫做 PHP Accelerator 的缓冲产品。
  我们在 “LAMP 加速” 这篇文章中阐述过加速的几种办法,其中提到了 PHP Accelerator,它的安装方法十分简单,但是需要去他的网站获取一个激活键。

  一、下载:
  www.php-accelerator.co.uk/download.php
  二、获取激活键并安装:
  www.php-accelerator.co.uk/activate.php
  注册自己的 SERVER_NAME 后,你会得到下面的提示:
  Your key for www.freelamp.com is 8edfd13946c96309244fcca309415902
  Now you must set the key for www.freelamp.com in your site configuration.
  For single domains not using virtual hosts
  The key can be set in the php.ini file as follows:
  # PHPA key for www.freelamp.com
  #
  phpa.registration_key = 8edfd13946c96309244fcca309415902
  For domains setup as a virtual host
  Add the key to the domain specific section for your web server.
  # www.freelamp.com VHost entry
  #
  < VirtualHost 10.20.30.40>
  ServerName www.freelamp.com
  # ... (other vhost specific config)
  # php settings
  php_value phpa.registration_key 8edfd13946c96309244fcca309415902
  # also enable phpa if set to off in the php.ini (the default is on)
  php_value phpa 1
  < /VirtualHost>
  具体的 phpa 值的设置,可以参考软件随带的 CONFIGURATION 文件的配置。
  由于大多数网站是虚拟主机配置,所以,建议采用 php_value phpa. 的方式设置。
  例如:
  php_value phpa.tweaks off
  php_value phpa.cache_dir /tmp
  php_value phpa.file_perms 400
  php_value phpa.ignore_files "/index.php, /a/test.php"
  # php_value phpa.ignore_dirs "/data/WWW/site1/,/cache/"
  php_value phpa.shm_size 8
  php_value phpa.shm_key 0xc0deb00
  php_value phpa.shm_perms 664
  三、设置 php.ini
  假设我们把下载后的文件解开到 /usr/local/php ,那么在 php.ini 中加入:
系统环境:
Redhat 9.0
Apache-1.3.27
Mysql3.23-54a-11
Php-4.32
j2sdk1.4.1_03
安装配置:
1.mysql使用的是redhat9自带的rpm包,不介绍安装了,jdk的安装也很简单,我们把jdk安装到/usr/java/j2sdk1.4.1_03 并在/etc/profile设置jdk环境参数。
2.编译安装apache
tar zvxf apache_1.3.27.tar.gz
cd apache_1.3.27
./configure 自从对php和mysql有了一定的了解之后,我就对公司里庞大的Excel数据库虎视眈眈,想偷偷地"共享"这被保密的商业数据,一边琢磨着怎么搞到手,一边考虑如何转化成mysql数据库,去了很多php站点论坛请教高手,都没有一个结果,某天突发想象,为何不试试这种方法呢?结果也真行,一切Ok,下面我就把我的心得与大家完全共享(可能你有更好的方法)
    1.先介绍一下这个Excel数据库的结构,且命名为E.xls,字段有4个(40个也一样搞掂),字段名为a,b,c,d,接着对jm.xls做分解:
1)选中字段a中的全部记录,选择"复制"
2)新建一个Excel数据库文件,把复制过来的数据粘贴在一个空白的字段(通常是A)下,保证其他字段空白,保存为a.xls
3)另存a.xls为a.txt(格式为"文本文件(制表符分隔)")
4)E.xls中其他3个字段的数据按1到3步骤继续生成b.txt,c.txt和d.txt。
     2.完成上述步骤后,你已经完成了大部分的工作,下面就由php和mysql来完成,很简单:
1)要把数据放在mysql中,必须建立一个mysql数据库文件名为dbname(与php代码中的dbname要一致),包括表tbname(与php代码中的tbname要一致),4个字段inc char(100),adds char(100),pri char(100),tel char(100),大小要根据Excel中字段大小做调整,否则可能出现部分值丢失。
2)再编写php代码,是最主要的,代码如下:
------txt2mysql.php---------
<?
$inc=file("a.txt");
$adds=file("b.txt");
$pri=file("c.txt");
$tel=file("d.txt");
$i=0;
mysql_connect();
while (strlen($inc[$i])>0)
{
$sql="insert into tbname values ('$inc[$i]','$adds[$i]','$pri[$i]','$tel[$i]')";
$do=mysql_db_query("dbname",$sql);
$i=$i+1;
echo '<br>';
}
$s="select * from tbname";
$gg=mysql_db_query("dbname",$s);
$n=mysql_num_rows($gg);
mysql_close();
echo '<br>';
echo "共添加了".$n."个记录";
?>
注意:a.txt,b.txt,c.txt,d.txt和txt2mysql.php要在同一个目录 
数据表参考:
代码:--------------------------------------------------------------------------------
CREATE TABLE `mf_sort` (
`sortid` SMALLINT( 3 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`main` TINYINT( 2 ) UNSIGNED NOT NULL ,
`parentid` SMALLINT( 3 ) UNSIGNED NOT NULL ,
`layer` SMALLINT( 3 ) UNSIGNED NOT NULL ,
`orders` TINYINT( 2 ) UNSIGNED NOT NULL ,
`sort` VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( `sortid` ) ,
INDEX ( `main` , `parentid` , `layer` , `orders` )
);
--------------------------------------------------------------------------------
关键的函数
PHP代码:--------------------------------------------------------------------------------
function get_main_layer_orders($parentid)
{
global $x_db;
$sql = "select `main`, `layer`, `orders` ";
$sql .= "from `mf_sort` ";
$sql .= "where `postid`='$parentid'";
$x_db->exec($sql);
$data = $x_db->get_data();
$layer = $data[0]['layer']+1;
$main = $data[0]['main'];
$orders = $data[0]['orders'];
$sql = "select `sortid` from `mf_sort` ";
$sql .= "where `parentid`='$parentid'";
$x_db->exec($sql);
$n = $x_db->n;
if ($n>0)
{
$lastid = $parentid;
get_lastid($lastid);
$sql = "select `orders` from `mf_sort` ";
$sql .= "where `sortid`='$lastid'";
$x_db->exec($sql);
$data = $x_db->get_data();
$orders = $data[0][0];
$sql = "update `mf_sort` ";
$sql .= "set `orders`=`orders`+1 ";
$sql .= "where `orders`>$orders and `main`='$main'";
$x_db->exec($sql);
$orders = $orders + 1;
return array($main, $layer, $orders);
}
[!--infotagslink--]

相关文章

  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • 微信小程序自定义tabbar组件

    这篇文章主要为大家详细介绍了微信小程序自定义tabbar组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • 微信小程序 网络请求(GET请求)详解

    这篇文章主要介绍了微信小程序 网络请求(GET请求)详解的相关资料,需要的朋友可以参考下...2016-11-22
  • 微信小程序二维码生成工具 weapp-qrcode详解

    这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • Python爬取微信小程序通用方法代码实例详解

    这篇文章主要介绍了Python爬取微信小程序通用方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-29
  • 微信小程序(应用号)开发新闻客户端实例

    这篇文章主要介绍了微信小程序(应用号)开发新闻客户端实例的相关资料,需要的朋友可以参考下...2016-10-25
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20