Laravel ORM 的一个优化场景

评论中 forehalo 提供了一个更 Laravel 的实现方式:https://laravel.com/docs/5.0/eloquent#eager-loading Laravel 的 Eloquent 可能是最好的 PHP ORM 之一。不过,他也有所有 ORM 框架的通病,就是技术人员在不熟悉框架的情况下进行编码,很容易造成性能问题。之前遇到的一个应用场景。现在简化出来。 有两张表,一张暂定为 user 表,一张为 userinfo 表,现在有个需求是将特定用户抽取出来,然后从 userinfo 表中找到他们的数据,然后显示在页面上。 通常,在 Laravel 中,推荐的方法是使用 Eloquent 的关系函数,比如这样: 在 User Model 里: <?php namespace App; use Il... [阅读全文]

B 站动漫数据汇总

这是我很早之前就想做的一个项目。因为,作为一个非动漫骨灰级玩家,或者说是一个刚刚接触这个领域的人来说。尝试下口碑较好的作品是比较好的入门方式。所以,我找了个专家 May 咨询了下,并且得到了一个动漫的列表吧。 然后就开始看了。很大程度上,很多的作品都是直接从 B 站上看的,因为有个好处,就是 B 站上有弹幕,而且往往好玩的并不是作品本身,而是弹幕引发的二次讨论。所以,我想对动漫的好看程度或者说是槽点进行一个排名。通常情况下,B 站上都是只提供几种简单的排序,比如播放数,弹幕数,硬币数,收藏数来进行。而且通过分析他的请求,可以发现他的数据都是通过离线计算出来的。 比如说,我希望得到 2016.08.01 ~ 2016.08.12 中弹幕最多的完结动漫,所以,这个请求是: http://www.bilibili.com/list/damku-32-1-2016-0... [阅读全文]

如何实现 PHP 中的 Router

因为最近在写自己的 MFramework, 算是一个 PHP 的 web 框架吧。所以这个 Router 就是首先的一步。 首先看下 Kohana 框架的路由编写方式: Route::set('blogs', 'blogs/((/)(/))')->defaults( array ( 'controller' => 'blog', 'action' => 'list', 'limit' => 10 , 'page' => 0 ) ); 然后是 Zend 的路由设置, 建议阅读他的官方文档:Zend Router: $route = Method::factory(... [阅读全文]

从一个问题开始谈秒杀业务场景

这个首先就是从一个知乎提问开始的。有一天我看到这么一个提问: 然后,排名第一的答案就是一个静态页面,一个告知用户当前访问人数过多,请稍后再试。当然,这在很多人看来都是一个笑话。不过,对于一个之前做过秒杀业务的人来说。这真的是一段非常精妙的代码,某种角度上来说,这可以解决90%的秒杀场景。不过,用户体验太差,尤其是那些看到 console 有信息就会高潮的人来说。 所以,这边就先抛砖,来讲下我对秒杀业务的理解。 对于秒杀来说,它和传统的商城系统有着本质的区别: 低廉价格 大幅推广 瞬时售空 一般是定时上架 流量时间短、瞬时并发量高 对于技术人员来说,我们其实常常会把注意力着重的放在第五点上,就是对于流量的处理。 ... [阅读全文]

Laravel Session 相关

本文内容紧接之前的那篇文章,因为个人喜欢没事找事做,所以才会对一些实现细节比较感兴趣。比如 Laravel 的 Session 实现。 既然 Laravel 的 Session 并不是采用 PHP 原生的 Session 框架,那么它的这重起炉灶的一套 Session 机制,有什么更好的地方,或者说更优雅的地方? 我们先来看 PHP 的原生 Session 实现。PHP 初学者,勿喷。。 Session 是什么 自行谷歌或者 Bing。 PHP 原生 Session 机制 这主要涉及三个方面,Session 的生成,回收,存储 Session 的生成 这部分主要见于 PHP 源码,以手头的 PHP7 的源码为例,具体位于 /ext/session/session.c 中的 *php_... [阅读全文]

Laravel Session 失效 Case

这是年前碰到的一个问题,一直拖到现在才有空写记录。 因为公司内部准备转 Laravel 开发框架,所以势必会有一个学习的过程。我对 PHP 基本是一个入门的级别,所以对框架还是陌生的,有个同事遇到一个问题,就是按照官方的示例,写 Session 不成功。 即在 app/Http/route.php 里面,写如下的代码: Route::group(['prefix' => 'Test', 'namespace' => 'Test'], function() { Route::get('/', function() { Session::set('mike', 'mike'); d(Session::get('mike')); // d($value) 就是 var_dump 出来 }); }); 用来做 Se... [阅读全文]

PHP 调用 exec 执行中文命令的坑

写在之前 首先,我们的项目中有这么一个需求,就是需要在发送请求时,需要调用 java 写的一个加密库。所以不可避免的会使用到 php 的 exec 方法执行 shell 命令。 一切都很正常,直到,出现了中文。哎。具体的 case 如下: 样例代码: <?php $cmd = 'java -jar sign-maker.jar mike messi'; exec($cmd, $ret, $out); var_dump($ret); $cmd = 'java -jar sign-maker.jar 麦克 梅西'; exec($cmd, $ret, $out); var_dump($ret); 其中,sign-maker.jar 就是我们按照第三方的加密协议的一个签名包(虽然也是我写的),执行这段代码,我们可以... [阅读全文]

PHP 缓冲区相关

故事的开始是这样的,因为需要在旧有系统上添加一个小功能,就是显示出数据库中存储的图片。不过也不想吐槽这数据库的设计,居然将图片存储在数据库里。但是毕竟是任务就开始了,首先查一下数据库的格式,如下图: 常见的Blob格式,所以我就以为代码会很简单,如下的代码就可以了: <?php include('db-util.php'); $id = $_GET['id']; $db = db_connect(); $img = db_getImgById($db, $id); header('Content-type: image/jpeg'); echo $img; 但是,却出现无法识别图片的情况。觉得很奇怪,于是就把网络的请求结果和实际图片做了一个对比,结果如下: 可以很明显的看到前面多了两个字节的' '字符。第一反应是缓冲区的数据,... [阅读全文]