supervisor fatal监控HHVM进程,状态报 FATAL怎么办

友情提示:欢迎光临,本博客提供的代码,请粘贴到EditPlus 3中使用!!请使用火狐,Chrome浏览器进行浏览网站!出售域名,有要的请M我qq:
&今天给公司服务器编译完php后,打算启动php-fpm的时候,居然给我报:error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory这个错误,我的mysql是二进制包,位置是/usr/local/mysql下,然...
& &当使用nginx+keepalived做了负载均衡后,就要考虑后端php的session用那种方式来保存同步,不然很容易出现数据混乱,那样的话负载均衡做起来就没有什么用了.
& &系统:centos 5.9
& &需要的软件包:memcached-1.4.15.tar.gz
& & & & &nbs...
& 今天在安装好vnstat和vnStat PHP frontend后,在访问/vnstat的时候,vnStat PHP frontend居然不出图,马上去日志查看,发现php报下面的错误,如图网上搜了下说是php编译参数要加上--with-freetype-dir,看了下自己的php编译参数,还真没有,删除原来的php编译包,马上重新编译.&n...
& 当服务器的php-fpm经常搞得负载高,又找不到的原因的时候,只能写个脚本来帮忙检查负载并重启php,这也是没办法的事情.大家可以根据自己服务器的情况来决定要负载超过多少就重启php,我这里只设定了负载到1就重启php.& 系统:centos 5.9 64位脚本内容:vi check-php.sh#!/bin/sh
TOP_SYS_LOAD_NUM=1
SYS_LOAD_N...
& 相信大家都想让自己的网站秒开,但很多时候根本就不知道怎么去优化的时候,对数据库和web都优化了,但网站打开还是那么的慢,就只能对程序入手了,我们可以通过php-fpm来查询& 系统环境:lnmp1.php5.2的设置vi /etc/php-fpm.conf//默认秒为单位&value name="request_slowlog_timeout"&10s&lt...
&& 很多企业在搭建web网站的时候,大多数都是采用web+php在一台服务器,mysql独立一台服务器,当然我们这里不讨论是否可以抗得住高并发,数据备份和安全这些.写这篇文章之前,我问了很多人前端是否需要安装mysql,一些说需要,最后我采用的是在web前端安装mysql客户端.
&& 前端(nginx+php)ip:192.168.10.8
& 本来不是很想写这篇文章的,毕竟网上都有很多人都写了编译安装lnmp的教程,更有一键安装包来方便大家,这是我个人的特色编译,记录下来方便自己,也方便有很多人跟我一样奇怪的需求的.
&& 系统:centos 5.5
&& 需要的软件包:libiconv-1.14.tar.gz nginx-1.2.1.tar.gz php-5.2.17.tar....
& 最近入手了台便宜的vps,想在上面手动编译安装lnmp环境,没想到安装到php的时候,执行./buildconf --force居然出现Can't figure out your VCS, not cleaning的错误.如下图
而且错误说得很清楚,To avoid this, install autoconf-2.13.要安装autoconf-2.13才行,我的系统是cento...
Nginx+PHP是高效、高速、高性能的完美组合,但是要发挥其性能极致还是需要一些手段进行优化,使得这个组合结合更加紧密。在Nginx中启用fastcgi cache就可以有效提高PHP网站的访问速度。配置参数:
fastcgi_cache_path /www/php_cache levels=1:2 keys_zone=cache_php:30m inactive=1d max_siz...
首先要感谢21andy和守住每一天,没有他们俩的贡献,也就没有我这篇文章,我根据他们的1分钟完美安装最新centos+nginx+php-fpm+mysql文章内容改编.&我看了他们的文章之后,想lighttpd可不可以替换nginx来和php-fpm,mysqld整合,因为毕竟都是webserver,实验证明我的想法是正确的.好了,废话不多说,看教程吧.&&系统:centos 5.5&ip:192.168.13.200新建repo&vi /etc/yum.repos.d/test.repotest.repo里的内容:[CentALT]name=CentALT Packages for Enterprise Linux 5 - $basearchbaseurl=http://centos.alt.ru/repository/centos/5/$basearch/enabled=1gpgcheck=0protect=1这里我用的是守住提供的yum源,这个yum源更新比较快.地址是:http://centos.alt.ru/pub/repository/centos/5/i386/http://centos.alt.ru/pub/repository/centos/5/x86_64/根据你系统是32还是64位来选择.启用 EPEL repo:i386(也就是32位的系统):rpm -ihv http://download./pub/epel/5/i386/epel-release-5-4.noarch.rpmx86_64(这个就不解释,应该都看得懂,猜也猜得到):rpm -ihv http://download./pub/epel/5/x86_64/epel-release-5-4.noarch.rpm因为gpgcheck=0,所以就不用导入key了.
大家如果觉得本blog对你有所帮助,请给我一点小小的鼓励,谢谢.
Powered by‘PHP编程’ 分类的存档
Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理
http://doc.okbase.net/yimiyuangguang/archive/106027.html
本博文主要介绍 Laravel 框架中 Eloquent
对关系的处理,在 Laravel Administrator(后台扩展包)
您的数据库可能是彼此相关的。比如,一篇博客文章可能有许多评论,或者一个订单与下订单的用户相关。Eloquent 使得管理和处理这些关系变得简单。Laravel 提供了四种类型的关系: – – –
一个一对多关系的例子是一篇博客文章有许多评论或者一个课程有的多次分数信息等。
我们可以像这样定义关系模型 Model:
* sobjectinfo:课程信息表 Model
:主键自增
* soc_name
* soc_teacher:授课老师
class SobjectInfo extends Eloquent {
//自定义表名(protected $table)
protected $table = 'sobjectinfo';
//自定义主键(protected $primaryKey)
protected $primaryKey = 'soc_id';
//关闭 创建时间 与 更新时间 的自动维护(protected $timestamps)
public $timestamps =
* 定义一对多关系
public function Scoreinfo(){
return $this -& hasMany('Scoreinfo','soc_id');
定义与之对应的逆向关系 Model:
* scoreinfo:分数信息表 Model
:主键自增
:学生信息表(stuinfo)主键
:课程信息表(sobjectinfo)主键
class ScoreInfo extends Eloquent {
//自定义表名(protected $table)
protected $table = 'scoreinfo';
//自定义主键(protected $primaryKey)
protected $primaryKey = 'so_id';
//关闭 创建时间 与 更新时间 的自动维护(protected $timestamps)
public $timestamps =
* 分数表(ScoreInfo)与课程表(SobjectInfo)、学生信息表(StuInfo)有主外键关系
* 并且是一对多的关系
public function StuInfo(){
return $this -& belongsTo('StuInfo','s_id');
* 定义逆向关系指向主键表
public function SobjectInfo(){
return $this -& belongsTo('SobjectInfo','soc_id');
通过以上步骤的处理,表与表之间的一对多关系已确立,
下面将介绍在Laravel Administrato 后台中的实现 下拉列表查询、绑定等应用
return array(
'title' =& '分数信息',
'single' =& ' &&',
//新建描述
'model' =& 'ScoreInfo',
//分数信息
'form_width' =& 960,
//左边栏目宽
'columns' =& array(
'so_id' =& array(
'title' =& '编号',
'select' =& "so_id",
'sort_field'=&'so_id'
's_name'=&array(
'title'=&'学生姓名',
'relationship' =& 'StuInfo',
'select' =& '(:table).s_name',
'soc_name'=&array(
'title'=&'课程名称',
'relationship' =& 'SobjectInfo',
'select' =& '(:table).soc_name',
'score'=&array(
'title'=&'考试分数',
'select'=&'score'
//筛选信息
'filters' =& array(
'so_id' =& array(
'title'=&'编号'
'SobjectInfo'=&array(
=& 'relationship',
=& '&span style="font-family: Arial, Helvetica, sans-"&课程名&/span&&span style="font-family: Arial, Helvetica, sans-"&',&/span&
'name_field' =& 'soc_name',
'StuInfo'=&array(
=& 'relationship',
'title' =& '学生姓名',
'name_field'
=& 's_name',
'score'=&array(
'title'=&'考试分数',
'type' =& 'number'
//修改、新增
'edit_fields' =& array(
'StuInfo'=&array(
=& 'relationship',
'title' =& '学生姓名',
'name_field'
=& 's_name',
'SobjectInfo'=&array(
=& 'relationship',
=& '课程名',
'name_field' =& 'soc_name',
'score'=&array(
'title'=&'考试分数',
'type'=&'text'
以上示例展示的是 后台 分数信息 类。示例中多次使用到 “学生姓名”、“课程名”,虽然他们存储在不同的表中,但由于我们之前在 Model中已建立了它们之间的 一对多关系,因此我们可以自由搭配组合
效果图如下:
10个Laravel4开发人员必用扩展包:
Laravel Administrator 文档
Laravel4 中文帮助手册:
10个Laravel4开发人员必用扩展包
Laravel是一个新的基于最新PHP版本语法,支持IoC等设计模式的快速开发框架。目前最新版本为4.2,推荐安装PHP版本5.5+。
本文列举10个基本软件包,都是开发人员使用Laravel框架来构建WEB应用过程中应该要用到的,无需自己重复构建,如认证、调试、网站优化。
(Laravel Generators)
使用简单的命令行就可以自动根据代码模板生成Model/View/Controller代码以及模块(Module)。
(Laravel IDE Helper)
可以让你的IDE能够支持语法自动补足(accurate complementation)功能。这样可以大大减少查看API文档的次数。
简单来说,behat是一个PHP框架可以测试你的Laravel应用。它允许你在你的Laravel应用使用行为驱动开发过程,使得为应用程序编写行为测试更为方便。
如果你所在团队在开发中想遵循BDD的模式,这是非常有用的。
Ardent使得数据检验可以在模型(Model)中完成,而不是放在视图中,这显然可以减少冗余的重复性数据校验。
(Laravel Debug Bar)
无疑是一个巨大的成功,你无需到处编写var_dump。Laravel调试栏对该组件作了扩展,包含了路由、视图、事件以及更多信息。
这使得调试变得更加简单、快速,提高你的开发效率。
认证模块,包含了登录、注册、退出、密码重置等功能。
完整的RBAC实现(基于角色的权限控制),你只需要定义自己的角色和路径。
表单处理器,在WEB应用中,表单无处不在,Former让定义表单更加容易,使用你喜欢的CSS框架如Bootstrap或Foundation来绘制。
(Laravel HTML Minify)
让你的页面减小大概18%,提升性能必备
(Laravel Administrator)
Laravel Administrator帮助开发者快速构建后台管理界面,无需重复构建。
更多扩展包(More Packages)
:MongoDB ORM 组件
:OAuth支持
:创建Breadcrumbs界面的简单方法
:安全和100%标准兼容的OAuth服务器
:简单的基于PHP的PDF生成工具
Laravel网站:
原文转自:
php5.6 CI的问题(Only variable references should be returned by reference)
.cn/s/blog_02vz05.html
A PHP Error was encountered
Severity: Notice
Message: Only variable references should be returned by reference
Filename: core/Common.php
Line Number: 257
return $_config[0] =& $
$_config[0] =& $
return $_config[0];
CodeIgniter 通过控制器访问view页面 以及错误403问题
.cn/s/blog_6f566d.html
因为CadeIgniter是严格的MVC模式,通过inhdex.php这个单一入口调用控制器以及其中的方法从而显示view页面,所以 实现一个小的CI框架程序的过程是:
1.在application/controllers/文件夹下编写一个继承了CadeIgniter类的类文件(即控制器),
2.在application/view/文件夹下编写用于显示的视图页面
3.通过index.php调用控制器及其中的方法来执行view中的视图:localhost/index.php/类名/方法名/参数名
使用CI框架,一定要通过index.php来访问控制器。因为当你访问index.php的时候,应用程序会做大量的初始化工作,调用大量的基础类库,并根据index.php后面的参数加载控制器,然后加载试图,模型等内容信息。
详情见:.cn/s/blog_a3cpq.html
当按照这样的方式访问网页后,应该就不会出现错误403的现象了,如果还有:
除了按照网上常说的设置apache的方法外,如果还是解决不了,那么有可能是application文件夹中的.htaccess文件在作祟删除此文件之后就能正常访问了。
使用Supervisor简化进程管理工作
/articles/UZ3uUb
原文 http://everet.org/supervisor.html
主题 Tornado Python Linux
这篇东西想写很久了,拖延症晚期患者-.-,今天终于下决心把它写了吧。
很久很久之前,在思考如何部署基于Tornado的服务,就和 郑纪 一起找到了一个Tornado的好伙伴——Supervisor。
Supervisor,简单来说,就是一个Python写的进程管理器。不仅仅可以用来管理进程,还可以用来做开机启动。
我在服务器上面有几个服务:
基于Tornado的短链接服务 163.gs 和很久木有更新的通讯录
node.js的Ghost Blog。
还有 番羽土啬 用的shadowsocks。
需求是,对于这些服务能够做到如下:
重启机器后,能够自启动。
平时有个方便的进程查看方式。
能够有个方便的方式重启进程。
虽然我们自己写启动脚本,但是其实还是挺烦的,特别是,我要开多个同样的服务,就要写几份几乎一样的启动脚本,这个十分之冗余。
庆幸的是,Supervisor 1 可以解决这些问题,安装好Supervisor,仅需要为Supervisor弄份启动脚本,便可以一劳永逸。
非常熟悉的安装方式: sudo pip install supervisor ,便可以拥有Supervisor,如果没有启动脚本,可以从 这里 下载一份,放置到 /etc/init.d/ 下面便可。
我们可以看到启动脚本中,其实默认写了一个启动参数 -c /etc/supervisord.conf ,这里我们可以通过Supervisor附送的贴心的小脚本生成默认的配置文件 echo_supervisord_conf & /etc/supervisord.conf 。
我们可以根据需要修改里面的配置。我这里,每个不同的项目,使用了一个单独的配置的文件,放置在 /etc/supervisor/ 下面,于是修改 /etc/supervisord.conf ,加上如下内容:
files = /etc/supervisor/*.conf
修改完后,我们便可以将项目的配置文件命名为 .conf 放置在 /etc/supervisor/ 下面即可。
这里有个 163.gs 站点的配置文件163.gs.conf,使用了virtualenv,启动了两个Tornado进程。
163.gs.conf link
[program:163gs]
numprocs = 2
numprocs_start = 8850
user = projects
process_name = 163gs-%(process_num)s
directory = /home/projects/163.gs/
command = /home/projects/163.gs/env/bin/python /home/projects/163.gs/main.py –port=%(process_num)s
autorestart = true
redirect_stderr = true
stdout_logfile = /var/log/supervisor/163gs.log
stderr_logfile = /var/log/supervisor/163gs-error.log
更多详细的配置可以围观 supervisor官方文档
放置完配置文件后,我们使用 service supervisor restart 启动一下服务(如果是刚刚安装完,那么还没有supervisor进程,如果已经启动了,那么跳过这步)。
当我们需要管理进程的时候,使用supervisor的控制程序连接服务便可以很方便的查看经常状态和管理进程了:
@ ~ # supervisorctl
163gs:163gs-8850 RUNNING pid 2929, uptime 15 days, 23:35:21
163gs:163gs-8851 RUNNING pid 2930, uptime 15 days, 23:35:21
163gs_redis RUNNING pid 2924, uptime 15 days, 23:35:21
5txl:5txl-8070 RUNNING pid 2927, uptime 15 days, 23:35:21
5txl:5txl-8071 RUNNING pid 2928, uptime 15 days, 23:35:21
ghost RUNNING pid 2923, uptime 15 days, 23:35:21
shadowsocks_me RUNNING pid 2925, uptime 15 days, 23:35:21
supervisor& help
default commands (type help &topic&):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail version
supervisor& help reread
reread Reload the daemon’s configuration files
对于使用,直接输入help,就可以看到常用的命令,至于命令是啥意思,可以直接help那个命令,就可以看到解释了。
升级Supervisor
升级Supervisor也是非常简单的,使用 pip install –upgrade supervisor 既可以更新程序,然后使用 service supervisor restart 重启一下,就可以升级完成。
我在Github有我的服务器配置 supervisor_conf ,有兴趣可以看看。
好,打完收工。
No related posts.
PHP 学习推荐的网站
/blog//websites-that-you-should-know-for-php/
这个网站应该是学习 PHP 的最好的指南,没有之一。
一个制定 PHP 规范的机构,非常有必要了解下。
Composer 的官方的主要的 Repository,当然你得先去了解下 Composer。
PHP 精品库,由国外几个开发者打造,只有满足如下条件的库才会被收录:
We comply to the standards of the PHP-FIG. We adhere to the best-practices put forward by PHP The “Right” Way. We distribute code via Packagist and Composer.
虽然库比较少,但这些库都是精品,也是 PHP 的希望。
Facebook 开发的高性能的 PHP 虚拟机,据说比官方的快9倍,随着 HHVM 的不断完善,现在大部分的框架都被支持,比如 Laravel。
我感觉这也是 PHP 的一个希望。
国内非常好的社区,里面主要分享 Laravel 相关的内容,但是非常值得一看。
PHP 的最佳实践
/blog//what-is-php-best-practice/
今天听了 Mc 对 PHP 的分享,就偷偷把他的分享内容拿过来了。
“PHP 是世界上最好的语言”, 那么今天的题目就是 Zen of PHP(PHP 之禅)。
PHP 语言使用原则:
原则1:去其糟粕,取其精华。
原则2:使用 PHP 最高稳定版本。
原则3:注重实际,注重效率(Be pragmatic)
原则4:可读性与可改性(Readability & Writability)
PHP 语言使用战略:
(1)Autoload everything
(2)Require only autoload.php
(3)static method instead of global method
(4)Namespace every class
(5)Do not mix ‘side effects’ and ‘definitions’
PHP 语言使用战术:
(1)用一款牛逼的 IDE,比如 PHPStorm
(2) PHPDoc & Type hint,让写代码成为做选择题,而不是写作文。
(3) Log log log
(4) Object & Array
(5) Exception or Boolean return
项目最近使用的一些技术
/blog//web-technologies-i-am-using-recently/
最近的项目使用了一些技术,分享出来,希望和大家有一些讨论和切磋。
项目管理:
使用的是 Teambition,整体感觉凑合,
但问题也有,
比如产品经理的文档无法在 teambition 上很舒服的书写,只能通过上传文件来分享,效率太低,最后只能使用印象笔记来分享,结果印象笔记分享被封了,真是坑。
版本管理:
使用 Git,搭配 GitLab,Gitlab 使用起来真的超出预期,版本管理,代码 Review 等等都非常好用,Github 有的功能 GitLab 应该都有吧。
项目后端使用语言:PHP
PHP 是世界上最好的语言,哈哈哈哈哈哈。
PHP 现在依然是最受人鄙视的语言,但是你们确定了解 PHP 5.4, PHP 5.5, PHP 5.6吗?我承认 PHP 5.2之前真的是有太多的糟粕,但是 PHP 现在的稳定版本 5.5已经吸收了很多优秀的思想,焕然一新。Composer(Packagist)、Laravel、HHVM 都是 PHP 的希望,用 PHP 依然可以写出优秀的代码。
而且,PHP 的程序员很多啊,创业公司比较好招人。嘿嘿
项目PHP包管理:Composer
在本地服务器搭建 Composer Satis 来存放自己的私有的包,尽可能将所有公有的包也缓存到本地的服务器,这样子 composer update 会节省很多时间,秒更新,酸爽。
项目前端:
使用 bower 进行前端包管理。 使用 webpack 实现前端模块化机制,就是类似 require.js 做的事情,简单实用。 使用 gulp.js 来实现前端自动化,比如 less 编译,js 文件 uglify,文件连接,文件监听等等,使用下来感觉比 grunt.js 要好用几倍,gulp.js 能做的事情太多了,而且插件很丰富。
缓存:Redis
主要用来存储 session 和一些高频率读取的值,整体来说没有使用太复杂的数据结构。
之前使用 Redis 来做队列,后来使用了 Rabbitmq 就感觉省心了不少。
消息:Rabbitmq
主要用到的业务比如:发送短信,发送邮件,一些段时间内大量操作但响应要求不是那么及时的都可以使用队列来做。
使用 PHP 的一个 monolog 库,使用文本记录 + MongoDB 两种方式记录日志,查日志的时候,你会发现 MongoDB 比文本方便太多,因为你可以用任何语言来分析 MongoDB 数据库,但是文本文件的话就比较局限。
监控程序:supervisor
很好用,可以满足进程监控。
定时执行:crontab
感觉整体够用,一些定时需要执行的任务都使用 crontab,简单稳定。
No related posts.
Monolog:PHP 日志记录工具
Monolog是php下比较全又容易扩展的记录日志组件。目前有包括Symfony 、Laravel、 CakePHP等诸多知名php框架都内置了Monolog。
Monolog可以把你的日志发送到文件,sockets,收件箱,数据库和各种web服务器上。一些特殊的组件可以给你带来特殊的日志策略。
use Monolog\L
use Monolog\Handler\StreamH
// create a log channel
$log = new Logger(‘name’);
$log-&pushHandler(new StreamHandler(‘path/to/your.log’, Logger::WARNING));
// add records to the log
$log-&addWarning(‘Foo’);
$log-&addError(‘Bar’);
use Monolog\L
use Monolog\Handler\StreamH
// create a log channel
$log = new Logger(‘name’);
$log-&pushHandler(new StreamHandler(‘path/to/your.log’, Logger::WARNING));
// add records to the log
$log-&addWarning(‘Foo’);
$log-&addError(‘Bar’);
每个Logger实例都有一个通道和日志处理器栈。每当你添加一条日志记录,它会被发送到日志处理器栈。 你可以创建很多Logger,每个Logger定义一个通道(db,请求,路由),每个Logger有很多日志处理器。这些通道会过滤日志。
每个日志处理器都有一个Formatter(内置的日志显示格式处理器)。你还可以设定日志级别。
1. DEBUG:详细的debug信息
2.INFO:感兴趣的事件。像用户登录,SQL日志
3.NOTICE:正常但有重大意义的事件。
4.WARNING:发生异常,使用了已经过时的API。
5.ERROR:运行时发生了错误,错误需要记录下来并监视,但错误不需要立即处理。
6.CRITICAL:关键错误,像应用中的组件不可用。
7.ALETR:需要立即采取措施的错误,像整个网站挂掉了,数据库不可用。这个时候触发器会通过SMS通知你,
No related posts.
Laravel Eloquent Orm 使用指南
http://blog.ja168.net/laravel-eloquent-orm-guide-902.html
php artisan migrate:make create_bears_table --create=bears
create_bears_table 会转化为类名CreateBearsTable,–create后边的参数指表名
该命令执行之后会在app/database/migrations中生成一个文件create_bears-table.php(该文件会有前缀)修改该文件增加一些列:
Schema::create('bears', function(Blueprint $table)
$table-&increments('id');
$table-&string('name');
$table-&string('type');
$table-&integer('danger_level');
$table-&timestamps();
默认情况下,这些数据迁移都会包含自增列id,它也会同时创建时间戳用来记录创建与修改时间(created_at,updated_at),当修改记录时updated_at字段会自动更新
创建Fish的数据迁移
php artisan migrate:make create_fish_table --create=fish
Schema::create('fish', function(Blueprint $table)
$table-&increments('id');
$table-&integer('weight');
$table-&integer('bear_id');
$table-&timestamps();
在Eloquent模型中可以重新指定表的名称,起个有意义的表名(除非你想给自己找麻烦)
创建Tree的数据迁移
php artisan migrate:make create_trees_table --create=trees
Schema::create('trees', function(Blueprint $table)
$table-&increments('id');
$table-&string('type');
$table-&integer('age');
$table-&integer('bear_id');
$table-&timestamps();
创建Picnic的数据迁移
php artisan migrate:make create_picnics_table --create=picnics
Schema::create('picnics', function(Blueprint $table)
$table-&increments('id');
$table-&string('name');
$table-&integer('taste_level');
$table-&timestamps();
创建关联表
我们需要将bears与picnic两者的关系用一个新表来保存用以定义多对多关系
php artisan migrate:make create_bears_picnics_table --create=bears_picnics
Schema::create('bears_picnics', function(Blueprint $table)
$table-&increments('id');
$table-&integer('bear_id');
$table-&integer('picnic_id');
$table-&timestamps();
通过这个关系表我们就可以实现多对多关系【多个熊 vs 多个野餐】
迁移数据库
上边的那些迁移代码搞定之后执行以下命令就可以在数据库中创建表
php artisan migrate
Eloquent模型
现在我们已经搞定了迁移的工作,接下来我们需要增加一些演示数据,这时Eloquent可以闪亮登场了!在我们进行数据填充之前我们先创建模型,在模型中我们需要定义模型之间的关系。
让我们先看一看Bear的模型是什么样子
class Bear extends Eloquent {
protected $fillable = array('name', 'type', 'danger_level');
public function fish() {
return $this-&hasOne('Fish');
public function trees() {
return $this-&hasMany('Tree');
public function picnics() {
return $this-&belongsToMany('Picnic', 'bears_picnics', 'bear_id', 'picnic_id');
当创建一个新的模型时您可以传递属性的数组到模型的构造函数。这些属性将通过集体赋值分配给模型。这是很方便的,但把用户的输入盲目地传给模型可能是一个严重的安全问题。如果把用户输入盲目地传递给模型,用户可以自由地修改任何或者全部模型的属性。基于这个原因,默认情况下所有 Eloquent 模型将防止集体赋值(参见手册解释)
当定义关系时方法的名称可以根据你的需要进行定义。当想知道熊吃了哪条鱼时定义这个关系的方法就开始变的有意义。
return $this-&hasOne(‘Fish’); 这一行代码的参数名称要匹配Fish这个模型(类名),我们可以通过以下方法定义不同的模型关系:hasOne,hasMany,belongsTo,belongsToMany等,更多详细请参考手册。
Eloquent模型与表的名称转换规则
默认情况下,当你定义一个模型名称时,应该使用单数型式,例如我们的Bear模型。Eloquent会使用小写的复数单词在查找数据库中查找表,在这个例子中Bear模型对应着bears表。
class Fish extends Eloquent {
protected $fillable = array('weight', 'bear_id');
protected $table = 'fish';
public function bear() {
return $this-&belongsTo('Bear');
我们使用protected $table明确的为这个模型指定表的名称
如同定义Bear模型关系一样,我们需要定义一个逆向关联将Fish模型与Bear模型关联起来。
TreeModel模型
class Tree extends Eloquent {
protected $fillable = array('type', 'age', 'bear_id');
public function bear() {
return $this-&belongsTo('Bear');
Picnic模型
class Picnic extends Eloquent {
protected $fillable = array('name', 'taste_level');
public function bears() {
return $this-&belongsToMany('Bear', 'bears_picnics', 'picnic_id', 'bear_id');
像其他模型一样我们定义了集体赋值和模型关系。当定义多对多关系时我们应当使用belongsToMany而非hasMany,hasMany用以定义一对多关系
现在我们已经有了迁移类与模型类,可以使用Eloquent填充数据了,关于更多Eloquent的概念例如创建模型、CRUD优化、定义关系的信息请阅读Laravel Eloquent docs
seed就是用来做数据初始化的,我们将在app/database/seeds/DatabaseSeeder.php中创建seed,通常情况下你可能希望创建多个seed文件,但为了更简单一些这个例子中我们只使用一个文件。
class DatabaseSeeder extends Seeder {
public function run()
Eloquent::unguard();
$this-&call('BearAppSeeder');
$this-&command-&info("Bear app seeds finished.");
class BearAppSeeder extends Seeder {
public function run() {
DB::table('bears')-&delete();
DB::table('fish')-&delete();
DB::table('picnics')-&delete();
DB::table('trees')-&delete();
DB::table('bears_picnics')-&delete();
$bearLawly = Bear::create(array(
=& 'Lawly',
=& 'Grizzly',
'danger_level' =& 8
$bearCerms = Bear::create(array(
=& 'Cerms',
=& 'Black',
'danger_level' =& 4
$bearAdobot = Bear::create(array(
=& 'Adobot',
=& 'Polar',
'danger_level' =& 3
$this-&command-&info('The bears are alive!');
Fish::create(array(
'bear_id' =& $bearLawly-&id
Fish::create(array(
'bear_id' =& $bearCerms-&id
Fish::create(array(
'bear_id' =& $bearAdobot-&id
$this-&command-&info('They are eating fish!');
Tree::create(array(
=& 'Redwood',
'bear_id' =& $bearLawly-&id
Tree::create(array(
'bear_id' =& $bearLawly-&id
$this-&command-&info('Climb bears! Be free!');
$picnicYellowstone = Picnic::create(array(
=& 'Yellowstone',
'taste_level' =& 6
$picnicGrandCanyon = Picnic::create(array(
=& 'Grand Canyon',
'taste_level' =& 5
$bearLawly-&picnics()-&attach($picnicYellowstone-&id);
$bearLawly-&picnics()-&attach($picnicGrandCanyon-&id);
$bearCerms-&picnics()-&attach($picnicYellowstone-&id);
$bearCerms-&picnics()-&attach($picnicGrandCanyon-&id);
$bearAdobot-&picnics()-&attach($picnicYellowstone-&id);
$bearAdobot-&picnics()-&attach($picnicGrandCanyon-&id);
$this-&command-&info('They are terrorizing picnics!');
我们需要获得新添加记录的ID,当需要使用ID时利用$bearLawly-&id,这样就不用硬编码ID数据,也不用担心ID错误导致记录关联失败,万事俱备,我们已经完成了所有准备工作。接下来运行下面的命令就将完成数据的填充工作:
php artisan db:seed
一切都是这样简单,数据已经成功录入到数据库中,接下来可以开始我们最有趣的部份Eloquent !
使用Eloquent查询数据库
当完成迁移与数据填充的工作之后,我们将进行一些实际的例子,使用Eloquent可以非常简单进行CRUD操作。
创建新记录
在上述BearAppSeeder类中我们已经学会了如何用::create方法创建新记录:),尝试下边的例子:
Bear::create(array(
=& 'Super Cool',
=& 'Black',
'danger_level' =& 1
$bear-&name
= 'Super Cool';
$bear-&type
= 'Black';
$bear-&danger_level = 1;
$bear-&save();
另一种创建记录的方法是使用firstOrCreate()与firstOrNew(),他会首先去查询相关记录如果不存在则会去创建。
Bear::firstOrCreate(array('name' =& 'Lawly'));
$bear = Bear::firstOrNew(array('name' =& 'Cerms'));
查询与获取记录
所有的查询都非常的简单,下边是一些简单的例子
$bears = Bear::all();
$bear = Bear::find(1);
$bearLawly = Bear::where('name', '=', 'Lawly')-&first();
$dangerousBears = Bear::where('danger_level', '&', 5)-&get();
要更新一条记录你只需要先查询到它,然后更改属性,最后调用save方法,超级简单!
$lawly = Bear::where('name', '=', 'Lawly')-&first();
$lawly-&danger_level = 10;
$lawly-&save();
删除记录也许比修改记录还要简单,有两种方法可以实现:查找并调用delete删除你需要的记录或者使用destroy方法。
$bear = Bear::find(1);
$bear-&delete();
Bear::destroy(1);
Bear::destroy(1, 2, 3);
Bear::where('danger_level', '&', 5)-&delete();
暂时看来destroy属静态方法可以直接通过类名调用比较方便(通过索引删除记录),delete属于实力方法,删除比较灵活。
这里是Eloquent最有趣的地方,在大多数应用程序中,你的数据库表之间都是有联系的,我们已经在模型中定义了这种关系:熊和鱼的1V1关系,熊与野餐的多V多关系。
一对一关系
开始让熊吃点鱼吧!通过模型之间的关系可以非常简单知道熊吃了哪一条鱼。
$adobot = Bear::where('name', '=', 'Adobot')-&first();
$fish = $adobot-&
$adobot-&fish-&
一对多关系
这个例子我们看一下Lawly这头熊都爬了哪些树?
$lawly = Bear::where('name', '=', 'Lawly')-&first();
foreach ($lawly-&trees as $tree)
echo $tree-&type . ' ' . $tree-&
多对多关系
熊要去黄石公园野餐了 ^_^
$cerms = Bear::where('name', '=', 'Cerms')-&first();
foreach ($cerms-&picnics as $picnic)
echo $picnic-&name . ' ' . $picnic-&taste_
$grandCanyon = Picnic::where('name', '=', 'Grand Canyon')-&first();
foreach ($grandCanyon-&bears as $bear)
echo $bear-&name . ' ' . $bear-&type . ' ' . $bear-&danger_
正如你所看到的,使用Eloquent模型可以非常方便的查询数据库
我们来一个完整一点的例子,看看如何将数据传递给视图,我们需要创建一个路由与视图文件,检测一下我们已经学过的知识。
Route::get('eloquent', function() {
return View::make('eloquent')
-&with('bears', Bear::all()-&with('trees', 'picnics'));
先创建视图文件:app/views/eloquent.blade.php.
&!doctype html&
&html lang="en"&
&meta charset="UTF-8"&
&title&Eloquent Bears&/title&
&!-- CSS --&
&!-- BOOTSTRAP --&
&link rel="stylesheet" href="blog.ja168.net"&
body { padding-top:50 }
&body class="container"&
&div class="col-sm-8 col-sm-offset-2"&
&!-- BEARS --&
&!-- loop over the bears and show off some things --&
@foreach ($bears as $bear)
&!-- GET OUR BASIC BEAR INFORMATION --&
&h2&{{ $bear-&name }} &small&{{ $bear-&type }}: Level {{ $bear-&danger_level }}&/small&&/h2&
&!-- SHOW OFF THE TREES --&
&h4&Trees&/h4&
@foreach ($bear-&trees as $tree)
&p&{{ $tree-&type }}&/p&
@endforeach
&!-- SHOW OFF THE PICNICS --&
&h4&Picnics&/h4&
@foreach ($bear-&picnics as $picnic)
&p&{{ $picnic-&name }}: Taste Level {{ $picnic-&taste_level }}&/p&
@endforeach
@endforeach
这篇文章包含很多的信息,非常感谢你花这么长的时间来阅读希望它对你有所帮助吧啦吧啦…..看一下我们都研究了哪些东西?
Eloquent模型
数据库查询
我们已经研究了许多非常好的主题,但是还有非常多的地方需要去学习,更多的信息还是去查查文档吧!
原文:http://scotch.io/tutorials/php/a-guide-to-using-eloquent-orm-in-laravel
Rest模式get,put,post,delete含义与区别
/zhangpengshou/archive//2583096.html
解释代码 收藏代码
POST /uri 创建
DELETE /uri/xxx 删除
PUT /uri/xxx 更新或创建
GET /uri/xxx 查看
GET操作是安全的。所谓安全是指不管进行多少次操作,资源的状态都不会改变。比如我用GET浏览文章,不管浏览多少次,那篇文章还在那,没有变化。当然,你可能说每浏览一次文章,文章的浏览数就加一,这不也改变了资源的状态么?这并不矛盾,因为这个改变不是GET操作引起的,而是用户自己设定的服务端逻辑造成的。
PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。顺便说一句,因为GET操作是安全的,所以它自然也是幂等的。
POST操作既不是安全的,也不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。
安全和幂等的意义在于:当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。从这个意义上说,POST操作往往是有害的,但很多时候我们还是不得不使用它。
还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST 是作用在一个集合资源之上的(/uri),而PUT操作是作用在一个具体资源之上的(/uri/xxx),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。
关于GET POST 的混淆
先说相同点,只有了解了相同点之后才能理解为什么会发生混淆。两者都能向服务器发送数据,提交的“内容”[注1]的格式相同,都是var_1=value_1&var_2=value_2&….get 和 post 区别如字面,一个是get(获取),一个是post(发送)。get用来告诉服务器需要获取哪些内容(uri+query),向静态页面(uri)请求则直接返回文件内容给浏览器,向一个动态页面请求时可以提供查询参数(query)以获得相应内容。post用来向服务器提交内容,主要是为了提交,而不是为了请求内容,就是说post的初衷并不要求服务器返回内容[注2],只是提交内容让服务器处理(主要是存储或者处理之后再存储)。get和post出现混淆是因为对提交的数据处理方法的滥用造成的,数据是无辜的。
混淆之一:
将get提交的用来查询的字段当作是存储数据存入了服务器端文件或者数据库。然后就误以为get是用来提交用于存储的数据的。
混淆之二:
编写脚本在服务器端通过处理post提交的数据并返回内容。只要有数据,就能用来进行判断,脚本怎写是程序员的事,而不在乎数据来源的形式(post、get,或者是自己预设值的常量)。这点功能上确实没问题,只是背离的其初始目的而已。
由于都是要传送数据,且数据格式相同(即使数据格式不同,只要能提取出相应数据)。使用的时候难免出现张冠李戴,将get数据用来存储、将post数据用来检索返回数据。但是二者还是有区别的(主要是根据其用途而“人为”[注3]造成的),get的长度限制在2048字节(由浏览器和服务器限制的,这是目前IE的数据,曾经是1024字节),很大程度上限制了get用来传递“存储数据”的数据的能力,所以还是老老实实用来做检索吧;post则无此限制(只是HTTP协议规范没有进行大小限制,但受限于服务器的处理能力),因此对于大的数据(一般来说需要存储的数据可能会比较大,比2048字节大)的传递有天然的优势,谁让它是 nature born post 呢。
get提交的数据是放在url里,目的是灵活的向服务其提交检索请求,可以在地址栏随时修改数据以变更需要获取的内容,比如直接修改分页的编号就跳到另外一个分页了(当然也可能是 404)。post提交的数据放在http请求的正文里,目的在于提交数据并用于服务器端的存储,而不允许用户过多的更改相应数据(主要是相对于在url 修改要麻烦很多,url的修改只要点击地址栏输入字符就可以了),除非是专门跑来编辑数据的。
花边:post和get的安全性在传输的层面上区别不大,但是采用url提交数据的get方式容易被人肉眼看到,或者出现在历史纪录里,还是可能被肉眼看到,都是一些本地的问题。
注1:我强调的是内容,至于http协议中的get和post的格式大家有兴趣就自己看看吧。
注2:get方式主要是为了获得预期内容,即uri+query相同时所得到的内容应该是相同的。而post主要是提交内容,至于是否有必要返回页面可能只是出于用户体验,比如注册时返回你的注册id,但是如果只是返回一个“您已注册成功”的相同页面(即使你post的数据不一样)也没什么好奇怪的。
注3:关于这个“人为”,不是那么贴切,get和post还是有技术层面的区别的。但是从表象上看暂且这么说吧,毕竟二者的混淆也是“人为”的。
HTTP POST GET 本质区别
一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE URL 全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询 资源信息,而POST一般用于更新 资源信息(个人认为这是GET和POST的本质区别,也是协议设计者的本意,其它区别都是具体表现形式的差异 )。
根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的 。
1.所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
* 注意:这里安全的含义仅仅是指是非修改信息。
2.幂等的意味着对同一URL的多个请求应该返回同样的结果。这里我再解释一下幂等 这个概念:
幂等 (idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。
幂等有以下几种定义:
对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a) = abs(abs(a)) 。
对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x 。 看完上述解释后,应该可以理解GET幂等的含义了。
但在实际应用中,以上2条规定并没有这么严格。引用别人文章的例子:比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。从根本上说,如果目标是当用户打开一个链接时,他可以确信从自身的角度来看没有改变资源即可。
根据HTTP规范,POST表示可能修改变服务器上的资源的请求 。继续引用上面的例子:还是新闻以网站为例,读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源被修改了。
上面大概说了一下HTTP规范中,GET和POST的一些原理性的问题。但在实际的做的时候,很多人却没有按照HTTP规范去做,导致这个问题的原因有很多,比如说:
1.很多人贪方便,更新资源时用了GET,因为用POST必须要到FORM(表单),这样会麻烦一点。
2.对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE。
3.另外一个是,早期的但是Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计 。还有一个较为严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。
转自:/blog/1420713
No related posts.
phpstorm取消空格代替制表符
/article/9777.html
phpstorm默认是用4个空格代替制表符,为了让代码在不同编辑器下打开不出现格式混乱的情况,需要取消空格代替制表符的设置。
phpstorm取消空格代替制表符的方法:
进入:File -& Setting -& Code Style -& PHP,右侧勾选 “Use tab character”
转载请注明来源:
phpstrom默认快捷键
.cn/s/blog_6f7df0610101atir.html
1、跨平台。
2、对PHP支持refactor功能。支持断点调试,支持 Symfony2 和 Yii 的 MVC 视图
3、自动生成phpdoc的注释,非常方便进行大型编程。
4、内置支持Zencode。
5、生成类的继承关系图,如果有一个类,多次继承之后,可以通过这个功能查看他所有的父级关系。
6、支持代码重构,方便修改代码 。
7、拥有本地历史记录功能(VCS local history功能)。
8、方便的部署,可以直接将代码直接upload到服务器
插件YiiStorm,ideavim
点击菜单:File&Settings&(IDE Settings) Keymap
修改工具栏的字体File-&Setting-&Appearance
phpStorm设置大括号和方法名在同一行显示 ; 大括号和方法名在同一行警告 File -& Settings -& code style -& PHP -& Wrapping and Braces -& Braces placement -&End of line.
在settings-&Plugins里,Browse repositories按钮,搜索vim就会找到 IdeaVim插件该插件是控制phpstorm的keymap(也就是快捷键)的
phpstorm 选中一个词 “String” ,其他相同的单词“String” 的颜色就会变化Settings-&Editor-&Highlight全部勾选
Editor tabs -& tab limit 16
navigate/bookmark F11
ctrl+j 插入活动代码提示
ctrl+alt+t 当前位置插入环绕代码
alt+insert 生成代码菜单
Shift + Enter 新一行
ctrl+q 查看代码注释
ctrl+d 复制当前行
ctrl+y 删除当前行
ctrl+alt+y 刷新项目缓存Synchronize 或文件夹右键Synchronize
shift+F6 重命名
ctrl+shift+u 字母大小写转换
ctrl+f 查找
ctrl+r 替换
ctrl+shift+I 查看变量或方法定义源
ctrl+g 跳转行
ctrl+alt+F12 跳转至当前文件在磁盘上的位置
alt+down 查看下一个方法
alt+up 查看上一个方法
ctrl+alt+l 重新格式化代码
ctrl+shift+down statement向下移动
ctrl+shift+up statement向上移动
alt+shift+down line向下移动
alt+shift+up line向上移动
ctrl+/ 行注释
ctrl+shift+/ 块注释
Ctrl + Shift + Z:redo
Ctrl + Shift + F:区域查找
ctrl+shift+n 打开工程中的文件
ctrl+b 跳到变量申明处
ctrl+[] 匹配 {}[]
ctrl+shift+]/[ 选中块代码
ctrl+x 剪切行
ctrl+shift+v 复制多个文本
alt+left/right 标签切换
ctrl+p 显示默认参数
ctrl + ‘-/+’: 可以折叠项目中的任何代码块
No related posts.
laravel 的 loc,facade, Service Providers,Alias
http://blog.csdn.net/xijingre/article/details/
所以有了控制反转(Inversion of Control)和门面模式(Facade),实际还有服务提供器(Service Providers)和别名(Alias),我们创建自己的类库和扩展 Laravel 都会方便很多。
这里总结一下创建自己类库的方法:
在 app/library/MyFoo 下创建类 MyFoo.php
在 app/library/MyFoo/providers 下创建 MyFooServiceProvider.php
在 app/library/MyFoo/facades 下创建 MyFooFacade.php
在 app/config/app.php 中添加 providers 和 aliases
PHP5.5的内置web服务器
/blog/49_php5.5-little-server.html
忽然间发现PHP的调试更加的简单了如何调试呢》
都不需要看日志只需要看PHP 内置服务器的输出窗口即可
hainuo@hainuosmacair [08:12:54] [~/www/weike] [master *]
-& % sudo php -S localhost:88
PHP 5.5.25 Development Server started at Tue May 26 20:13:01 2015
Listening on http:
Document root is /Users/hainuo/www/weike
Press Ctrl-C to quit.
[Tue May 26 20:13:06 2015] ::1:58523 [200]: /kppw - Uncaught keke_exception [ 1049 ]: Unknown database 'bmweike' [
] ~ /Users/hainuo/www/weike/kppw/lib/db/mysql_driver.php [ 187 ]
thrown in /Users/hainuo/www/weike/kppw/lib/db/mysql_driver.php on line 187
[Tue May 26 20:13:15 2015] ::1:58524 Invalid request (Unexpected EOF)
[Tue May 26 20:13:15 2015] ::1:58525 Invalid request (Unexpected EOF)
[Tue May 26 20:13:50 2015] ::1:58946 [200]: /kppw - Uncaught keke_exception [ 1049 ]: Unknown database 'bmweike' [
] ~ /Users/hainuo/www/weike/kppw/lib/db/mysql_driver.php [ 187 ]
thrown in /Users/hainuo/www/weike/kppw/lib/db/mysql_driver.php on line 187
[Tue May 26 20:14:08 2015] ::1:58947 Invalid request (Unexpected EOF)
[Tue May 26 20:14:08 2015] ::1:58948 Invalid request (Unexpected EOF)
今天在调试一款威客产品时发现在5.3以上怎么调试都不行,brew 下安装的PHP怎么都不显示页面,但是它能够运行安装程序,后来下来了mamp使用免费版(免费版只有5.5 5.6) 也不行,于是启用了pro版本发现pro版本怎么调试都是可以的我从5.2 切换到5.3 5.4 5.5 5.6均正常使用。于是想起来如果不成功的话肯定会报错,但是由于配置服务器没有设置错误log,所以也就放弃,晚上回家后使用brew install php55 最后一次尝试时想到了说的 PHP54起已经内置了服务器,于是搜索的到了使用方法
通过查看输出信息,发现1是因为缺少mcrypt_decrypt库 另一个就是数据库找不到
数据库找不到是因为 我本来在机器上brew install mysql 安装了一个 今天下载了mamp后有创建了一个mysql 这两个的sock文件并不一样,读取的时候也是也是分别读取两个数据库目录的内容,都能够使用3306端口 真真的奇怪。。 这个反正我已经要卸载mamp了所以也就不管它了。
Whoops, looks like something went wrong.
/archives/803.html
在使用laravel的过程中,当程序异常的时候,你可能会发现页面上出现一行字:Whoops, looks like something went wrong。
首先,此页面是laravel的错误封装页面,也就是说,此时,larvel框架发现了一个异常,但是将此异常做了封装,所以只是显示出一行字,并没有将详细的异常信息打印出来。
在开发过程中,需要查看异常信息。这需要修改laravel的配置文件, 将开发模式开启。具体方式如下。
打开你larave项目的app/config/app.php文件,将其debug选项设置为true。再次运行页面,你会发现程序打印了异常。根据具体的异常信息,调试你的程序吧。
对于刚上手的人来说,你打印的异常有可能是:No supported encrypter found. The cipher and / or key length are invalid.
No supported encrypter found. The cipher and / or key length are invalid.
终端使用如下命令:
php artisan key:generate
如何使用laravel搭建后台登录系统
/yjf512/p/4042356.html
今天想用laravel搭建一个后台系统,就需要最简单的那种,有用户登录系统,试用了下,觉得laravel的用户登录这块做的还真happy。当然,前提就是,你要的用户管理系统是最简单的那种,就是没有用户权限,能登录就好。
我这里就不用默认的user表做例子了,那样很容易和laravel的一些默认设置混淆。
首先确认,后台的用户表,我设计表叫做badmin,每个管理员有用户名(username),有昵称(nickname),有邮箱(email),有密码(password)
这里玩个花,使用laravel的migration来建立表(实际上可以用不着使用这个工具建立表)
1 安装好最基本的laravel框架
2 创建migration文件:
./artisan migrate:make create-badmin-table
3 发现app/database/migration/下面多了一个php文件:
_090336_create-badmin-table.php
4 往up和down里面增加内容;
use Illuminate\Database\Schema\B
use Illuminate\Database\Migrations\M
class CreateBadminTable extends Migration {
* Run the migrations.
* @return void
public function up()
Schema::create('badmin', function($table)
$table-&increments('id');
$table-&string('nickname', 100)-&unique();
$table-&string('username', 100)-&unique();
$table-&string('email', 100)-&unique();
$table-&string('password', 64);
$table-&timestamps();
* Reverse the migrations.
* @return void
public function down()
Schema::drop('badmin');
5 配置好local的database,app/config/local/database.php
return array(
'fetch' =& PDO::FETCH_CLASS,
'default' =& 'mysql',
'connections' =& array(
'mysql' =& array(
=& 'mysql',
=& 'localhost',
'database'
=& ’test',
'username'
=& 'yejianfeng',
'password'
=& '123456',
=& 'utf8',
'collation' =& 'utf8_unicode_ci',
'migrations' =& 'migrations',
6 创建数据表:
./artisan migrate –env=local
这个时候去数据库看,就发现多了一张badmin表,数据结构如下:
CREATE TABLE `badmin` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`nickname` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`username` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT ' 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT ' 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `badmin_nickname_unique` (`nickname`),
UNIQUE KEY `badmin_username_unique` (`username`),
UNIQUE KEY `badmin_email_unique` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_
要问这里为什么多出了create_at和update_at,这是laravel默认为每个表创建的字段,而且在使用Eloquent进行增删改查的时候能自动更新这两个字段
7 创建个Model:
use Illuminate\Auth\UserT
use Illuminate\Auth\UserI
use Illuminate\Auth\Reminders\RemindableT
use Illuminate\Auth\Reminders\RemindableI
class Badmin extends Eloquent implements UserInterface, RemindableInterface {
use UserTrait, RemindableT
protected $table = 'badmin';
protected $hidden = array('password');
public static $rules = [
'nickname' =& 'required|alpha_num|min:2',
'username' =& 'required',
'email'=&'required|email|unique:badmin',
'password'=&'required|alpha_num|between:6,12|confirmed',
这里必须要implements UserInterface和RemindableInterface
8 把model和Auth关联上,修改app/config/auth.php
return array(
// 默认的用户验证驱动
// 可以是database或者eloquent
'driver' =& 'eloquent',
// 只有驱动为eloquent的时候才有用
'model' =& 'Badmin',
这里的driver可以是eloquent或者database,使用eloquent就告诉Auth组件说,用户认证类是Badmin这个类管的。这里的model是有命名空间的,就是说如果你的admin类是\Yejianfeng\Badmin,这里就应该改成’\Yejianfeng\Badmin’
9 好了,这个时间其实逻辑部分已经搭建完毕了,你已经可以在controller种使用
Auth::attempt(XXX) 做权限认证
Auth::user() 获取登录用户(一个Badmin类)
10 下面要建立一个用户登录页面:
11 设置路由:
// 不需要登录验证的接口
Route::get('/', ['as' =& 'user.login','uses'=&']);
Route::get('user/login', ['as' =& 'login', 'uses' =& ']);
Route::post('user/login', ['as' =& 'login', 'uses' =& ']);
// 需要登录验证才能操作的接口
Route::group(array('before' =& 'auth'), function()
Route::get('user/logout', ['as' =& 'logout', 'uses' =& ']);
Route::get('user/dashboard', ['as' =& 'dashboard', 'uses' =& ']);
12 设置controller:
class UserController extends BaseController {
// 登录页面
public function getLogin()
return View::make('user.login');
// 登录操作
public function postLogin()
if (Auth::attempt(array('email'=&Input::get('email'), 'password'=&Input::get('password')))) {
return Redirect::to('user/dashboard')
-&with('message', '成功登录');
return Redirect::to('user/login')
-&with('message', '用户名密码不正确')
-&withInput();
public function getLogout()
Auth::logout();
return Redirect::to('user/login');
public function getDashboard()
return View::make('user.dashboard');
// 添加新用户操作
public function getCreate()
return View::make('user.create');
// 添加新用户操作
public function postCreate()
$validator = Validator::make(Input::all(), User::$rules);
if ($validator-&passes()){
$bAdmin = new Badmin();
$bAdmin-&nickname = Input::get('nickname');
$bAdmin-&username = Input::get('username');
$bAdmin-&email = Input::get('email');
$user-&password = Hash::make(Input::get('password'));
$user-&save();
Response::json(null);
Response::json(['message' =& '注册失败'], 410);
13 设置下filter,app/filter.php
Route::filter('auth', function()
if (Auth::guest())
if (Request::ajax())
return Response::make('Unauthorized', 401);
return Redirect::guest('/');
将这里认证失败后的地址转到/ 路径
14 设置views/user/login.blade.php
这里截取一部分
可以看出,这里可以直接使用Session::has和Session::get
然后基本就完成了…
laravel这里的auth机制还是很方便的,但是migration使用起来总觉得有点憋屈。操作数据库总是隔着一层,不爽。
这里的auth一些简单的用户登录机制已经可以了,但是如果要做更复杂的用户管理权限,估计要使用Sentry()这样的第三方组件了。
From Apprentice To Artisan 翻译 10
http://my.oschina.net/zgldh/blog/362063#OSC_h2_3
Application Structure 应用结构
Introduction 介绍
Where does this class belong? This question is extremely common when building applications on a framework. Many developers ask this question because they have been told that “Model” means “Database”. So, developers have their controllers that interact with HTTP, models which do something with the database, and views which contain their HTML. But, what about classes that send e-mail? What about classes that validate data? What about classes that call an API to gather information? In this chapter, we’ll cover good application structure in the Laravel framework and break down some of the common mental roadblocks that hold developers back from good design.
这个类要写到哪儿?这是一个在用框架写应用程序时十分常见的问题。大量的开发人员都有这个疑问。他们被灌输“Model”就是“Database”,在控制器里面处理HTTP请求,在模型里操作数据库,视图里包含了要显示的HTML。不过,发送电子邮件的类要写到哪儿?数据验证的类要写到哪儿?调用外部API的类要写到哪儿?在这一章节,我们将学习如何写结构优美的Laravel应用,打破长久以来掣肘开发人员的普遍思维惯性这个拦路虎,最终做出好的设计。
MVC Is Killing You MVC是慢性谋杀
The biggest roadblock towards developers achieving good design is a simple acronym: M-V-C. Models, views, and controllers have dominated web framework thinking for years, in part because of the popularity of Ruby on Rails. However, ask a developer to define “model”. Usually, you’ll hear a few mutters and the word “database”. Supposedly, the model is the database. It’s where all your database stuff goes, whatever that means. But, as you quickly learn, your application needs a lot more logic than just a simple database access class. It needs to do validation, call external services, send e-mails, and more.
为了做出好的程序设计,最大的拦路虎就是一个简单的缩写词:M-V-C。模型、视图、控制器主宰了Web框架的思想已经好多年了。这种思想的流行某种程度上是托了Ruby on Rails愈加流行的福。然而,如果你问一个开发人员“模型”的定义是什么。通常你会听到他嘟哝着什么“数据库”之类的东西。这么说,模型就是数据库了。不管这意味着什么,模型里包含了关于数据库的一切。但是,你很快就会知道,你的应用程序需要的不仅仅是一个简单的数据库访问类。他需要更多的逻辑如:数据验证、调用外部服务、发送电子邮件,等等更多。
What Is A Model? 模型是啥?
The word “model” has become so ambiguous that it has no meaning. By developing with a more specific vocabulary, it will be easier to separate our application into smaller, cleaner classes with a clearly defined responsiblity.
单词”model”的含义太模糊了,很难说行具体的含义。更具体来讲,模型是用来将我们的应用划分成更小、更清晰的类,使得各代码部分有着明确的权责。
So, what is the solution to this dilemma? Many developers start packing logic into their controllers. Once the controllers get large enough, they need to re-use business logic that is in other controllers. Instead of extracting the logic into another class, most developers mistakenly assume they need to call controllers from within other controllers. This pattern is typically called “HMVC”. Unfortunately, this pattern often indicates poor application design, and controllers that are much too complicated.
所以怎么解决这个问题(译者注:上文中“更多的业务逻辑”)呢?很多开发者开始将业务逻辑包装到控制器里面。当控制器庞大到一定规模,他们将会需要重用业务逻辑。大部分开发人员没有将这些业务逻辑提取到别的类里面,而是错误的臆想他们需要在控制器里面调用别的控制器。这种模式通常被称为“HMVC”。不幸的是,这种模式通常也预示着糟糕的程序设计,并且控制器已经太复杂了。
HMVC (Usually) Indicates Poor Design
HMVC(通常)预示着糟糕的设计。
Feel the need to call controllers from other controllers? This is often indicative of poor application design and too much business logic in your controllers. Extract the logic into a third class that can be injected into any controller.
你觉得需要在控制器里面调用其他的控制器?这通常预示着糟糕的程序设计并且你的控制器里面业务逻辑太多了。把业务逻辑抽出来放到一个新的类里面,这样你就可以在其他任何控制器里面调用了。
There is a better way to structure applications. We need to wash our minds clean of all we have been taught about models. In fact, let’s just delete the model directory and start fresh!
有一种更好的程序结构。但首先我们要忘掉以往我们被灌输的关于“模型”的一切。干脆点,让我们直接删掉model目录,重新开始吧!
No related posts.
大家试试 Composer 全量国内镜像吧
/question/18
本镜像经过重新开发不再依赖老外开发的 toran 系统了,并且已于 15 年 7月份重装上阵!请参考这篇帖子:
Composer 国内全量镜像
Toran 是 Composer 和 Packagist 的作者开发的私有发布、镜像工具,6月份的时候发布的,当时我们就搭建了一套作为 Composer 的私有镜像内部使用,它能同时缓存 package.json 和压缩包数据,其实就是一个完整的 Packagist 服务,composer install 的时候全部走国内流量,速度飞快。
镜像地址和使用方法在这里:
另外,创建 Laravel 项目的时候强烈推荐使用 composer 方式,即:
composer create-project laravel/laravel
project-name --prefer-dist
再加上我们的镜像的加速,整个创建项目、安装依赖包的过程非常快速、流畅。
为什么不用 laravel/installer ?
laravel/installer 工具在创建项目的时候需要从 laravel 官网(国外)下载 laravel.zip
压缩包,速度慢、随时可能被墙,而且下载地址是写死到 installer 工具中的,不能配置,使用的时候出问题无法解决。
关注“Linux运维技术”微信公众号
2016年八月
8910111314
15161718192021
22232425262728

我要回帖

更多关于 supervisor守护进程 的文章

 

随机推荐