首页 > 编程技术 > php

PHP程序错误调试方法 让php显示错误提示

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

公司的服务器用的是wdcp搭建的环境,安装非常方便,但是在开发的过程可能把函数名之内的东西写错了,服务器直接返回的是500错误,没有任何错误提示,只是告诉你500错误,很让人头疼,这样调试错误很不方便,注意这里我关掉了浏览器的显示 友好错误

这个时候我们需要修改php.ini配置文件,不知道配置文件在那里,请用phpinfo() 然后搜索一下php.ini,你就能看到php.ini的位置了

查找:display_errors 将值设置成on

 代码如下 复制代码

display_errors = on

error_reporting = E_ALL & ~E_DEPRECATED

如果我们在php.ini中打开了错误提示还是不行你的程序可能有错误开关了,如下

 代码如下 复制代码

<?php
//禁用错误报告 
error_reporting(0); 
//报告运行时错误 
error_reporting(E_ERROR | E_WARNING | E_PARSE); 
//报告所有错误 
error_reporting(E_ALL); 
?>

如果你程序中有这段代码我们只要去掉就可以了哦

PHP NOTICE级错误提示对程序性能影响的研究

 

下面我来用性能测试来证明这个推论:
测试1:
在关闭错误显示的情况下,测试未初始化变量和已初始化变量在10000000次循环中的性能
变量已初始化的循环代码如下:
点击查看原图
变量未初始化的循环代码如下:
点击查看原图
测试成绩:
初始化:平均 5.28 秒
未初始化:平均 17.2 秒
性能差距:3.25倍
 
测试2:
在关闭错误显示的情况下,测试数组索引使用引号和非引号引用在10000000次循环中的性能
数组有引号索引代码如下:
点击查看原图
数组无引号索引代码如下:
点击查看原图
测试成绩:
有引号:平均 6.37 秒
无引号:平均 25.19秒
性能差距:3.95倍
平均时间表:
点击查看原图
结论:
从上面例子可以看出如果页面错误太多会导致页面性能下降哦,所以我们尽量不要使用关闭错误来处理php错误问题我们要保证页面没有错误才行哦。
下面我来给大家转一个关于Laravel4创建一个占位图片服务例子,有需要了解的朋友可看看。

使用Composer安装intervention/image库

 代码如下 复制代码
composer require intervention/image:dev-master

编码

 代码如下 复制代码

// vim app/routes.php
<?php
Route::pattern('width', '\d+');
Route::pattern('height', '\d+');
Route::get('{width}x{height}', 'ImageHolderController@getIndex');
// vim app/controllers/ImageHolderController.php
<?php

class ImageHolderController extends BaseController {
    public function getIndex($width, $height)
    {
        $width = intval($width);
        $height = intval($height);
        if ($width > 1900 || $height > 900)
            App::abort(404);
        $fontSize = min(max(intval($width / 5), 12), 38);
        $image = Image::canvas($width, $height, '#CCCCCC')
                ->line('#B5B5B5', 0, 0, $width, $height)
                ->line('#B5B5B5', $width, 0, 0, $height)
                ->text($width . 'x' . $height, $width / 2, $height / 2, function ($font) use ($fontSize) {
                    $font->file(public_path('font/Georgia.ttf'));
                    $font->align('center');
                    $font->valign('middle');
                    $font->size($fontSize);
                    $font->color('#666666');
                });
        return Response::make($image, 200, array('Content-Type' => 'image/png'));
    }
}

php执行多线程有fscoket与curl两种方式,但我们经常会碰到fscoket不能使用了,但curl很多服务器都支持了,下面我们一起来看一个利用CURL实现多线程方法

例子。

 代码如下 复制代码

$ch = curl_init();   
$curl_opt = array(
  CURLOPT_URL=>"http://www.111cn.net",
  CURLOPT_RETURNTRANSFER=>1,
  CURLOPT_TIMEOUT=>1
);   
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);

上次的文章用的是fscoket时间的异步操作,在实际应用中的时候有的服务器是用不了的,这个时候就用curl来应对。

第一行:初始化一个curl资源

第二行:设置要用的参数数组

CURLOPT_URL    设置访问的资源

CURLOPT_RETURNTRANSFER    设置返回字符串不直接输入

CURLOPT_TIMEOUT        超时时间,这里最低只能为1秒,也就说和fscoket是有区别的,这里代码会等待一分钟,一般来是将需要很长时间的执行的代码执行异步的

第三行:对初始化的资源进行设置参数

第三行:执行curl

第四行:关闭curl资源

至此一个curl实现的异步操作已经完成,但是这里不建议使用,建议使用博客中fscoket实现!

php中date函数可以直接把时间戳转化为日期了,当然还有一些其它的方法,下面文章开头我不说多了以免导致大家越看越看不明白,下面一起看一些例子。

当前时间戳

 代码如下 复制代码

$nowcode=time();
$nowcode=strtotime(now);


时间戳转化为日期

 代码如下 复制代码

$date=date("Y-m-d",getdatecode($a));

日期转化为时间戳

 代码如下 复制代码
function getdatecode($time)
{
 $year=((int)substr($time,0,4));        //取得年份
 $month=((int)substr($time,5,2));       //取得月份
 $day=((int)substr($time,8,2));         //取得几号
 return mktime(0,0,0,$month,$day,$year);//反悔UNIX时间戳
}
 

好,言归正传,把1228348800转成2008-12-4格式代码如下:

 代码如下 复制代码

$date3=date('Y-m-d H:i:s',"1228348800");

这样就OK了,如还想得到小时,分钟秒,只要把'Y-m-d'改一下就可以了,不过要注意一下,PHP时间还像有8个小时的误差.加上就OK了.

可以在程序前面加上

 代码如下 复制代码
date_default_timezone_set("Asia/Shanghai");

 
下面有更多的时间戳转换日期的例子

 代码如下 复制代码

(1)打印明天此时的时间戳strtotime(”+1 day“)
当前时间:echo date(”Y-m-d H:i:s”,time()) 结果:2009-01-22 09:40:25
指定时间:echo date(”Y-m-d H:i:s”,strtotime(”+1 day”)) 结果:2009-01-23 09:40:25

(2)打印昨天此时的PHP时间戳strtotime(”-1 day“)
当前时间:echo date(”Y-m-d H:i:s”,time()) 结果:2009-01-22 09:40:25
指定时间:echo date(”Y-m-d H:i:s”,strtotime(”-1 day”)) 结果:2009-01-21 09:40:25

(3)打印下个星期此时的时间戳strtotime(”+1 week“)
当前时间:echo date(”Y-m-d H:i:s”,time()) 结果:2009-01-22 09:40:25
指定时间:echo date(”Y-m-d H:i:s”,strtotime(”+1 week”)) 结果:2009-01-29 09:40:25

(4)打印上个星期此时的时间戳strtotime(”-1 week“)
当前时间:echo date(”Y-m-d H:i:s”,time()) 结果:2009-01-22 09:40:25
指定时间:echo date(”Y-m-d H:i:s”,strtotime(”-1 week”)) 结果:2009-01-15 09:40:25

(5)打印指定下星期几的PHP时间戳strtotime(”next Thursday“)
当前时间:echo date(”Y-m-d H:i:s”,time()) 结果:2009-01-22 09:40:25
指定时间:echo date(”Y-m-d H:i:s”,strtotime(”next Thursday”)) 结果:2009-01-29 00:00:00

(6)打印指定上星期几的时间戳strtotime(”last Thursday“)
当前时间:echo date(”Y-m-d H:i:s”,time()) 结果:2009-01-22 09:40:25
指定时间:echo date(”Y-m-d H:i:s”,strtotime(”last Thursday”)) 结果:2009-01-15 00:00:00

总结,上面所有关于时间戳转换日期的一些例子来看上面就是三个函数在这里转了一个是strtotime(),date(),time()函数了,如果你想知道它样的用法可在本站搜索。

在我做过这么多的php开发了我发现两种分页类型,一种分页是直接把数据库连接与分页连接在了一起,别一种分页函数只有分页的逻辑判断并没有数据库的参与了,后者更好维护与重复使用一些,前者维护麻烦不好重复利用,下面我都给大家整理几个例子。

例子一,这个分页函数就有连接数据库再查看
代码不详细解说了,注释里有

 代码如下 复制代码

<?php
  //page当前页,num每页的页数
  $page=isset($_GET['page'])?intval($_GET['page']):1;
  $num=5;
  $conn = mysql_connect('127.0.0.1','root','');
  if (!$conn) {
   die('Could not connect:'.mysql_error());
  }
  mysql_select_db('shop');
  //获取记录总数
  $total=mysql_num_rows(mysql_query("select * from user"));
  //计算页数
  $pagenum=ceil($total/$num);
  //限制页数不能超 www.111cn.net 出范围
  If($page>$pagenum || $page == 0){
    Echo 'Error : Can Not Found The page.';
    Exit;
  }
  //语句“Select * from table limit 0,10”从table表提取十条信息,0为起点,10为提取的数目
  //$offset为起点值,如当前页为第一页,每页5条,起点即为0,同理当前为第二页,起点将为5
  $offset=($page-1)*$num;
  $result=mysql_query("select * from user limit $offset,$num");
  while($it=mysql_fetch_array($result)){
    echo 'id:'.$it['id'].' name:'.$it['name'].'<br />';
  }
  //显示链接页面切换链接,当前页无链接
  for($i=1;$i<=$pagenum;$i++){
    $show=($i!=$page)?"<a href='index.php?page=".$i."'>$i</a>":"<b>$i</b>";
    echo $show." ";
  }
  echo $total.'条记录,每页5条,共'.$pagenum.'页';
   mysql_free_result($result);
  mysql_close($conn);
?>

例子二,直接的把分页代码逻辑提出来,重复利用比较好

 代码如下 复制代码

<?php
  /*
    #函数:csPage
    #功能:返回页面列表
  */
  Function csPage($iPage,$aPage,$urlStart,$urlEnd){
    $tmp = "";
    if($iPage == 1 && $aPage == 1){
      $tmp = "<strong> 1/1 </strong>";
    }else{
      if($iPage == 1){
        $tmp = "<span> |< </span><span> << </span>";
      }else{
        $tmp = '<a title="首页" href="' . $UrlStart . 1 . $urlEnd . '"> |< </a><a title="上一页" href="' . $UrlStart . ($iPage-1) . $urlEnd . '"> << </a>';
      }
      $tmp .= "<strong> " . $iPage . "/" . $aPage . " </strong>";
      if($iPage == $aPage){
        $tmp .= '<span> >> </span><span> >| </span>';
      }else{
        $tmp .= '<a title="下一页" href="' . $urlStart . ($iPage+1) . $urlEnd .' "> >> </a><a title="尾页" href="' . $urlStart . $aPage . $urlEnd . '"> >| </a>';
      }
    }
    return $tmp;
  }
  ?>

总结一下,

如果让我们选择可能我会选择第二种方法这样维护好实现方法简单,第一种分页适合初学者合适简单但维护复杂。

标签:[!--infotagslink--]

您可能感兴趣的文章: