PHP开发一个完整、安全的用户登录系统

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

在使用PHP编程的时候,我有一个习惯,不太喜欢使用现成的库文件,例如PHPLib或者其它类似的库,在这个系统中,我也打算自己写一个库文件,它需要处理认证、确认email,更新帐号(密码,email)等事情。

<?php
     function user_change_email ($password1,$new_email,$user_name) {
      global $feedback,$hidden_hash_var;
      if (validate_email($new_email)) {
        $hash=md5($new_email.$hidden_hash_var);
        file://改变数据库中确认用的无序码值,但不改变email
       file://发出一个带有新认证码的确认email
        $user_name=strtolower($user_name);
        $password1=strtolower($password1);
        $sql="UPDATE user SET confirm_hash=''$hash'' WHERE user_name=''$user_name'' AND password=''". md5($password1) ."''";
        $result=db_query($sql);
        if (!$result || db_affected_rows($result) < 1) {
         $feedback .= '' ERROR - Incorrect User Name Or Password '';
         return false;
         } else {
          $feedback .= '' Confirmation Sent '';
          user_send_confirm_email($new_email,$hash);
          return true;
          }
        } else {
          $feedback .= '' New Email Address Appears Invalid '';
          return false;
         }
        }
     function user_confirm($hash,$email) {
       /*
        用户点击认证email的相关连接时,连到一个确认的页面,该页面会调用这个函数,
       */
      global $feedback,$hidden_hash_var;
       file://verify that they didn''t tamper with the email address
       $new_hash=md5($email.$hidden_hash_var);
       if ($new_hash && ($new_hash==$hash)) {
         file://在数据库中找出这个记录
         $sql="SELECT * FROM user WHERE confirm_hash=''$hash''";
         $result=db_query($sql);
         if (!$result || db_numrows($result) < 1) {
           $feedback .= '' ERROR - Hash Not Found '';
           return false;
         } else {
           file://确认email,并且设置帐号为已经激活
           $feedback .= '' User Account Updated - You Are Now Logged In '';
           user_set_tokens(db_result($result,0,''user_name''));
           $sql="UPDATE user SET email=''$email'',is_confirmed=''1'' WHERE confirm_hash=''$hash''";
           $result=db_query($sql);
     

< 来源:http://www.111cn.net/40316/viewspace_15041.html

许多 PHP 开发人员认为,由于标准的 PHP 缺少线程功能,因此实际 PHP 应用程序不可能执行多任务处理。例如,如果应用程序需要其他 Web 站点的信息,那么在远程检索完成之前它都必须停止。这是错误的!通过本文了解如何使用 stream_select 和 stream_socket_client 实现进程内 PHP 多任务处理。

  PHP 不支持线程。尽管如此,与前述大多数 PHP 开发人员所相信的想法形成对比的是,PHP 应用程序可以 执行多任务处理。让我们开始尽可能清晰地描述一下 “多任务” 和 “线程” 对于 PHP 编程的意义。

  并发的种类

  首先抛开几个和主题无关的例子。PHP 与多任务或并发的关系十分复杂。在较高层次上,PHP 经常涉及多任务:以多任务方式使用 标准的服务器端 PHP 安装 —— 例如,作为 Apache 模块。换句话说,若干个客户机 —— Web 浏览器 —— 可以同时请求同一个 PHP 解释的页面,而 Web 服务器将差不多同时返回所有这些页面。

  一个 Web 页面不会妨碍其他 Web 页面的发送,尽管可能会由于诸如服务器内存或网络带宽之类的受限资源而使它们相互之间略有妨碍。这样,实现并发 的系统级需求可能适合使用基于 PHP 的解决方案。就实现而言,PHP 允许它的管理 Web 服务器负责实现并发。

  Ajax 名下的客户端并发近几年来也已成为开发人员关注的焦点。虽然 Ajax 的含义已经变得十分模糊,但是它的一个方面是浏览器显示可以同时执行计算和保留对诸如选择菜单项之类的用户操作的响应。这实际上就是某种 多任务。用 PHP 编码的 Ajax 就是这样 —— 但是不涉及任何特定的 PHP;用于其他语言的 Ajax 框架均以完全相同的方法操作。

  只粗略地涉及 PHP 的第三个并发实例是 PHP/TK。PHP/TK 是 PHP 的扩展,用于为核心 PHP 提供可移植图形用户界面(GUI)绑定。PHP/TK 允许用 PHP 编写代码构造桌面 GUI 应用程序。其基于事件的特性将模拟一种易于掌握并且比线程更少出错的并发形式。此外,并发是 “继承” 自一项辅助技术,而不是 PHP 的基本功能。

  向 PHP 本身添加线程支持的试验已经做过多次。据我所知,没有一次是成功的。但是,Ajax 框架和 PHP/TK 的面向事件的实现表明事件可能比线程能更好地体现 PHP 的并发。PHP V5 证明事实确实如此。

  PHP V5 将提供 stream_select()

  使用标准的 PHP V4 和更低版本,必须按顺序执行 PHP 应用程序的所有工作。例如,如果程序需要在两个商业站点检索商品的价格,则请求第一个站点的价格,等待至响应到达,再请求第二个站点的价格,然后再次等待。

  如果程序请求同时完成若干项任务会怎么样?总体来看,程序将在一段时间内完成,在这段时间内,将始终进行连续处理。

  第一个示例

  新的 stream_select 函数及它的几个助手使这成为可能。请考虑以下示例。

  清单 1. 同时请求多个 HTTP 页面
<?php
echo "Program starts at ". date(''h:i:s'') . ".n";

$timeout=10;
$result=array();
$sockets=array();
$convenient_read_block=8192;

/* Issue all requests simultaneously; there''s no blocking. */
$delay=15;
$id=0;
while ($delay > 0) {
 $s=stream_socket_client("phaseit.net:80", $errno,
  $errstr, $timeout,
  STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
 if ($s) {
  $sockets[$id++]=$s;
  $http_message="GET /demonstration/delay?delay=" .
   $delay . " HTTP/1.0rnHost: phaseit.netrnrn";
  fwrite($s, $http_message);
 }
< 我们都知道用 php+mysql 在 web 页实现数据库资料全部显示是非常简单而有趣的,数据库资料很少的情况下页面显示还是让人满意的,但是当数据库资料非常多的情况下,页面的显示情况将会变的 非常糟糕,下面就来介绍一下如何实现当前页面数据资料显示数量及如何实现动态的翻转功能.
这里将介绍两种翻页显示功能的实现:
-----------------------------------------------------------
先介绍一下在翻页中用到的数据库语法:
mysql_query("select * from table order by id desc");
这条数据库语句再熟悉不过了,是用来搜索记录并倒序地显示出来,但并不能在翻页功能中起作用,而下面这个扩展了的语法才是实现翻页的核心功能:
mysql_query("select * from table order by id desc limit $start,$limit");
这里的 $start 是数据库搜索的起始行,$limit 是从起始行开始搜索到 $limit 条记录结束,好了,有了这个核心功能后,我们可以开始翻页功能了;
-----------------------------------------------------------
第一种翻页功能:
这里介绍的功能是翻页功能中最简单的一种,只能实现向前翻页和向后翻页,本站的非常新闻和下载中心的翻页功能就是这种.
先介绍翻页功能实现的思路:
先确定当前页固定显示的数据记录数量,假设为 20 条记录,设定 $limit 的值为 20: $limit=20;
显示数据库记录时,必须是从第一条开始显示,所以这里设置 $start 的初始值为 0:$start=0;
而翻页功能的实现依赖 $start 的动态变化,当向后翻页时 $start 规律地加上 $limit:$start+$limit;而向前翻页时 $start 则规律地减去 $limit:$start-$limit;
有了以上的思路后,可以开始设计程序了 page.php:
<?
//设置当前页显示的数量(这个数量可任意设置)
$limit=20;
//初始化数据库搜索起始记录
if (!empty($start)) $start=0;
mysql_connect("localhost","","");
mysql_select_db(database);
//设置数据库记录总数
$result=mysql_query("select * from table");
$num_max=mysql_numrows($result);
$result=mysql_query("select * from table order by id desc limit $start,$limit);

 


总结下php程序效率优化的一些策略:
1.在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;
2.尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;
3.优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);
4.尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);
5.循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);
6.多维数组尽量不要循环嵌套赋值;
7.在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;
8.foreach效率更高,尽量用foreach代替while和for循环;
9.用单引号替代双引号引用字符串;
10.“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;
11.对global变量,应该用完就unset()掉;

以上的策略所涉及的问题,我都在实践中遇到过,用了这些策略,效率提高了不少。试试吧。。。。

以下是一篇关于提高PHP效率的文章,很不错啦:
===================================================================================
榨干 php,提高效率
2006-12-22 14:35

原文地址:http://www.111cn.net/bbs/thread-13409-1-1.html
这篇杂文翻译整理自网络各路文档资料(见最末的参考资料),尤其是 Ilia Alshanetsky (佩服之至) 在多个 php 会议上的演讲,主要是各类提高 php 性能的技巧。为求精准,很多部分都有详细的效率数据,以及对应的版本等等。偷懒,数据就不一一给出了,直接给结论,如果需要看原文档,请到文末「参考资料」部分。橙色标题为推荐部分。

========================================================

静态调用的成员一定要定义成 static  (PHP5 ONLY)

贴士:PHP 5 引入了静态成员的概念,作用和 php 4 的函数内部静态变量一致,但前者是作为类的成员来使用。静态变量和 Ruby 的类变量(class variable)差不多,所有类的实例共享同一个静态变量。

QUOTE:
// php CODE Highliting for CU by dZ902

<?php
class foo {
    function bar() {
        echo ''foobar'';
    }
}

$foo = new foo;

// instance way

$foo-
<

前言

PHP 本身已经是一种非常快速的语言,不过除了执行速度,PHP仍然有许多可以被优化的地方。

       在本文中我们将介绍一下几点:

1.         为什么PHP中优化的有许多因素是和代码没有关系的

2.         在提升PHP性能的过程中,为什么我们还需要了解更多的关于其它方面的知识

3.         这些子系统导致瓶颈的原因以及解决的方法

4.         我们还讨论如何调整以及优化PHP代码使其拥有更佳的性能

达到高性能

       当我们谈论高性能时,我们并不仅仅指一个PHP脚本运行的有多么快速,性能是指速度和可伸缩性的折中权衡。使用较少资源的脚本因该会比另一个使用了缓存的脚本要慢,但是在web服务器中,某一时刻可能运行同一个脚本的多个拷贝。

       在下面的例子中,我们假设脚本a.php是一位跑得十分快速赛跑选手,而b.php是一位马拉松长跑健将,他的速度是基本不变的。在负载较轻时,a.php 运行的要比b.php快,然而随着web服务器的负载不断增加,b.php的性能只是降低了一些,而a.php却大势已去!

      

    现在我们以一个现实中的例子来解释上面发生的情况。我们要写一个PHP脚本,它从一个250k的文件中读取数据,并且生成一个HTML文件。为了便于比较,我们写了两个实现同样功能脚本:“hare.php 将文件一次性读入内存,并且一次性处理所有的数据;“tortoise.php 一次只从文件中读取一行,并且决不在内存中保留多于一行的信息。结果是tortoise.php因为使用了更多的系统调用而明显的慢与hare.php

       脚本hare.php要求有0.04秒的CPU时间和10M的内存,tortoise.php要求有0.05秒的CPU是时间和5M的内存。此时Web服务器有100M的物理内存,和99%的空闲CPU。为了简化问题,我们不考虑内存碎片的情况。

       当有10个脚本被同时运行时,hare.php将会占用掉所有的内存(10M×10100M,tortoise.php则可以剩下50M的空闲内存。如果第11个脚本要在服务器中运行,hare.php将不得不使用虚拟内存,这可能导致其速度降低一半,这时所有对hare.php的请求都将使用0.88秒的CPU时间,与此同时,tortoise.php将仍然使用0.06秒的CPU时间。

       下表中较快的PHP脚本使用了粗体以示区别:

连接数

 

1HTTP连接时的CPU时间

10HTTP连接时的CPU时间

11HTTP连接时的CPU时间

hare.php

0.04

 

0.40

 

0.88
(
使用了虚拟内存)

tortoise.php

0.06

0.06

0.66

 

上面的例子说明:提供好的性能并不是仅仅指编写一个快速的PHP脚本。实现高性能的PHP还要求对底层硬件、操作系统、以及常用的配套软件像web服务器和数据库系统都有良好的认识。

 

SyntaxHighlighter.highlight();

[!--infotagslink--]

相关文章

  • php 获取用户IP与IE信息程序

    php 获取用户IP与IE信息程序 function onlineip() { global $_SERVER; if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP');...2016-11-25
  • 详解前端安全之JavaScript防http劫持与XSS

    作为前端,一直以来都知道HTTP劫持与XSS跨站脚本、CSRF跨站请求伪造。防御这些劫持最好的方法是从后端入手,前端能做的太少。而且由于源码的暴露,攻击者很容易绕过防御手段。但这不代表我们去了解这块的相关知识是没意义的,本文的许多方法,用在其他方面也是大有作用。...2021-05-24
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • php根据用户语言跳转相应网页

    当来访者浏览器语言是中文就进入中文版面,国外的用户默认浏览器不是中文的就跳转英文页面。 <&#63;php $lan = substr(&#8194;$HTTP_ACCEPT_LANGUAGE,0,5); if ($lan == "zh-cn") print("<meta http-equiv='refresh' c...2015-11-08
  • php有效防止同一用户多次登录

    【问题描述】:同一用户在同一时间多次登录如果不能检测出来,是危险的。因为,你无法知道是否有其他用户在登录你的账户。如何禁止同一用户多次登录呢? 【解决方案】 (1) 每次登录,身份认证成功后,重新产生一个session_id。 s...2015-11-24
  • js检测用户输入密码强度

    一个用Javascript检测用户输入密码强度的效果代码,以下代码主要是从以下四个方面检测用户输入的密码的强度的,有兴趣的朋友可以自己添加或修改成自己想要的形式! 1. 如果输入的密码位数少于5位,那么就判定为弱。 2. 如果...2015-10-23
  • vue实现用户登录切换

    这篇文章主要为大家详细介绍了vue实现用户登录切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-22
  • 安全地关闭MySQL服务的教程

    普通关闭 我的mysql是自己下载的tar包,自己设定安装目录来安装的。停止mysql服务,说来简单,但不知道的话,还真是挠头。在这和mysql入门的同学们共享:)正确方法是,进入mysql的bin目录下,然后执行./mysqladmin -uroot -p shut...2015-11-24
  • php ajax注册验证用户名是否存在代码

    这是注册程序是一款当用户输入完用户名是,就会自动去数据库中查询用户要注册的用户名是否己经被注册了,如果是返回提示否则提示可以注册。 conn.php文件 代...2016-11-25
  • C#实现线程安全的简易日志记录方法

    这篇文章主要介绍了C#实现线程安全的简易日志记录方法,比较实用的功能,需要的朋友可以参考下...2020-06-25
  • 微信小程序用户授权最佳实践指南

    这篇文章主要给大家介绍了关于微信小程序用户授权最佳实践的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-08
  • apache中配置整合tomcat环境与安全配置

    系统:centos 5.9 环境:apache 2.2.25 tomcat 7.0.42 jdk 1.7.0 1.安装apache 我这里是直接yum安装的,如果你们要编译安装也不是不行. 代码如下 ...2016-01-28
  • PHP中如何使用session实现保存用户登录信息

    session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦。使用session保存页面登录信息1、数据库连接...2015-10-21
  • 简单php cookie用户登录实例

    cookie 的用途之一是存储用户在特定网站上的密码和 id。另外,也用于存储起始页的首选项。在提供个人化查看的网站上,将要求阁下的网络浏览器利用阁下计算机硬驱上的少量...2016-11-25
  • 超详细的php用户注册页面填写信息完整实例(附源码)

    注册页面是大多数网站必备的页面,所以很有必要对自己的注册页面做些精心的设计。下面三张图,第一张是注册的展示页面,第二张思维导图就一个简单的逻辑,第三张是通过firebug查看调用的JS文件。 一、给每个输入框写下说明在...2015-11-24
  • MySQL验证用户权限的方法

    知识归纳因为MySQL是使用User和Host两个字段来确定用户身份的,这样就带来一个问题,就是一个客户端到底属于哪个host。 如果一个客户端同时匹配几个Host,对用户的确定将按照下面的优先级来排 基本观点越精确的匹配越优先...2015-11-08
  • sqlserver添加sa用户和密码的实现

    这篇文章主要介绍了sqlserver添加sa用户和密码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-07
  • 如何有效提高网站的用户回头率

    第一,网站的内容;请各位站长朋友不要一天到晚只想着出什么好的绝招来推广网站,却忽略了网站的内容;其实网站的内容是极为重要的,因为这是你的本,你的根!网站的内容只有不断...2017-07-06
  • MySQL数据库安全设置和常用管理方式

    当你第一次在机器上安装MySQL时,mysql数据库中的授权表是这样初始化的:你可以从本地主机(localhost)上以root连接而不指定口令。root用户拥有所有权限(包括管理权限) 并可做任何事情。...2013-09-19
  • mysql误删root用户恢复方法

    装完数据库清理一些默认账号的时候不小心把root删除了,flush privileges 之后的新 root 忘了grant任何权限,查看mysqld选项里面有个 &#8722;&#8722;skip-grant-tables复制代码 代码如下: #/usr/libexec/mysqld --verbos...2015-03-15