当前位置:  编程技术>php
本页文章导读:
    ▪精通php的十大要点(上)       1. 在合适的时候使用PHP - Rasmus Lerdorf没有谁比PHP的创建者Rasmus Lerdorf明白PHP用在什么地方是更合理的, 他于1995年发布了PHP这门语言,从那时起,PHP就像燎原之火,烧遍了整个开发阵营,改变.........
    ▪用mysql内存表来代替php session的类       代码如下:<?php /** @Usage: use some other storage method(mysql or memcache) instead of php sessoin @author:lein @Version:1.0 */ session_start(); if(!isset($_SESSION['test'])){ $_SESSION['test']="123_lein_".date("Y-m-d H:i:s"); } class session.........
    ▪PHP 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)       代码如下:// +----------------------------------------------------------------------+ // | Willko Framework | // +----------------------------------------------------------------------+ // | Copyright (c) 2008-2009 Willko Cheng | // +------------.........

[1]精通php的十大要点(上)
    来源: 互联网  发布时间: 2013-11-30

1. 在合适的时候使用PHP - Rasmus Lerdorf
没有谁比PHP的创建者Rasmus Lerdorf明白PHP用在什么地方是更合理的, 他于1995年发布了PHP这门语言,从那时起,PHP就像燎原之火,烧遍了整个开发阵营,改变了互联网的世界。 可是, Rasmus并不是因此而创建PHP的。 PHP是为了解决web开发者的实际问题而诞生的。

和许多开源项目一样,PHP变得流行,流行的动机并不能用正常的哲学来进行解释,甚至流行得有些孤芳自赏。它完全可以作为一个案例,一个解决各种web问题的工具需求所引起的案例,因此当PHP刚出现的时候,这种工具需求全部聚焦到PHP的身上。

 

但是,你不能奢望PHP可以解决所有问题。Lerdorf是第一个承认PHP只是一种工具的人,并且PHP也有很多力所不能及的情况。

根据工作的不同来选择合适的工具。我跑了很多家公司,为了说服他们部署和使用PHP,但是这并不意味着PHP对所有问题都适用。它只是可以一个解决大部分问题的front-end脚步语言。

作为一个web开发者,尝试用PHP解决所有问题是不科学的,同时也会浪费你的时间。当PHP玩不转的时候,不要犹豫,试用一下其他的语言吧。

2. 使用多表存储提高规模伸缩性 - Matt Mullenweg

没有人愿意质疑Matt Mullenweg在PHP方面的权威性,他开发了这个星球上最流行的blog系统,(依靠一个强大的社区力量支持): Wordpress. 创建Wordpress以后,Matt和他的团队启动了Wordpress.com平台,一个基于Wordpress MU的免费blog站点。现在,Wordpress.com已经拥有大约400万用户, 这些用户每天提供超过 140,000篇的日志。 (要查看更多Wordpress.com的统计情况,请点击这里.)

如果有人知道如何让网站的规模伸缩自如,这个人一定是Matt Mullenweg。2006年的时候 Matt对Wordpress的数据结构进行了前瞻性的改进,并且解释了为什么Wordpress MU对每个blog使用独立的MYSQL表格, 而不是把所有的blog数据都塞进一个巨大的表格。

我们测试过这个方法,但是发现如果要扩展它的伸缩性,代价太高。如果用一个整体的数据结构,在大流量面前,你将会面临服务器硬件的问题。在MU里面。用户们都被分布到独立的表格当中,并且可以轻易地组织起来。举个例子,WordPress.com把用户的数据分散存储到4096个数据库中,这些数据库可以分散大规模的数据访问,实现流量和压力分流。

数据表的可迁移性让代码(blog)可以运行得更快,并且让系统具备更强的伸缩性。依靠强大的缓存策略和灵活的数据库运用策略, Matt向人们展示了时下最流行的Facebook和Wordpress.com都可以在PHP下稳定运行,并且处理惊人的访问量。

3. 千万不要相信用户 - Dave Child

Dave Child是 Added Bytes (previously ilovejackdaniels.com) 网站的核心人物,这个网站以他出色的《cheat sheets for many programming languages》而闻名。 Dave为很多英国的公司服务,并且已经在编程世界里树立起相当的权威。

Dave为PHP开发者提供了很多深谋远虑的建议,并总结成了《writing secure code in PHP》:千万不要相信你的用户,他们甚至可能会伤害你。

有一条web开发的基本原则,我重复多少遍都觉得不够,那就是:千万不要相信你的用户,同时要假设你网站中的每个数据单元都是从用户那里收集来的恶意代码。很多时候,你必须用javascript在客户端检验表单提交过来的内容, 如果你习惯了如此,那么,这是一个好习惯。如果安全性对你来说很重要,这就是最重要最需要学习的原则。

Dave目前正致力于为它的《Writing Secure PHP》系列书籍整理实例,书的最后他说:

最后,变得偏执一点吧。除非你认为你的站点永远不会受到攻击,否则就正视所有的问题,当问题真正发生的时候,你的情况会变得很糟。你需要把每个用户都看成会带来一场攻防站的黑客,想尽一切办法来保护站点的安全,同时想好相应问题的解决方案。

4. 多使用PHP缓存 - Ben Balbo

Ben Balbo开发了Site Point,一个为developers和designers提供指导的网站。他是墨尔本PHP开发和开源俱乐部的成员, 因此他对PHP有一定的了解,同时对PHP caching有一定的想法和经验。

如果你拥有一个访问量很大,但更新并不频繁的站点(比如blog,基于某种CMS),或许它需要进行一些改造,这些改造不会花费太多的时间,但是对性能有突出的贡献。 如果要为一个复杂/更新频率很快的站点建立缓存机制,过程可能会很曲折,但是好处也是显而易见的。

PHP缓存技术有很多种,Ben为我们推荐了如下一些:

缓存函数的运行结果
设置过期时间
缓存IE下载的文件
模板缓存技术
Cache_Lite

由于PHP作为动态语言的特性,缓存机制对于更新频率并不快的站点来说非常重要。

5. 使用IDE, Templates和Snippets加速PHP开发 - Chad Kieffer

当Chad Kieffer从UI设计和数据库优化的工作中抽身出来的时候,他会在他的博客2 tablespoons上分享很多技术经验。由于Chad多方面的全面发展,他经常可以发现其他程序员不能发现的问题,并形成相关经验,尤其是他开发网站的方法。他参与了网站开发的各个环节,因此他的建议对于提高网站开发的大局观非常有用。

Chad认为使用Eclipse PDT
(Eclipse's PHP development package) 这样的IDE,同时使用一些模板技术和开源项目可以有效地提高PHP的开发速度。

紧凑的计划,长长的to do lists以及deadlines让开发人员非常苦闷。不过有些功能,比如Eclipse Templates,可以有效减少编码的时间和出错的几率。

通常来说,任何项目都可以自动化,自动化程度越高, 你完成项目的时间就越短。花时间来开发使用频率很高的框架和模板,将会节省你以后更多时间。同时,使用像Eclipse and the PDT package这样的IDE,你会发现效率得到明显提高,IDE可以自动闭合,补全分号并且可以在本地debug。

Related posts:

  • wordpress成功升级到2.3.2 虽然tag对我来说没什么用,但是着眼于安全性,我还是升级了,从两年前的2.0.5升级到现在的2.3.2,着实需要一份勇气和决心,幸好在本地跑升级的时候没有出现任何问题,只是模板上的功能需要一些简单的修改。 线上的升级一切顺利,很多人会纳闷,你刚才不是还发post求助升级办法么? 嗯,我已经找到了最好的工具,WordPress Automatic Upgrade plugin 这款wordpress的自动升级插件真正让你升级无忧,因为它会在升级之前为你备份所有的文件和数据,用起来也是“一路next”型,相信很适合那些不想为升级烦心的blogger们,不过有个问题,升级以后的export功能出现问题,提示找不到wp-config.php,不知道是普遍有此问题还是我blog的问题,遇到同样问题的朋友请给我留言,我来研究一下解决办法。(经过研究发现,原来是coolcode插件中访问路径的问题,只要取消此插件的激活,Export功能就可以正常使用了) ...
  • 谁有从Wordpress2.0升级的经历 今天下载了wordpress-2.3.2,本来想升级,但是发现版本跨越不小,数据结构变化貌似不小,升级比较麻烦,风险太大,所以暂时放弃,哪位朋友有从wordpress2.0升到2.3的经验,分享一下吧,感激不尽。 ...
  • 翻译:《14个绝佳的站长工具》(下) 原文:http://www.conversion-rate-experts.com/articles/understanding-your-visitors/ 此文是由Andrew(http://www.achome.cn)自主翻译的,如需转载请注明出处。 用户是最好的宣传和销售人员,来听听他们是如何宣传的吧,Tell-a-Friend King—立即体验! 你是否拥有一个用户推荐的系统?一个可以让用户发信邀请朋友的系统。我们可以看到, 这些用户发的信里面包含“为什么用户在您的网站上消费”这个问题的答案。很多人花费大量的时间来进行自我定位和制定吸引人的广告词,但通过用户的推荐信,你就可以找到用户为什么青睐你的原因。 轻松收集用户反馈, Kampyle—立即体验! Kampyle可以让用户在你的网站上提交用户反馈(通过页面底部的一个小button),点击以后会弹出一个窗口让用户填写他们的意见和建议。 站长们可以登录Kampyle的官网去查看和管理收集到的用户反馈,如果用户留下了email地址,站长们还可以轻易地通知用户,他们已经收到反馈并将进行相应的改进。...

  •     
    [2]用mysql内存表来代替php session的类
        来源: 互联网  发布时间: 2013-11-30
    代码如下:

    <?php
    /**
    @Usage: use some other storage method(mysql or memcache) instead of php sessoin
    @author:lein
    @Version:1.0
    */
    session_start();
    if(!isset($_SESSION['test'])){
    $_SESSION['test']="123_lein_".date("Y-m-d H:i:s");
    }

    class session{

    //session data
    private $data;
    //engine,mysql or memcache
    private $engine;
    //php session expire time
    private $sessionexpiredTime;
    //current user's session cookie value
    private $sessionID;

    public function session($engineBase=NULL,$engineName='mysql',$storage_name='php_session'){
    try{
    $this->sessionexpiredTime = intval(ini_get("session.cache_expire"))*60;
    }catch(Exception $Exception){
    $this->sessionexpiredTime = 1200;
    }
    @session_start();
    $this->sessionID=session_id();
    $className = $engineName."SessionEngine";
    $this->engine = new $className(
    array(
    'storage_name'=>$storage_name,//mysql table name or memcahce key which stores data;
    'expire_time'=>$this->sessionexpiredTime,
    'data_too_long_instead_value' => '{__DATA IS *$* TO LONG__}'
    ),
    $this->sessionID,
    &$engineBase
    );
    $this->init();
    $this->engine->refresh();
    $this->engine->cleanup();
    }
    private function init()
    {
    $this->data = $this->engine->get();
    if(emptyempty($this->data)&&!emptyempty($_SESSION)){
    $this->data = $_SESSION;
    $this->engine->create(false, $this->data);
    }
    else if(emptyempty($this->data))
    {
    $this->engine->create(false, $this->data);
    }
    }
    private function __get($nm)
    {
    if (isset($this->data[$nm])) {
    $r = $this->data[$nm];
    return $r;
    }
    else
    {
    return NULL;
    }
    }
    private function __set($nm, $val)
    {
    $this->data[$nm] = $val;
    $this->engine->set(false, $this->data);
    }
    function __destruct(){
    $this->data = NULL;
    $this->engine->close();
    $this->engine = NULL;
    }
    }

    interface SessionEngine
    {
    /*
    * set varibles
    * @param $arr array,array(varible name=>varible value,...)
    */
    public function setVariable($arr);
    /*
    * get session value
    * @param $key string
    */
    public function get($key="");
    /*
    * set session value
    * @param $key string
    * @param $value string
    */
    public function set($key="",$value="");
    /*
    * set session value
    * @param $key string
    * @param $value string
    */
    public function create($key="",$value="");
    /*
    * update the session's invalid time
    * @param $key string
    */
    public function refresh($key="");
    /*
    * close mysql or memcache connection
    */
    public function close();
    /*
    * delete expired sessions
    */
    public function cleanup();
    }

    final class mysqlSessionEngine implements SessionEngine{
    private $id="";
    private $storage_name='php_session';
    private $storage_name_slow='php_session_slow';
    private $data_too_long_instead_value = '{__DATA IS ~ TO LONG__}';//if data is longer than $max_session_data_length and you are using mysql 4 or below,insert this value into memery table instead.
    private $expire_time=1200;
    private $max_session_data_length = 2048;
    private $conn;
    private $mysql_version;
    public function mysqlSessionEngine($arr=array(),$key="",&$_conn){
    $this->setVariable($arr);
    $this->id = $key;
    if(emptyempty($this->id)||strlen($this->id)!=32){
    throw new Exception(__FILE__."->".__LINE__.": Session's cookie name can't be empty and it must have just 32 charactors!");
    }
    $this->conn = $_conn;
    if(!$this->conn||!is_resource($this->conn)){
    throw new Exception(__FILE__."->".__LINE__.": Need a mysql connection!");
    }
    $this->mysql_version = $this->getOne("select floor(version())");
    if($this->mysql_version<5){
    $this->max_session_data_length = 255;
    }
    }
    public function setVariable($arr){
    if(!emptyempty($arr)&&is_array($arr)){
    foreach($arr as $k=>$v){
    $this->$k = $v;
    if($k=='storage_name'){
    $this->storage_name_slow = $v.'_slow';
    }
    }
    }
    }
    public function get($key=""){
    if($key=="") $key = $this->id;
    $return = $this->getOne('select value from '.$this->storage_name.' where id="'.$key.'"');
    if($return==$this->data_too_long_instead_value)
    {
    $return = $this->getOne('select value from '.$this->storage_name_slow.' where id="'.$key.'"');
    }
    if(!$return)
    {
    $mysqlError = mysql_error($this->conn);
    if(strpos($mysqlError,"doesn't exist")!==false)
    {
    $this->initTable();
    }
    $return = array();
    }
    else
    {
    $return = unserialize($return);
    }
    return $return;
    }
    public function close(){
    @mysql_close($this->conn);
    }
    public function cleanup(){
    if($this->mysql_version>4){
    $sql = 'delete from '.$this->storage_name.' while date_add(time,INTERVAL '.$this->expire_time.' SECOND)<CURRENT_TIMESTAMP()';
    }else{
    $sql = 'delete from '.$this->storage_name.' while time+'.$this->expire_time.'<unix_timestamp()';
    }
    $this->execute($sql);
    }
    public function refresh($key=""){
    if($this->mysql_version>4){
    $sql = 'update '.$this->storage_name.' set time=CURRENT_TIMESTAMP() where id="'.$key.'"';
    }else{
    $sql = 'update '.$this->storage_name.' set time=unix_timestamp() where id="'.$key.'"';
    }
    $return = $this->execute($sql);
    if(!$return){
    $this->initTable();
    $return = $this->execute($sql,true);
    }
    return $return;
    }
    public function create($key="",$value=""){
    if($key=="") $key = $this->id;
    if($value != "") $value = mysql_real_escape_string(serialize($value),$this->conn);
    if(strlen($value)>$this->max_session_data_length) throw new Exception(__FILE__."->".__LINE__.": Session data is long than max allow length(".$this->max_session_data_length.")!");
    if($this->mysql_version>4){
    $sql = 'replace into '.$this->storage_name.' set value=\''.$value.'\',id="'.$key.'",time=CURRENT_TIMESTAMP()';
    }else{
    $sql = 'replace into '.$this->storage_name.' set value=\''.$value.'\',id="'.$key.'",time=unix_timestamp()';
    }
    $return = $this->execute($sql);
    if(!$return){
    $this->initTable();
    $return = $this->execute($sql,true);
    }
    return $return;
    }
    public function set($key="",$value=""){
    if($key=="") $key = $this->id;
    if($value != "") $value = mysql_real_escape_string(serialize($value),$this->conn);
    $sql = 'update '.$this->storage_name.' set value=\''.$value.'\' where id="'.$key.'"';
    if(strlen($value)>$this->max_session_data_length)
    {
    if($this->mysql_version>4){
    throw new Exception(__FILE__."->".__LINE__.": Session data is long than max allow length(".$this->max_session_data_length.")!");
    }
    $sql = 'replace into '.$this->storage_name_slow.' set value=\''.$value.'\',id="'.$key.'",time=unix_timestamp()';
    $this->execute($sql,true);
    $sql = 'update '.$this->storage_name.' set value=\''.$this->data_too_long_instead_value.'\' where id="'.$key.'"';
    }
    $return = $this->execute($sql);
    if(!$return){
    $this->initTable();
    $return = $this->execute($sql,true);
    }
    return $return;
    }
    private function initTable(){
    if($this->mysql_version>4){
    $sql = "
    CREATE TABLE if not exists `".$this->storage_name."` (
    `id` char(32) NOT NULL default 'ERR',
    `value` VARBINARY(".$this->max_session_data_length.") NULL,
    `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `time` (`time`)
    ) ENGINE=MEMORY;
    ";
    }else{
    $sqlSlow = "
    CREATE TABLE if not exists `".$this->storage_name."_slow` (
    `id` char(32) NOT NULL default 'ERR',
    `value` text NULL,
    `time` int(10) not null default '0',
    PRIMARY KEY (`id`),
    KEY `time` (`time`)
    ) ENGINE=MyISAM;
    ";
    $this->execute($sqlSlow,true);

    $sql = "
    CREATE TABLE if not exists `".$this->storage_name."` (
    `id` char(32) NOT NULL default 'ERR',
    `value` VARCHAR(255) NULL,
    `time` int(10) not null default '0',
    PRIMARY KEY (`id`),
    KEY `time` (`time`)
    ) ENGINE=MEMORY;
    ";
    }
    return $this->execute($sql,true);
    }
    private function execute($sql,$die=false)
    {
    if($die)
    {
    mysql_query($sql,$this->conn) or die("exe Sql error:<br>".mysql_error()."<br>".$sql."<hr>");
    }
    else
    {
    mysql_query($sql,$this->conn);

    if(mysql_error()){
    return false;
    }else{
    return true;
    }
    }
    }
    private function getOne($sql,$die=false){
    $rs = $this->query($sql,$die);
    if($rs && ($one = mysql_fetch_row($rs)) ){
    return $one[0];
    }else{
    return false;
    }
    }
    private function query($sql,$die=false){
    if($die)
    $rs = mysql_query($sql,$this->conn) or die("query Sql error:<br>".mysql_error()."<br>".$sql."<hr>");
    else
    $rs = mysql_query($sql,$this->conn);
    return $rs;
    }
    }

    $lnk = mysql_connect('localhost', 'root', '123456')
    or die ('Not connected : ' . mysql_error());

    // make foo the current db
    mysql_select_db('test', $lnk) or die ('Can\'t use foo : ' . mysql_error());
    $S = new session($lnk);
    if(!$S->last){
    $S->last = time();
    }
    echo "First visit at ".$S->last."<br>";
    if(!$S->lastv){
    $S->lastv = 0;
    }
    $S->lastv++;
    echo "lastv=".$S->lastv."<br>";
    echo "test=".$S->test."<br>";
    if(isset($_GET['max'])){
    $S->boom = str_repeat("OK",255);
    }
    if(isset($_GET['boom'])){
    $S->boom = $_GET['boom'];
    }
    echo "boom=".$S->boom."<br>";
    ?>

        
    [3]PHP 加密/解密函数 dencrypt(动态密文,带压缩功能,支持中文)
        来源: 互联网  发布时间: 2013-11-30
    代码如下:

    // +----------------------------------------------------------------------+
    // | Willko Framework |
    // +----------------------------------------------------------------------+
    // | Copyright (c) 2008-2009 Willko Cheng |
    // +----------------------------------------------------------------------+
    // | Authors: Willko Cheng <willko@foxmail.com> |
    // +----------------------------------------------------------------------+
    // $string 明文 或 密文
    // $isEncrypt 是否加密
    // $key 密匙
    // 采用SHA1生成密匙簿,超过300个字符使用ZLIB压缩
    function dencrypt($string, $isEncrypt = true, $key = KEY_SPACE) {
    if (!isset($string{0}) || !isset($key{0})) {
    return false;
    }

    $dynKey = $isEncrypt ? hash('sha1', microtime(true)) : substr($string, 0, 40);
    $fixedKey = hash('sha1', $key);

    $dynKeyPart1 = substr($dynKey, 0, 20);
    $dynKeyPart2 = substr($dynKey, 20);
    $fixedKeyPart1 = substr($fixedKey, 0, 20);
    $fixedKeyPart2 = substr($fixedKey, 20);
    $key = hash('sha1', $dynKeyPart1 . $fixedKeyPart1 . $dynKeyPart2 . $fixedKeyPart2);

    $string = $isEncrypt ? $fixedKeyPart1 . $string . $dynKeyPart2 : (isset($string{339}) ? gzuncompress(base64_decode(substr($string, 40))) : base64_decode(substr($string, 40)));

    $n = 0;
    $result = '';
    $len = strlen($string);

    for ($n = 0; $n < $len; $n++) {
    $result .= chr(ord($string{$n}) ^ ord($key{$n % 40}));
    }
    return $isEncrypt ? $dynKey . str_replace('=', '', base64_encode($n > 299 ? gzcompress($result) : $result)) : substr($result, 20, -20);
    }

        
    最新技术文章:
    ▪PHP函数microtime()时间戳的定义与用法
    ▪PHP单一入口之apache配置内容
    ▪PHP数组排序方法总结(收藏)
    ▪php数组排序方法大全(脚本学堂整理奉献)
    ▪php数组排序的几个函数(附实例)
    ▪php二维数组排序(实例)
    ▪php根据键值对二维数组排序的小例子
    ▪php验证码(附截图)
    ▪php数组长度的获取方法(三个实例)
    ▪php获取数组长度的方法举例
    ▪判断php数组维度(php数组长度)的方法
    ▪php获取图片的exif信息的示例代码
    ▪PHP 数组key长度对性能的影响实例分析
    ▪php函数指定默认值的方法示例
    ▪php提交表单到当前页面、提交表单后页面重定...
    ▪php四舍五入的三种实现方法
    ▪php获得数组长度(元素个数)的方法
    编程技术>php iis7站长之家
    ▪php数学函数的简单示例代码
    ▪php字符串函数的简单示例代码
    ▪php文件下载代码(多浏览器兼容、支持中文文...
    ▪php实现文件下载、支持中文文件名的示例代码...
    ▪php文件下载(防止中文文件名乱码)的示例代码
    ▪解决PHP文件下载时中文文件名乱码的问题
    ▪php数组去重(一维、二维数组去重)的简单示例
    ▪php小数点后取两位的三种实现方法
    ▪php Redis 队列服务的简单示例
    ▪PHP导出excel时数字变为科学计数的解决方法
    ▪PHP数组根据值获取Key的简单示例
    ▪php数组去重的函数代码示例
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3