Laravel

Laravel 技巧之 定时任务

定时任务 Scheduled Tasks 是 Laravel 提供的组件之一,稍微上点规模的项目应该都会用到,比如开发微信应用时通过定时任务去刷新access token,比如每天定时发推送提现用户要记得签到。对于定时任务的基本用法,官网文档已经描述得很详细了,这里不再多说。 本文主要是介绍定时任务在实际应用中的两个小技巧: 1. 多个任务并行执行 先简单介绍一下 Laravel 定时任务组件的基本原理: 当cli初始化完毕之后,系统会调用 App\Console\Kernel::schedule 方法,也就是我们定义定时任务列表的地方,这个方法里每调用一次 $schedule->command() 就会生成一个 Illuminate\

  • Leo Chen
    Leo Chen
3 min read
cas

simple_cas_server项目废弃,新建两个坑

两个月前挖的坑这么快就弃了= = 是因为当初的没有考虑清楚项目的定位,既想实现CAS协议的服务端逻辑,又想加入用户管理、服务管理等等一堆东西。 而这种类型开源项目的受众极有可能是中小型企业,他们是需要一个CAS的服务端,但用户管理这类的周边需求不尽相同,有的可能还要求集成第三方登录,功能做多做少都不合适,所以决定拆分成两个项目:一个专注于实现CAS服务端逻辑,不包含任何与用户交互的前端代码;另一个依赖于前者,对外提供用户、服务管理的入口,并尽可能的插件化,使用者可以根据自己的情况定制。 新坑1:laravel_cas_server 负责实现CAS协议的逻辑。目前单测已经比较完善,代码覆盖率超过85%,处于可用状态,欢迎Star。 新坑2:php_cas_server 负责提供用户交互,测试用例正在编写中。

  • Leo Chen
    Leo Chen
1 min read
PHP

关于PSR-6的一些思考

之前想自己造一个缓存的轮子,就去看了一下PSR6的定义,并根据psr/cache提供的接口来实现。 当我在实现CacheItemPoolInterface接口时,对于save方法感到困惑,save方法只接收一个CacheItemInterface类型的参数,但是CacheItemInterface这个接口却没有提供类似getExpireTime的方法,这就导致CacheItemPoolInterface没有办法获取到缓存项的过期时间,也就没办法正确地将数据写入到缓存存储里。 看过几个比较著名的PSR-6实现,例如 symfony/cache php-cache/cache tedious/Stash 然而这些实现版本在实现save方法时并不是非常优雅。 比如symfony/cache public function save(CacheItemInterface $item) { if (!$item instanceof CacheItem) { return false; } if

  • Leo Chen
    Leo Chen
2 min read
cas

又撸了一个开源项目

CAS Server的一个简单PHP实现版本,支持v1/v2/v3三个版本的CAS协议,但是不支持代理(Proxy)相关的接口。 有一个简单管理后台,可以管理用户(User)和服务(Service)。 地址:https://github.com/leo108/simple_cas_server 做这个事情的起因是,公司内部引入了许多开源系统,例如gitlab、jenkins等,如果来了新员工就要在每个系统里添加一个账户,离职了要把所有账户注销,这个工作量太大。所以考虑引入一个通用的单点登录系统,现在比较流行的应该就是CAS了,但是CAS Server版本是java写的,而我们公司是PHP技术栈,

  • Leo Chen
    Leo Chen
1 min read
PHP

PHP的错误和异常处理总结

PHP的错误和异常处理总结 PHP内置了一批与错误和异常处理相关的函数,本文会对其中部分函数进行详细说明。 set_error_handler 和 restore_error_handler set_error_handler可以设定当程序出现错误时,将对应的错误交给用户自定义的逻辑来处理。 但是并不是所有的错误都可以被set_error_handler所指定的处理逻辑捕获,例如:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_

  • Leo Chen
    Leo Chen
4 min read
PHP

PHP程序配置文件(最佳?)实践

最原始的方式 写php程序时会直接把数据库、缓存的连接信息放在config.php文件里。这样做有两个弊端,1.在开发调试时必须先把连接信息改成本地的,要提交代码时再改回远程的,麻烦,也容易遗漏。2.开发人员可以直接看到线上数据库的连接地址、账号、密码,不安全。 怎么办? 线上运行PHP程序时通常需要一个Http服务器,例如apache、nginx。以nginx为例,在配置文件中可以通过fastcgi_param指令来给PHP传递变量 fastcgi_param DB_HOST "192.168.1.1"; 这样就可以在PHP代码里通过$

  • Leo Chen
    Leo Chen
3 min read
PHP

php抓取百度阅读

在百度阅读上购买了一本《永恒的终结》电子书,但是坑爹的发现只能在线阅读或者在手机app上阅读,不能下载下来放到kindle里。于是就尝试一下看能不能把这个文章下载下来。 首先在浏览器里打开阅读页面,查看源代码后发现小说的内容并不是直接写在页面里的,也就是说小说的内容是通过异步加载而来的。 于是将chrome的开发者工具切到network一栏,刷新阅读页面,主要关注的是XHR和script两个分类下。 经过排查,发现在script分类下有个jsonp请求比较像是小说内容,请求的地址是 http://wenku.baidu.com/content/49422a3769eae009581becba?m=8ed1dedb240b11bf0731336eff95093f&type=json&cn=1&_=1&t=

  • Leo Chen
    Leo Chen
3 min read
PHP

php原生模板引擎性能优化

好久没写博客了,今天来一发。 背景: 基于YAF开发的一个网站,模板引擎使用原生php,同时为了满足需求,自己开发了一个widget的功能,每次调用widget都会引发一次模板渲染。在网站首页会调用同一个widget数十次,在查看xhprof的数据时,发现widget渲染模板耗时较多,主要消耗在加载模板文件上,由于同一个widget使用的模板是同一个,所以希望只加载一次模板来提高执行效率。 ab -n1000 -c50的结果是11.31qps(虚拟机性能差) 思路: 首先想到的是在include文件之前把文件读入内存,放到一个静态变量中,之后再调用时就直接从静态变量中取即可。但问题是把模板文件放到变量中之后,怎么渲染呢?最简单粗暴的办法是使用eval,但是太粗暴了,不想使用。 然后想起来php有一个wrapper的功能,可以注册一个wrapper,比如mem,同样是把模板文件读入内存,然后就可以通过include(

  • Leo Chen
    Leo Chen
2 min read
PHP

piwik页面卡住问题追查记录

今天无聊就折腾了下piwik,但是发现有概率页面会504,查看nginx日志是php执行超时,而且第一次504之后,后面的所有页面访问全部都是504,重启php-fpm之后又可以正常访问了。 于是打开php-fpm的slowlog,在页面504的时候slowlog里也打出了对应的调用栈: script_filename = /home/www/online/website/piwik/index.php [0x00007fbec1568f48] session_start() /home/www/online/website/piwik/libs/Zend/Session.php:469 [0x00007fbec1568370] start() /home/

  • Leo Chen
    Leo Chen
2 min read
PHP

单文件PHP开发框架SinglePHP1.0版发布

单文件PHP框架,羽量级网站开发首选。 SinglePHP是一个单文件PHP框架,适用于简单系统的快速开发,提供了简单的路由方式,抛弃了坑爹的PHP模板,采用原生PHP语法来渲染页面,同时提供了widget功能,简单且实用。 协议MIT github地址:https://github.com/leo108/SinglePHP 文档地址:http://leo108.github.io/SinglePHP/ 以前在开发一些极其简单的项目时就比较纠结,不用框架吧代码结构比较乱,还要花时间去写那些数据库连接代码;用框架吧框架代码比业务代码还多,太臃肿了。 所以就想自己搞一个简单的框架,满足简单的网站开发需求即可,在开发的过程中也一直坚持简单的原则,可要可不要的功能一律砍掉。 很久之前就开始酝酿这个项目,13年初的时候有了雏形,

  • Leo Chen
    Leo Chen
1 min read
PHP

【转】PHP5.3 PHP5.4 PHP5.5 新特性

因为用到PHP新版本,一些新特性必须要了解,且有些可以在开发时就使用,如果不使用,那么何必升级PHP版本呢,显得有些得不偿失了! 所以整理了一下 一些特性,有可能不全,待添加 PHP 5.3中的新特性 一.PHP 5.3中的新特性 支持命名空间 (Namespace) 支持延迟静态绑定(Late Static Binding) 支持goto语句 支持闭包、Lambda/Anonymous函数 新增两个魔术方法__callStatic()和__invoke() 新增Nowdoc语法 在类外也可使用const来定义常量

  • Leo Chen
    Leo Chen
7 min read
PHP

在PHP中像数组一样访问Obj,以及性能测试

前两天看了下PHP里面的一些接口(interface),就写了一些简单的代码测试一下。 在PHP的各种MVC框架中,通常会有一个Model类,用来进行CURD操作,这个类会把对应数据库中的数据作为一个数组存放在一个私有的属性里,然后通过__get和__set来存取。大概样子如下: class Model { private $data; public function __construct($arr){ $this->data = $arr; } public function __get($key){ return $this->data[$key]; } public

  • Leo Chen
    Leo Chen
2 min read
cookie

cookie跨域解决方案

一道面试题,两个网站需要共享用户资料,即某用户浏览的A网站(该用户不一定是该网站的注册用户),A网站收集该用户的一些偏好信息,存储在cookie中,同时希望该用户访问B网站时,B网站也能获取到这个cookie信息。(AB两个网站均可修改代码) 一种答案是利用iframe来传递信息。 A网站在设置好cookie之后,在页面中放置一个长宽均为0的iframe,地址指向B网站的一个页面,并把cookie作为get参数,例如 B网站的test.php页面就可以获取到cookie值,并用setcookie将这个cookie值设置为B站的cookie。 经测试IE浏览器下这样是不行的,需要在http头中加上P3P: header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR

  • Leo Chen
    Leo Chen
1 min read
mb_string

PHP截取定长字符串(UTF8)

首先解释下这里的“定长”的意思,就是在WEB页面显示的宽度,同样一个字符,汉字占的宽度大概是英文字母的两倍。 假设“leo108”占了6个宽度单元,那么“leo108的博客”就占了12个宽度单元。 我希望实现的效果就是截取一定宽度单元的字符,但又不能乱码,所以就写了一个函数,需要mb_string支持 function shortname($name,$maxlength){ $len = strlen($name); $i = 0; $j = 0; $k = 0; while($i<

  • Leo Chen
    Leo Chen
1 min read