分类 PHP 下的文章

Laravel框架实现404页面500页面友好提示

0x01 背景

  程序开发的时候,我们开发者都会开启debug,来调试程序,以及打印我们想看到的数据。但是当项目上线的时候,如果再开启debug,那就是在给广大的黑客们开启属于他们的机会了。虽然Laravel框架关闭debug后就不会将报错信息显示在页面上,但是也并不美观。而且纯英文的提示在国内来看也并不太好。所以这个时候就需要做友好的提示页面了

0x02 正文

  1. 要实现友好提示其实就是抓取每个页面的状态码,如果不是200,那么就根据状态码进行区分返回404或者500页面
  2. Laravel框架中有一个默认抓取并返回报错信息的文件,

appExceptionsHandler.php

  1. 我们来修改一下这个文件的render方法
    public function render($request, Exception $e)
    {
        if ($e instanceof ModelNotFoundException) {
            $e = new NotFoundHttpException($e->getMessage(), $e);
        }

        $debug = config('app.debug', false);  // 判断debug是否开启
        if (empty($debug)) {  // 如果debug关闭
            $result = method_exists($e, 'getStatusCode');
            if (!empty($result)) {
                // 404友情提示
                $statusCode = $e->getStatusCode();
                if ($statusCode == 404) {
                    return response()->view('error', [
                        'info' => '抱歉,指定的页面不存在.',
                        'url' => '/',
                        'code' => 404,
                        'msg' => 'Sorry, page not found.'
                    ]);
                }
            } else {
                // 出现错误提示
                return response()->view('error', [
                    'info' => '抱歉,好像出错了.',
                    'url'  => '/',
                    'code' => 503,
                    'msg'  => 'Error,It have been wrong.'
                ]);
            }
        } else {
            // 如果开启debug模式
            return parent::render($request, $e);
        }

    }

0x03 结语

error是实现做好的模板,直接调用即可。

Laravel条形码/二维码生成实战实例

0x01 安装

使用composer直接拉取组件milon/barcode

laravel 5.0/5.1

composer require milon/barcode 5.1

laravel 5.2/5.3/5.4

composer require milon/barcode 5.3

然后在config/app.php增加

'providers' => [
    ...
    Milon\Barcode\BarcodeServiceProvider::class,
    ...
]

如果需要更改配置直接使用命令

php artisan vendor:publish

添加别名

'aliases' => [
    ...
    'DNS1D' => Milon\Barcode\Facades\DNS1DFacade::class,
    'DNS2D' => Milon\Barcode\Facades\DNS2DFacade::class,
]

该组件支持的条形码类型:
PDF417,C39,C39 +,C39E,C39E +,C93,S25,S25 +,I25,I25 +,C128,C128A,C128B,C128C等等

0x02 使用

laravel 5.2/5.3/5.4在use进DNS1D和DNS2D之后,直接就可以使用

echo DNS1D::getBarcodeSVG("4445645656", "PHARMA2T");
echo DNS1D::getBarcodeHTML("4445645656", "PHARMA2T");
echo '<img src="data:image/png,' . DNS1D::getBarcodePNG("4", "C39+") . '" alt="barcode"   />';
echo DNS1D::getBarcodePNGPath("4445645656", "PHARMA2T");
echo '<img src="data:image/png;base64,' . DNS1D::getBarcodePNG("4", "C39+") . '" alt="barcode"   />';
echo DNS1D::getBarcodeSVG("4445645656", "C39");

laravel 5.1需要进行单例引入才可以使用

 private static $DNS1D;

/**
 * PrintController constructor.
 * @param DNS1D $DNS1D
 */
public function __construct(DNS1D $DNS1D)
{
    self::$DNS1D = $DNS1D;
}

然后再使用

echo '<img src="data:image/png,' . self::$DNS1D->getBarcodePNG("425X5", "C128") . '" alt="barcode"   />';

现在就出现条形码了

Laravel消息队列异步执行-发送邮件

0x01 配置

1、修改.env,我这里是采用的数据库,一般是用的异步服务器或者redis。我这里只是用作测试

QUEUE_DRIVER=database

2、添加数据库,执行

php artisan queue:table

php artisan queue:failed-table

php artisan migrate  

3、创建队列任务,我这里使用的是发送邮件的例子

php artisan make:job SendReminderEmail

0x02 控制器

use Mail;
use App\Jobs\SendReminderEmail;  

public function email()
{
        $datas = \DB::table('data_email')->get();
        foreach($datas as $data){
            dispatch(new SendReminderEmail($data->name,$data->email));
        }
        return redirect('/users');
}

0x03 队列文件
编辑队列文件SendReminderEmail.php

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Mail;

class SendReminderEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $name;
    protected $email;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($name, $email)
    {
        $this->name = $name;
        $this->email = $email;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {

        // 如果参试大于三次
        if ($this->attempts() > 3) {
            \Log::info($this->name.'邮件参试失败过多');
        }else{
            // 每次进来休息3秒钟
            sleep(3);
            $flag = Mail::send('emails.test',['name'=>$this->name],function($message){
                $message ->to($this->email)->subject('邮件测试');
            });
            echo $this->name;
            if($flag){
                \Log::info($this->name.'邮件发送成功');
            }else{
                \Log::info($this->name.'邮件发送失败');
            }
        }
    }

    public function failed()
    {
        \Log::error($this->name.'队列任务执行失败'."\n".date('Y-m-d H:i:s'));
    }
}

0x04 开始并查看记录

在网站根目录执行,开始监听:

 php artisan queue:listen

查看storage/logs/laravel.log

[2017-05-14 02:06:25] local.INFO: 亲6邮件发送成功  
[2017-05-14 02:06:30] local.INFO: 亲7邮件发送成功  
[2017-05-14 02:06:35] local.INFO: 亲1邮件发送成功  
[2017-05-14 02:06:40] local.INFO: 亲2邮件发送成功  
[2017-05-14 02:06:45] local.INFO: 亲3邮件发送成功  
[2017-05-14 02:06:50] local.INFO: 亲4邮件发送成功  
[2017-05-14 02:06:55] local.INFO: 亲5邮件发送成功  

测试成功。。。。

Laravel原生SQL打印之SQL监听

0x01 创建SQL监听器

Laravel 5.1版本:

php artisan make:listener QueryListener --event=illuminate.query  

Laravel 5.2、5.3、5.4版本:

php artisan make:listener QueryListener --event=Illuminate\\Database\\Events\\QueryExecuted   

0x02 注册SQL监听事件

Laravel 5.1版本:

打开 app/Providers/EventServiceProvider.php,在 $listen 中添加 illuminate.query 事件的监听器为 QueryListener
头部引入 use App\Listeners\QueryListener;
protected $listen = [  
        'illuminate.query' => [
            QueryListener::class,
        ],
    ];

Laravel 5.2、5.3、5.4版本:

打开 app/Providers/EventServiceProvider.php,在 $listen 中添加 Illuminate\Database\Events\QueryExecuted 事件的监听器为 QueryListener

protected $listen = [  
        'Illuminate\Database\Events\QueryExecuted' => [
            'App\Listeners\QueryListener',
        ],
    ];

0x03 编写SQL打印逻辑代码
Laravel 5.1版本
编辑app/Listeners/QueryListener.php文件

/**
     * 日志打印方法.
     *
     * @param  illuminate.query  $event
     * @return void
     */
    public function handle($sql, $params)
    {
        // 如果env中属于本地开发则进入该判断
        if (env('APP_ENV', 'production') == 'local') {
            foreach ($params as $index => $param) {
                if ($param instanceof \DateTime) {
                    $params[$index] = $param->format('Y-m-d H:i:s');
                }
            }
            $sql = str_replace("?", "'%s'", $sql);
            array_unshift($params, $sql);
            // dd($params);
            \Log::info('SQL语句输出------------>'.call_user_func_array('sprintf', $params));
        }
    }

Laravel 5.2、5.3、5.4版本

/**
     * 日志打印方法.
     *
     * @param  illuminate.query  $event
     * @return void
     */
    public function handle(QueryExecuted $event)
    {
        if (env('APP_ENV', 'production') == 'local') {
            $sql = str_replace("?", "'%s'", $event->sql);

            $log = vsprintf($sql, $event->bindings);

            Log::info($log);
        }
    }

0x04 查看效果

打开storage/logs/laravel.log可查看到所有的SQL语句

[2017-05-14 00:43:22] local.INFO: select count(*) as aggregate from `data_users` where `status` = '1'  
[2017-05-14 00:43:22] local.INFO: select * from `data_users` where `status` = '1' order by `addtime` desc limit 10 offset 0  

Laravel框架使用任务调度发送邮件

0x01 准备工作

1、准备一个邮箱,开通SMTP服务。这里我使用的网易163邮箱

2、我这里使用的是Laravel 5.4框架测试

3、我的测试环境是:ubuntu 16.04 nginx php 7.0

4、修改.env文件,配置SMTP进行邮件发送

MAIL_DRIVER=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=25
MAIL_USERNAME=发送邮件的邮箱@163.com
MAIL_PASSWORD=密码
MAIL_ENCRYPTION=tls

0x02 使用任务调度

1、在服务器上添加定时循环命令

crontab -e

2、在出来的页面,最下面添加laravel的任务调度命令

* * * * * php /项目路径(绝对地址)/artisan schedule:run 1>> /dev/null 2>&1

3、在网站根目录执行,添加任务调度用的控制器

php artisan make:command Stat_Test

4、该命令会在app下的Console下的Commands目录生成一个Stat_Test.php文件,里面用来书写需要执行的代码,导入Mail,编写邮件发送用的控制器,下面是Stat_Test.php文件的全部内容

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Mail;

class Stat_Test extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'stat:test';   // 这里必须要改,不然下一步无法操作

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->mail();
    }

    public function mail()
    {
        $name = '亲';
        $flag = Mail::send('emails.test',['name'=>$name],function($message){
            $to = '接收邮箱@qq.com';
            $message ->to($to)->subject('邮件测试');
        });
        if($flag){
            \Log::info('邮件发送成功.');
        }else{
            \Log::info('邮件发送失败.');
        }
    }
}

5、App目录下的Console下的Kernel.php全部文件。

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        // 将文件导入进来
        '\App\Console\Commands\Stat_Test',
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // 如果在Stat_Test.php文件中不设置protected $signature = 'stat:test';这里将无法使用
        $schedule->command('stat:test')->everyMinute();
    }

    /**
     * Register the Closure based commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        require base_path('routes/console.php');
    }
}

0x03 结语

到这里基本就可以使用了,记录了日志,可以进入

storage/logs/laravel.log

如果数量太多,可以清空在等一分钟查看是否成功

最新文章

最近回复

  • 裤衩哥:这文章我转了,而且我还以我自己的名字发了。2333333,你来咬...
  • :怎么生成带logo的二维码呀????
  • zirmi:哎呀,你的域名爆破工具 输入的字符不够啊
  • 小余:二维码如何弄啊,哥
  • 裤衩哥:可以要你的菊花吗?
  • admin:楼上+1
  • admin:吃瓜群众 为 落魂 打call
  • :牛逼了..........
  • 帮帮:厉害!谢谢了朋友!解决了我的问题。
  • 落魂:好多小伙伴找我要这个CSS样式,其实这个是使用的一套模块!大家可...

分类

归档

友情链接