PHP

Laravel框架 – 容器、绑定与依赖注入

laravel框架的核心概念就是容器,打开laravel的入口文件public/index.php,一路追寻,会发现laravel框架在初始化时会新建一个Illuminate\Foundation\Application实例对象赋值给$app这个全局变量。这个Application实例就是我们的laravel容器(Application是Container的子类),是整个laravel程序的基础:   一、容器 容器,就是用来装东西的,对吧。现实中的容器可以用来装水、装米,但编程世界中的容器装的则是一个个实例对象。举个例子,在程序运行过程中,我们可能需要一个Mailer实例来发送邮件,通常直观的做法是在需要的时候才创建这个Mailer实例,但我们也可以在程序初始化的时候先行创建一个Mailer实例,并在容器中注册该实例(laravel中叫做binding),随后在程序中任何需要用到Mailer的地方,就可以直接向容器申请这个实例(laravel叫做resolving)或者由容器进行自动依赖注入。 实际上laravel容器的绑定并不是真的绑定一个实例,而是绑定一个闭包函数,该闭包负责生成要绑定的实例对象。同时在绑定的时候定义是否为单例绑定(laravel中把单例绑定叫做shared)。然后直到程序向容器申请该实例的时候,才真正执行这个闭包函数去生成一个实例。对于非单例绑定,每次resolving都会生成一个新的实例;对于单例绑定,只在第一次resolving的时候生成实例,然后将该实例放入容器的instances数组中(Illuminate\Container\Container->instances),后面在申请时直接从该数组中返回实例。 (如果你有java的spring框架基础的话,那么就很好理解了。laravel容器就相当于spring容器,容器中绑定的实例对象相当于spring bean的概念,他们的目的都是为了依赖注入。另外,laravel的中间件也有点类似spring中切面的概念。推荐可以看一下Craig Walls写的《Spring实战》这本书,对于容器与依赖注入的概念描述得很棒。) (或者,关于容器与依赖注入的概念,还可以参考这篇博文:https://www.insp.top/article/learn-laravel-container) 1. 打印Laravel容器 https://www.hawu.me/coding/1132 2. binding 绑定操作通常在ServiceProvider的register()方法中定义,然后通过写入/config/app.php文件中的providers数组让laravel框架在初始化时自动加载。(当然,你也可以在程序其他地方直接调用bind()与singleton()方法进行绑定) 绑定的作用其实是告诉容器,在解析绑定时候如何生成需要的实例对象。如果一个类不依赖于任何其他类(即构造方法无参)或者它的构造器依赖可以被laravel解析,那么这个类就无需绑定到容器。容器不需要被告知如何生成这样的类对象,因为容器可以通过php的反射机制自动解析出具体对象。 However, there is no […]

Laravel框架 – 命令行工具artisan

说在前面的话: laravel算是近几年最火的php web开发框架了,在github的php项目中稳居第一(Most Popular PHP Project at Github)。star数量甚至是我先前挚爱codeigniter的两倍。这几天抽空看了下laravel的文档与入门视频(laracasts.com),惊讶于现在的php居然已经能写成这样了,laravel简直就是php届的spring。容器、依赖注入、中间件。。。跟朴实无华的codeigniter相比简直就是在炫技,当然这也成了laravel反对派们的口实——“将追求简单直接的php写成了晦涩臃肿的java”。我试了一下laravel与codeigniter渲染一个index页面的性能,laravel平均耗时80ms,而ci只需要8ms,=。=#  but!who care!“当你需要考虑性能的时候,性能早已不是问题了。” balabala吹完laravel,该说正题了。除了laravel本身的框架之外,laravel还提供了一个屌炸天命令行工具artisan,简直就是开发神器。这篇文章就是想记录下平时常用的命令,免得一段时间不写全忘光光。 一、启动服务 $ php artisan serve 使用这个命令,直接在8000端口启动web服务,而不需要在配置nginx,这对于开发环境特别方便。   二、路由相关 1.

php通过fsockopen异步发送邮件

不考虑pthreads拓展的话,原生php是不支持多线程的。如果想要在web项目中异步发送邮件或者执行其他php脚本,就可以考虑使用fsockopen的方法:发送一个socket连接请求目标脚本,不需要等待目标脚本执行结果直接关闭socket连接,接着执行后续任务,同时目标脚本由于收到请求,开始响应并执行。这就实现了php的“伪异步”。 $url = YOUR_WEB_PATH . "/send_email";  // 异步执行的目标脚本 $post_data = array();     /** * 构造$post_data */     trigger_async_request($url, $post_data); //

mac系统升级php、php-fpm

因为今天发现系统自带的php-fpm不支持freetype,所以只好重装php-fpm。mac系统还好有homebrew这个神器,大赞。 一、安装php与php-fpm brew install php55 –with-fpm –with-mysql –with-imap –with-gmp –without-apache ps:关于brew安装程序时支持的编译参数,可以使用brew options命令来查看,brew options php55。 又ps:同样,如果想装php5.6或php7,就使用brew install php56、brew install php70 安装完后的php程序/usr/local/Cellar/php55/version/bin,php-fpm在/usr/local/Cellar/php55/version/sbin。配置文件目录在/usr/local/etc/php/5.5。

在线web代理

glype(https://www.glype.com/) 现在好多在线代理网站都是用glype搭的,估计迫于我党的压力,glype官网禁止中国ip的访问 =。=#   php-proxy(https://www.php-proxy.com/) 比glype简单,但更好感觉  

php生成静态html文件

php生成静态html文件,主要用在某些并不需要实时更新,且访问量大的页面,比如说门户的首页。顾名思义,就是当首次访问时候,php生成一个静态html页面,同时该页面有一个“有效时间”,在有效时间内所有的访问都直接返回该html页面,而不需要每次访问都重新生成页面。当过了有效时间后,重新生成一次静态html页面即可。从而节省系统开销。 (当然,这个静态html文件内部还可以通过ajax实时更新数据。) 如下所示: 用户访问output.php页面,后台首先查看是否存在有效的output.html, 若存在,直接返回该html文件; 若不存在,php重新处理数据输出给用户,同时生成一个新的html文件留待之后的访问。 if (is_file('output.html') && (time() – filemtime('output.html')) < 300) { // 如果静态页面存在且仍在有效时间内(这里设为5分钟),直接输出该静态文件 require_once('output.html'); } else

CentOS 6.3升级php5.5

在CentOS 6.3 系统下直接yum install php,默认安装的是php 5.3。前几天为了解决php耗尽内存导致宕机的情况,顺便将php 5.3升级成5.5了。 1. 检查系统当前安装过的php程序包 yum list installed | grep php 然后将查到的相关php程序以及扩展库卸载掉 yum remove php php-fpm

CentOS下php-fpm进程cpu占用率100%导致无法访问的情况

最近我的阿里云服务器经常出现网站无法访问的情况,同时也无法ssh登陆,只有服务器ip可以ping通。只能通过阿里云后台重启系统才能恢复。之前也出现过几次,但一直懒得处理,还天真的认为是不是太久没访问系统待机了,=。=#   现在得干点活了。(ง •̀_•́)ง   1. 在阿里云后台添加站点监控,监控hawu.me访问超时的情况。 2015.3.4 18:40 收到监控告警, hawu.me无法访问。赶紧尝试ssh服务器,果然无法登陆了。阿里云监控显示服务器cpu使用率100% 。   2. 重启服务器后查看系统日志(/var/log/messages)与php日志(/var/log/php-fpm/error.log) 这时候的php日志记录如下: [04-Mar-2015 18:32:02] WARNING: [pool www] seems

Scroll to Top