PHP高级技巧全放送

 更新时间:2016年11月25日 16:31  点击:2291

全球超过300万个互联网网站的治理员都在使用PHP,使得它成为最为普及的服务器端脚本语言之一。其特点是运行速度快、稳定可靠、跨平台,而且是开放源代码软件。随你使用的水平不同,PHP可以很简单,也可以很复杂,可以只使用它发送HTML表格元素,还可以在PHP应用程序中集成Java和XML。
假如你对PHP有一定的了解或者看过一些初步的教材,这些技巧可以扩展你对PHP的熟悉,使你把握一些常见的和高级的PHP功能。
一、把PHP安装为Apache的DSO
PHP在Linux/Unix平台上经常与Apache搭配使用,在安装PHP时,有三种安装方式可供选择:静态模式、动态模式(DSO)、CGI二进制模式。
由于易于维护和升级,我强烈建议以DSO方式安装PHP。例如,初次安装时假如安装的PHP仅支持数据库,随后希望再安装支持加密的模块,只要运行“make clean”,添加新的配置选项,然后再运行“make”和“make install”即可,一个新的PHP模块就会安装在Apache中适当的位置上,然后重新启动Apache,而无需重新编译Apache。
下面的步骤将安装一个全新的Apache,并以DSO方式安装PHP:
1、从Apache软件基金会得到最新版本的Apache源代码;
2、把得到的源代码放到/usr/local/或者/opt/目录下,或者你指定的任意目录中;
3、运行Gunzip对文件进行解压缩,得到后缀为.tar的文件;
4、运行下面的命令,把文件安装到apache_[version]目录中:
tar -xvf apache_[version].tar
5、进入/usr/local/apache_[version]目录(或者在步骤4中安装压缩文件的目录);
6、键入下面的命令为编译Apache作预备,用你自己的路径替换其中的[path],例如,/usr/local/apache[version],现在已经设置了mod_so的新值,它将答应Apache使用DSO模块;
7、回到提示符状态后键入make,并等待再次回到提示符状态;
8、执行“make install”命令。
至此,Apache已经安装完毕,系统将重回到提示符状态。接下来我们开始安装PHP:
1、在PHP主页的下载区中找到最新版本的链接;
2、把文件下载到一个适当的目录中,例如/usr/local/或/opt/或者你指定的任意目录中;
3、运行Gunzip对文件进行解压缩,得到后缀为.tar的文件;
4、执行下面的命令把文件安装在php-[version]目录中:
tar -xvf php-[version]
5、进入/usr/local/php-[version]目录或在步骤4中指定的目录;
至此,已经作好了以DSO方式安装PHP的预备工作,唯一需要修改的配置选项是with-apxs(这是Apache的bin目录中的一个文件)。为了得到较高的性能,我没有安装对MySQL的支持模块。
./configure --with-mysql=/[path to mysql] --with-apxs=/[path to apxs]
6、回到提示符状态后执行make命令,等待重新返回到提示符状态;
7、执行make install命令。
至此,系统以DSO方式在Apache的模块目录中安装了PHP,并对Apache的httpd.conf文件作适当的修改后返回到提示符状态。回到提示符状态后,你还需要对Apache的httpd.conf文件作一些修改。
1、找到包含有ServerAdmin的一行,添加你的电子邮件地址,如下所示:
ServerAdmin you@yourdomain.com
2、找到以ServerName开头的行,把它改为真正的值,例如:
ServerName localhost
3、找到内容如下所示的小节:
# And for PHP 4.x, use:
#
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps
修改这些行的内容,使PHP 4.0的AddType不再成为注释,并添加希望在PHP中使用的文件后缀名,上面的内容变为如下所示的内容:
# And for PHP 4.x, use:
#
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
保存文件,回到上一级目录,执行下面的命令重新启动Apache:
./bin/apachectl start
假如在启动时没有出现错误提示信息,就可以通过创建一个名为phpinfo.php的只有如下所示一行内容的文件,对安装的Apache、PHP进行测试:
<? phpinfo() ?>
把这个文件保存到Apache的文档根目录(htdocs)中,然后开启浏览器,键入http://localhost/phpinfo.php地址,屏幕上就会出现许多的变量和它们的值。
假如要重新配置PHP,需要再次运行make clean命令,然后执行带有一系列选项的./configure命令,然后再执行make和make install命令,Apache的目录模块中就会出现一个新的模块,只要再重新启动Apache加载这个新的模块,就一切OK了。
二、使用PHP本身的对话
PHP 4.0中最令人期待的特性应该是对对话的支持,PHP 3.0的用户必须使用第三方的软件否则就不能使用对话,不支持对话一直是PHP最大的缺憾之一。
只要用户在浏览你的网站,你就可以利用对话维护与特定用户有关的变量,而无需建立多个cookie、使用隐藏表格字段或将信息存储在数据库中。
在一个网页上启动一个对话,就会使PHP引擎知道你想启动一个对话(假如还没有启动)或者继续当前的对话:
session_start();
启动一个对话将通过cookie向用户发送一个识别字符串(例如940f8b05a40d5119c030c9c7745aead9),在服务器端,会创建一个与识别字符串匹配的临时文件,例如sess_940f8b05a40d5119c030c9c7745aead9,这个文件中包含注册的对话变量以及它们的值。
用来显示对话的作用的最常见的例子是访问计数器。启动PHP模块,确保PHP代码是文件的第一行,在PHP代码之前不要有空格、HTML代码和其他的代码。因为对话会发送一个头部,因此假如在session_start()之前有空格和HTML代码,就会得到一个出错信息。
<?
// 假如还不存在一个针对某用户的用户,则启动一个对话:
session_start();
然后注册一个名字为count的变量:
session_register('count');
注册一个对话变量后,只要对话存在,名字为count的变量也就存在。现在,count变量还没有被赋值,假如对它执行加1操作,它的值就变为了1。
$count ;
把上述内容综合在一块儿,假如还没有启动一个对话,就会启动一个对话;假如不存在一个对话id,就为用户指定一个好了,注册一个名字为$count的变量,对$count执行加1操作表示用户已经首次访问了该网页。


要知道用户在当前的对话中访问本页面的次数,只要显示$count变量的值即可:
echo "<P>You've been here $count times.</p>";
全部的访问计数器代码如下所示:
<?
session_start();
session_register('count');
$count ;
echo "<P>You've been here $count times.</p>";
?>
假如重新加载上述的脚本文件,就会发现变量count的值增加了1,很酷吧。

WWW上的交互意味着填表、点击submit按钮,然后得到一个确定的结果。Html和Http提供一个机制来通过表单很轻易地执行这种操作。
PHP用一种非常便利的方法来支持这种机制,每个输入域(译注:表单的输入框)的值被存贮为一个与输入域同名的PHP变量。

一个很相似的机制已经被adobe开发着,但是是为PDF文档。他们简单地叫它Acrobat 表单。 从用户的观点来看,Html表单和Acrobat表
单唯一的不同是它们的外观。前者使用HTML文档,后者使用PDF文档来呈现表单。

要开发WEB界面,Acrobat表单也可以象HTML表单一样被处理,假如这个表单象HTML表单一样提供输入数据。然而,Adobe 已经为表单数
据提出一个新的格式叫FDF(表单数据格式)。PHP已经包含这种格式的支持。

用数据生成一个PDF文档的可能性,如定制它,是Acrobat 表单的附加特性了.用PDF文档作为表单并且在PHP中用数据生成PDF文档将在
这篇文章中被描述。你会发现这两个例了是多么的轻易。

在你开始试这篇文章中的在线例子之前你要安装Acrobat阅读器插件或使用Acrobat 4.假如你想在自己的web服务器上测试php脚本
你也要安装PDF工具包并使PHP中的FDF支持生效。

最后,假如你开发你自己的PDF表单你需要Acrobat Exchange 3.x或Acrobat 4。

在过去的几年中,Adobe已经开发出可便携文档格式(PDF)并且扩展了它。一种扩展是答应用户输入数据并送到服务器中处理的Acrobat
表单,就象HTML表单。
这样的PDF文档与静态的PDF文档很相似,但当你用Acrobat阅读器看它时,你会发现可编辑的区域。
就象HTML中一样有很多输入域有效,例如 提交和重置按钮,文本输入域,检查框等等..
创建这样一个PDF表单需要Acrobat Exchange 3.x或新的Acrobat 4软件,不幸的是它们只能在windows和MacOS中运行。
两者都提供一个方式来放置不同的输入域到一个已存在的PDF文档中。
提交按钮传送在它被按下时调用的URL属性。这非常象HTML,但不同的是在数据被传送到服务器时的格式。
在按下Submit按钮时,数据是用一个在URL中可以被观察的确定格式从HTML表单传输。Acrobat表单支持这种格式,还有FDF(表单数据格式)
FDP是一种新格式,需要FDF工具包(当前版本4.0)解释。假如PHP在编译时加了FDF支持,它就能解析FDF数据并且用名字存取任何输入域。
FDF数据一般被存在PHP的HTTP_RAW_POST_DATA变量中(就象HTML数据存储在HTTP_POAT_DATA中一样)
数据的实际赋值是在PHP脚本中完成的,相反的是HTML提交数据是在PHP引擎中被赋值的。

要想得到一个FDF数据看起来的样子,这儿是一个例子:(译注:从网上拷下的原始文件如此,我也看不清乱码是什么,不过假如放在英文系统中能看清吧)

最近偶的网站越来越慢,不是脚本执行时间慢,是网络传输速度慢。
知道http1.1支持gzip编码的数据,所以试试将自己的页面压缩压缩...
(在php.ini可以设置,直接输出为gzip编码,不过没试过)

上网搜到一个gzdoc.php,改了改,让大家共同琢磨琢磨。
<?php
ob_start();//打开输出缓冲
ob_implicit_flush(0);//

//*****************************************************************//
//函数名:canGzip()
//作用:检查客户浏览器是否支持gzip,x-gzip编码
//参数:
//返回值:支持的编码类型"gzip", "x-gzip", 返回false代表不支持
//*****************************************************************//
function canGzip()
{
//if (headers_sent() || connection_status)
//return false;

if (strpos('King'.$_SERVER["HTTP_ACCEPT_ENCODING"], 'gzip') !== false)
return "gzip";

if (strpos('King'.$_SERVER["HTTP_ACCEPT_ENCODING"], 'x-gzip') !== false)
return "x-gzip";

return false;
}

//*****************************************************************//
//函数名:doGzipOut($level, $debug)
//作用:对输出缓冲的数据进行压缩并输出
//参数:$level代表压缩级别, 0 = 不压缩, 9 = 最大压缩率
// $debug代表是否输出调试信息, 1 = 输出, 0 = 不输出
//返回值:
//*****************************************************************//
function doGzipOut($level = 1, $debug = 0)
{
$ENCODING = canGzip();
if ($ENCODING)
{
echo "n<!-- Use compress $ENCODING -->n";
$contents = ob_get_contents();

禁止屏蔽类

  1.禁止右键

<body oncontextmenu=return(false)>

  2.禁止选择

<body onselectstart="return false">

  3.禁止粘贴

<body onpaste="return false">
 
  4.禁止直接访问 [必须框架内才行]

<script>
if (top == self)top.location.href = "page.htm";
</script>

  5.禁止frame引用

<script>
if (top != self)top.location.href = "page.htm";
</script>

  6.禁止功能键Shift,Alt,Ctrl

<script>function key(){
if(event.shiftKey) alert("Shift不答应使用!");} document.onkeydown=key; </script>

  数据取得类

  1.取得分辨率

<script>document.write("宽为" screen.Width "高为" screen.Height)</script>

  2.取得地址栏

<script>document.write(self.location)</script>

  3.取得地址栏后参数

<SCRIPT>var add = top.location;
add = add.toString();
document.write (add.substring(add.indexOf("?") 1,add.length));
</SCRIPT>

多核CPU中,要很好地发挥出多个CPU的性能的话,必须保证分配到各个CPU上的任务有一个很好的负载平衡。否则一些CPU在运行,另外一些CPU处于空闲,无法发挥出多核CPU的优势来。


  要实现一个好的负载平衡通常有两种方案,一种是静态负载平衡,另外一种是动态负载平衡。


  1、静态负载平衡


  静态负载平衡中,需要人工将程序分割成多个可并行执行的部分,并且要保证分割成的各个部分能够均衡地分布到各个CPU上运行,也就是说工作量要在多个任务间进行均匀的分配,使得达到高的加速系数。


  静态负载平衡问题从数学上来说是一个NP完全性问题,Richard M. Karp, Jeffrey D. Ullman, Christos H. Papadimitriou, M. Garey, D. Johnson等人相继在1972年到1983年间证实了静态负载问题在几种不同约束条件下的NP完全性。


  虽然NP完全性问题在数学上是难题,但是这并不是标题中所说的难题,因为NP完全性问题一般都可以找到很有效的近似算法来解决。


  2、动态负载平衡


  动态负载平衡是在程序的运行过程中来进行任务的分配达到负载平衡的目的。实际情况中存在许多不能由静态负载平衡解决的问题,比如一个大的循环中,循环的次数是由外部输入的,事先并不知道循环的次数,此时采用静态负载平衡划分策略就很难实现负载平衡。


  动态负载平衡中对任务的调度一般是由系统来实现的,程序员通常只能选择动态平衡的调度策略,不能修改调度策略,由于实际任务中存在很多的不确定因素,调度算法无法做得很优,因此动态负载平衡有时可能达不到既定的负载平衡要求。


  3、负载平衡的难题在那里?


  负载平衡的难题并不在于负载平衡的程度要达到多少,因为即使在各个CPU上分配的任务执行时间存在一些差距,但是随着CPU核数的增多总能让总的执行时间下降,从而使加速系数随CPU核数的增加而增加。


  负载平衡的困难之处在于程序中的可并行执行块很多要靠程序员来划分,当然CPU核数较少时,比如双核或4核,这种划分并不是很困难。但随着核数的增加,划分的粒度将变得越来越细,到了16核以上时,估计程序员要为如何划分任务而抓狂。比如一段顺序执行的代码,放到128核的CPU上运行,要手工划分成128个任务,其划分的难度可想而知。


  负载划分的误差会随着CPU核数的增加而放大,比如一个需要16个时间单位的程序分到4个任务上执行,平均每个任务上的负载执行时间为4个时间单位,划分误差为1个时间单位的话,那么加速系数变成 16/(4 1)=3.2,是理想情况下加速系数 4的80%。但是假如放到一个16核CPU上运行的话,假如某个任务的划分误差假如为0.5个时间单位的话,那么加速系数变成16/(1 0.5) = 10.67,只有理想的加速系数16的66.7%,假如核数再增加的话,由于误差的放大,加速系数相比于理想加速系数的比例还会下降。


  负载划分的难题还体现在CPU和软件的升级上,比如在4核CPU上的负载划分是均衡的,但到了8核、16核上,负载也许又变得不均衡了。软件升级也一样,当软件增加功能后,负载平衡又会遭到破坏,又需要重新划分负载使其达到平衡,这样一来软件设计的难度和麻烦大大增加了。


  假如使用了锁的话,一些看起来是均衡的负载也可能会由于锁竞争变得不平衡起来。


  4、负载平衡的应对策略


  对于运算量较小的软件,即使放到单核CPU上运行速度也很快,负载平衡做得差一些并没有太大影响,实际中负载平衡要考虑的是大运算量和规模很大的软件,这些软件需要在多核上进行负载平衡才能较好地利用多核来提高性能。


  对于大规模的软件,负载平衡方面采取的应对策略是发展划分并行块的宏观划分方法,从整个软件系统层面来进行划分,而不是象传统的针对某些局部的程序和算法来进行并行分解,因为局部的程序通常都很难分解成几十个以上的任务来运行。


  另外一个应对策略是在工具层面的,也就是编译工具能够协助人工进行并行块的分解,并找出良好的分解方案来,这方面Intel已经作出了一些努力,但是还需要更多的努力让工具的功能更强大一些才能应对核数较多时的情况。

[!--infotagslink--]

相关文章

  • 源码分析系列之json_encode()如何转化一个对象

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

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • photoshop打开很慢怎么办 ps打开慢的设置技巧

    photoshop软件是一款专业的图像设计软件了,但对电脑的要求也是越高越好的,如果配置一般打开ps会比较慢了,那么photoshop打开很慢怎么办呢,下面来看问题解决办法。 1、...2016-09-14
  • Jquery Ajax Error 调试错误的技巧

    JQuery使我们在开发Ajax应用程序的时候提高了效率,减少了许多兼容性问题,我们在Ajax项目中,遇到ajax异步获取数据出错怎么办,我们可以通过捕捉error事件来获取出错的信息。在没给大家介绍正文之前先给分享Jquery中AJAX参...2015-11-24
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • 图解Sublime Text3使用技巧

    通过本篇文章给大家介绍Sublime Text3使用技巧的相关知识,对sublime text3技巧相关知识感兴趣的朋友一起学习吧...2015-12-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • 基于PHP给大家讲解防刷票的一些技巧

    刷票行为,一直以来都是个难题,无法从根本上防止。但是我们可以尽量减少刷票的伤害,比如:通过人为增加的逻辑限制。基于 PHP,下面介绍防刷票的一些技巧:1、使用CURL进行信息伪造$ch = curl_init(); curl_setopt($ch, CURLOP...2015-11-24
  • 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
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
  • 分享12个非常实用的JavaScript小技巧

    这篇文章主要介绍了分享12个非常实用的JavaScript小技巧,这些小技巧可能在你的实际工作中或许能帮助你解决一些问题,需要的朋友可以参考下...2016-05-14
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

    首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
  • 谈谈PHP中相对路径的问题与绝对路径的使用

    经常看到有人踩在了PHP路径的坑上面了,感觉有必要来说说PHP中相对路径的一些坑,以及PHP中绝对路径的使用,下面一起来看看。 ...2016-08-24
  • Python爬虫必备技巧详细总结

    本篇文章介绍了我在爬虫过程中总结的几个必备技巧,都是经过实验的,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下...2021-10-22
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • PHP如何通过date() 函数格式化显示时间

    这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
  • PHP+jQuery+Ajax实现多图片上传效果

    今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
  • jQuery+PHP+MySQL实现无限级联下拉框效果

    这篇文章主要介绍了jQuery+PHP+MySQL实现无限级联效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-02-21
  • Illustrator像素级完美绘制经验技巧分享

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说像素级完美绘制的经验技巧,各位想知道具体信息的使用者们,那么下面就快来跟着小编一起看一看。 给...2016-09-14