首页 > 编程技术 > php

5个PHP性能优化的编程习惯

发布时间:2016-11-25 15:39

在网上搜索了一下编程优化我们都会看到大量的文章,但都是一样的内容,下面我来给各位整理了我觉得最有用的5个PHP性能优化的编程习惯分享给各位,希望文章能给各位带来帮助哦。

1. 不要随便就复制变量
    有时候为了使 PHP 代码更加整洁,一些 PHP 新手(包括逐风自己)会把预定义好的变量复制到一个名字更简短的变量中,其实这样做的结果是增加了一倍的内存消耗,只会使程序更加慢。试想一下,在下面的例子中,如果用户恶意插入 512KB 字节的文字到文本输入框中,这样就会导致 1MB 的内存被消耗!

 代码如下 复制代码
坏习惯:
$description = $_POST['description'];
echo $description;
可以写成:
echo $_POST['description'];

2. 对字符串使用单引号
    PHP 引擎允许使用单引号和双引号来封装字符串变量,但是这个是有很大的差别的!使用双引号的字符串告诉 PHP 引擎首先去读取字符串内容,查找其中的变量,并改为变量对应的值。一般来说字符串是没有变量的,所以使用双引号会导致性能不佳。最好是使用字符串连接而不是双引号字符串。

 代码如下 复制代码
坏习惯:
$output = "This is a plain string";
可以写成:
$output = 'This is a plain string';
坏习惯:
$type = "mixed";
$output = "This is a $type string";
可以写成:
$type = 'mixed';
$output = 'This is a ' . $type .' string';

3. 使用 echo 函数来输出字符串
    使用 echo() 函数来打印结果出了有更容易阅读之外,在下个例子中,你还可以看到有更好的性能。
坏习惯:

 代码如下 复制代码
print($myVariable);
可以写成:
echo $myVariable;

4. 不要在 echo 中使用连接符
   很多 PHP 程序员(有包括逐风自己)不知道在用 echo 输出多个变量的时候,其实可以使用逗号来分开的,而不必用字符串先把他们先连起来,如下面的第一个例子中,由于使用了连接符就会有性能问题,因为这样就会需要 PHP 引擎首先把所有的变量连接起来,然后在输出,而在第二个例子中,PHP 引擎就会按照循序输出他们。

 代码如下 复制代码
坏习惯:
echo 'Hello, my name is' . $firstName . $lastName . ' and I live in ' . $city;
可以写成:
echo 'Hello, my name is' , $firstName , $lastName , ' and I live in ' , $city;

5. 使用 switch/case 代替 if/else
    对于只有单个变量的判断,使用 switch/case 语句而不是 if/else 语句,会有更好的性能,并且代码更加容易阅读和维护。
坏习惯:

 代码如下 复制代码
if($_POST['action'] == 'add') {
  addUser();
} elseif ($_POST['action'] == 'delete') {
  deleteUser();
} elseif ($_POST['action'] == 'edit') {
  editUser();
} else {
  defaultAction();
}
可以写成:
switch($_POST['action']) {
case 'add':
  addUser();
  break;
case 'delete':
   deleteUser();
  break;
case 'edit':
   editUser();
   break;
default:
   defaultAction();
   break;
}
ajax注册是现在我看到网站中所有网站几乎都会使用到的一个功能,下面我就来给各位整理一个关于ajax注册验证例子,希望此例子能帮助到各位哦。

html代码

 代码如下 复制代码

<script" width=100% src="ajax.js"></script>
<form>
<table>
<tr>
  <td>用户名:</td>
  <td><input type="text" id="txt1" onKeyUp="showHint(this.value)"></td>
 </tr>
 <tr align="center">
  <td colspan="2"><span id="txtHint"></span></td>
 </tr>
</table>
</form>

js文件代码

 代码如下 复制代码

var xmlHttp
function showHint(str)
{
if (str.length==0)
  {
  document.getElementById("txtHint").innerHTML=""
  return
  }
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
  {
  alert ("Browser does not support HTTP Request")
  return
  }
xmlHttp.onreadystatechange=stateChanged

var geturl="conn.php?q="+str
//sid是增加一个随机数 防止页面启用缓存技术·
geturl=geturl+"&sid="+Math.random()
geturl=encodeURI(geturl);
geturl=encodeURI(geturl);
xmlHttp.open("GET",geturl,true)
xmlHttp.send(null)
}
function stateChanged()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
 {
 document.getElementById("txtHint").innerHTML=xmlHttp.responseText
 }
}
function GetXmlHttpObject()
{
var xmlHttp=null;
try
 {
 // Firefox, Opera 8.0+, Safari
 xmlHttp=new XMLHttpRequest();
 }
catch (e)
 {
 // Internet Explorer
 try
  {
  xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
  }
 catch (e)
  {
  xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
 }
return xmlHttp;
}

php操作

 代码如下 复制代码

<?php
$q=$_GET["q"];
$q = urldecode($q);

if (strlen($q) > 0)
{
  $conn = @mysql_connect("localhost","root","1010") or die ("MySql连接错误");
  mysql_select_db("xin",$conn);
  mysql_query("set names 'utf8'");
  
  $sql = "SELECT username FROM message WHERE username = '$q'";
  $query = mysql_query($sql);
  @$row = mysql_fetch_array($query);
  
  if(!empty($row['username']))
  {
   $response = "<font color=red>已经被注册!</font>";
  }else
  {
   $response = "<font color=blue>恭喜!可以注册!</font>";
  }
  
  echo $response;
}

?>

最后再给出数据库

 代码如下 复制代码

DROP DATABASE IF EXISTS `xin`;
CREATE DATABASE `xin` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `xin`;


CREATE TABLE `message` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(20) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

今天分享一段PHP中多张图片合成一张图片的代码实现,我们可以在图片合成,水印,九宫格等需求下使用到类似这样的图片合成效果,下面一起来看看例子吧。

今天分享一段PHP中多张图片合成一张图片的代码实现,我们可以在图片合成,水印,九宫格等需求下使用到类似这样的图片合成效果,下面一起来看看例子吧。

例子

 代码如下 复制代码

$imgs = array();
$imgs[0] = '1.jpg';
$imgs[1] = '2.jpg';
$imgs[2] = '3.jpg';
$imgs[3] = '4.jpg';
$target = 'emp.jpg';//背景图片
$target_img = Imagecreatefromjpeg($target);
$source= array();
foreach ($imgs as $k=>$v){
    $source[$k]['source'] = Imagecreatefromjpeg($v);
    $source[$k]['size'] = getimagesize($v);
}
//imagecopy ($target_img,$source[0]['source'],2,2,0,0,$source[0]['size'][0],$source[0]['size'][1]);
//imagecopy ($target_img,$source[1]['source'],250,2,0,0,$source[1]['size'][0],$source[1]['size'][1]);
$num1=0;
$num=3; //控制列数,一行几列,0为1以此类推。
$tmp=2;
$tmpy=2; //图片之间的间距
for ($i=0; $i<4; $i++){
    imagecopy($target_img,$source[$i]['source'],$tmp,$tmpy,0,0,$source[$i]['size'][0],$source[$i]['size'][1]);
    $tmp = $tmp+$source[$i]['size'][0];
    $tmp = $tmp+5;
    if($i==$num){
        $tmpy = $tmpy+$source[$i]['size'][1];
        $tmpy = $tmpy+5;
        $tmp=2;
        $num=$num+3;
    }
}
Imagejpeg($target_img,'pin.jpg');
?>

<img" width=100% src="pin.jpg">

下面来看一个利用foreach遍历数组之后再判断数组值是否在字符串中出现过,具体操作代码如下图所示。

例子

 代码如下 复制代码

<?php
function is_exist($str,$key){
 foreach($key as $v){
  if(strpos($str,$v)>-1){
   return true;
  }
 }
 return false;
}
$str = 'abcdefg我们中国';
$key = array('4','5','a');
if(is_exist($str,$key)){
 echo 'YES';
}
else{
 echo 'NO';
}
?>

原理分析

很简单的一个例子我们只要使用foreach遍历数组的值之后再使用strpos($str,$v)>-1来判断数组值是不是在字符串中指定位置了,如果搜索到了就会返回大于或等于0值哦。

定时任务执行php程序有两方法,一种是ignore_user_abort来实现定时操作,另一种是利用系统自带的计划任务来操作,如linux中使用Crontab,夼windows机器使用任务计划即可。

下面是网上比较流行的纯PHP实现定时任务的代码,我把他整理完善了下,不过先别急着用,一定要看到最下面。

 代码如下 复制代码

<?php
ignore_user_abort(); // 关掉浏览器,PHP脚本也可以继续执行
set_time_limit(600); // 设置程序的执行时间为600秒
// set_time_limit(0); // 设置程序的执行时间为无限长
$interval = 5; // 每隔5秒运行

do {
    $fp = fopen('sjyhome.txt', 'a'); // 打开 sjyhome.txt
    fwrite($fp, '欢迎来到SJY之家 www.111cn.net'); // 往 sjyhome.txt 写入信息
    fclose($fp); // 关闭 sjyhome.txt
    sleep($interval); // 等待5秒
} while (true);
?>

上面的代码是死循环,即使删除代码文件也无济于事,必须重启WEB才能停止脚本执行。所以我们需要一个执行脚本的开关,我们可以用外部文件引入的方法来实现,在while循环的时候,include开关变量即可。
建立外部引入变量文件 switch.php  内容如下:

 代码如下 复制代码
<?php
return 1;//1执行脚本 0退出执行脚本
?>
改良版的PHP代码
<?php
ignore_user_abort(); // 关掉浏览器,PHP脚本也可以继续执行
set_time_limit(600); // 设置程序的执行时间为600秒
// set_time_limit(0); // 设置程序的执行时间为无限长
$interval = 5; // 每隔5秒运行
$switch = include 'switch.php';
while($switch){
    $fp = fopen('sjyhome.txt', 'a'); // 打开 sjyhome.txt
    fwrite($fp,'欢迎来到SJY之家 www.111cn.net $switch \n'); // 往 sjyhome.txt 写入信息
    fclose($fp); // 关闭 sjyhome.txt
    sleep($interval); // 等待5秒
    $switch = include 'switch.php';
}
exit();
?>

把switch.php文件中的return值改为0,则会自动停止运行。想要再次执行,必须把值改为1,并且打开浏览器再执行一次。
如果$switch值为1,那么即使不设置ignore_user_abort(),关闭浏览器照样无法停止循环,甚至删除代码文件也没用,只能等待超时(默认30秒,set_time_limit自定义执行时间)重启WEB服务。
写在后面的话
本方法纵然可以实现定时功能,可是一旦运行该代码文件,这个进程就一直都在了,对于服务器资源的消耗我没测试过,不过有些空间商或许不会允许长时间占线的进程。
如果自己有VPS或服务器的朋友,建议在服务器中做好计划任务,来执行你网站上的脚本


下面介绍使用Linux中的Crontab来实现的两种方法。

关于crontab的使用,可参考文章:Linux计划任务crontab详解
一、在Crontab中使用PHP执行脚本
就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本。
每一小时执行myscript.php如下:

 代码如下 复制代码
#crontab -e
00 * * * * /usr/local/bin/php /home/web/3aj.php
/usr/local/bin/php为PHP程序的路径。

二、在Crontab中使用URL执行脚本
如果你的PHP脚本可以通过URL触发,你可以使用lynx或curl或wget来配置你的Crontab。
下面的例子是使用Lynx文本浏览器访问URL来每小时执行PHP脚本。Lynx文本浏览器默认使用对话方式打开URL。但是,像下面的,我们在lynx命令行中使用-dump选项来把URL的输出转换来标准输出。
00 * * * * lynx -dump http://你的网址/script.php
下面的例子是使用CURL访问URL来每5分执行PHP脚本。Curl默认在标准输出显示输出。使用”curl -o”选项,你也可以把脚本的输出转储到临时文件。
*/5 * * * * /usr/bin/curl -o temp.txt http://你的网址/script.php
下面的例子是使用WGET访问URL来每10分执行PHP脚本。-q选项表示安静模式。”-O temp.txt”表示输出会发送到临时文件。
*/10 * * * * /usr/bin/wget -q -O temp.txt http://你的网址/script.php
再介绍一下在Windows下php计划任务的实现

1、新建一个3aj.php,内容如下:

 代码如下 复制代码
<?
$fp = fopen("3aj.txt", "a+");
fwrite($fp, date("Y-m-d H:i:s") . " 成功了!\n");
fclose($fp);
?>

2、新建3aj.bat文件,内容如下:
C:\php\php.exe -q D:\web\3aj.php
3、建立WINDOWS计划任务:
开始–>控制面板–>任务计划–>添加任务计划
浏览文件夹选择上面的3aj.bat文件
设置时间和密码(登陆WINDOWS的保存即可了。
4、右键点击计划任务 -> “运行”即可

标签:[!--infotagslink--]

您可能感兴趣的文章: