PHP 运行模式

CGI CGI即通用网关接口(Common Gateway Interface),通过cgi协议,web server可以将动态请求和相关参数发送给专门处理动态内容的应用程序。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。 CGI已经是比较老的模式了,这几年都很少用了。 每有一个用户请求,都会先要创建cgi的子进程,然后处理请求,处理完后结束这个子进程,这就是fork-and-execute模式。 当用户请求数量非常多时,会大量挤占系统的资源如内存,CPU时间等,造成效能低下。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。 FastCGI FastCGI是CGI的升级版本,FastCGI像是一个常驻 (long-live)型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去

  • sidfate
    sidfate
5 min read
others

杂谈 关于《创建自己的PHP框架》的翻译

文档地址:开始阅读 最近翻译了一个文档,《Create your own PHP Framework》,顾名思义,讲的是如何创建自己的PHP框架。这个话题事实上是带着争议性的,很多人认为没有必要自己去花时间创建个自己的框架,PHP现在的框架那么多,也有很多不错的框架可以选择,我们为什么还要自己在做个重复的轮子呢。 我也是抱着这样怀疑的态度去阅读,但是在这个过程中,我发现作者也早早的意识到了这个问题,并且明确的说明这个教程不是用来创建一个通用框架的,他是“个人定制”的,根据你自己的需求来。 还有一点是,教程中的框架很多程度上使用了Symfony的底层组件,Symfony本身是一个非常优秀的框架,而且市面上有很多其他优秀的框架(例如Symfony)也用了它的组件。另外,其中讲到的一些设计模式,例如关注点分离,依赖注入等,

  • sidfate
    sidfate
2 min read
others

杂谈 关于阿里云服务器的更新

最近,身边的几个同事想搞个人网站,于是来找我建站。我推荐了阿里云服务器(不是广告),在安装完服务器环境后结果无法访问。 于是又检查了一遍环境安装的是否正确,发现没问题,下意识的去看了下防火墙配置,发现80端口正常开启。这就很奇怪了,在我以前的服务器上没有出现过类似的问题,然后这时候我想到了以前在朋友的亚马逊aws上也遇到过类似的问题,原因是aws服务器上设置了端口开放的规则,也就是说你还需要在服务器的后台设置开放80端口才能被外部访问,那么阿里云服务器的后台是不是也要设置呢。抱着这个疑惑,我发现了几个坑。 经典网络和专有网络 在购买阿里云服务器的时候会有一个网络类型的选择,在以前这是有2个选择的,经典网络和专有网络,到现在新账户只能买专有网络了,但是以前买过经典网络的老用户还能购买经典网络,这是更新后的一个区别。 先来讲讲两者的区别,阿里官网给的解释是: 经典网络:IP地址由阿里云统一分配,配置简便,使用方便,适合对操作易用性要求比较高、需要快速使用

  • sidfate
    sidfate
4 min read
git

Git 使用webhooks自动部署

如果你看过我之前的文章《Linux 搭建svn服务器》,而且有很巧的看到了最后,那么你应该还记得svn下通过post-commit的钩子实现本地提交服务器上代码实时更新的功能。那么这一次我们来讲下相同的功能如何在git下实现。 那么现在的情况是这样,咱们有一个开源项目托管在github上,部署在自己的服务器上,开发在本地环境,需求是本地提交修改服务器上自动更新代码并部署。实际上github提供了一个叫做webhooks的配置,它的实际原理是github会监听你项目的所有事件(或者只是push事件),当监听到事件发生的时候会去以post方式请求一个接口,这个接口就是你服务器需要提供的,在接口中你就可以做自己的事了。具体操作我们结合实例一步步来看。 github添加hook配置 首先进入我们github项目的设置选项,选择webhooks,然后添加一个webhook。 这里的payload url就是你接口的地址,secret是一个密码,后面会用到。 服务器监本 在服务器端,我们首先写一个脚本deploy.sh,脚本里包含了git的更新操作以及服务器上项目的部署操作。 #!/bin/bash

  • sidfate
    sidfate
4 min read
php

PHP 使用Travis CI持续集成composer包

这篇文章的内容可以说是上一篇文章发布自己的composer包的后续。主要内容分为2个部分: 单元测试,PHPUnit 持续集成,Travis CI 单元测试 首先单元测试的概念这里就不细说了,网上有很多资料,然后有关单元测试有没有必要这个问题,我觉得存在即是合理的,实际在使用composer可以看到很多依赖的包中本身就保留了测试的部分,往往是一个tests目录。 PHP项目的测试常用的久是PHPUnit了,PHPUnit是一个单元测试框架,关于PHPUnit可能会出一个专门的系列,这里先埋一个坑。接下来将结合实例介绍PHPUnit的安装、编写和使用。 目录结构 现在看下我们composer包的结构,如果你看过我们上一篇文章,对该结构应该会比较熟悉: src/ tests/ composer.json phpunit.xml 我们把一些类似README.md的文件先去除了,因为它们和该篇文章无关。

  • sidfate
    sidfate
8 min read
composer

PHP 发布自己的composer包

在Packagist上发布自己的包最科学的方式应该就是通过github了,本文将结合实战图文讲述具体的操作流程。 在你的github上新建一个仓库,这里我们创建一个名为my-package的仓库。 将远程仓库克隆到本地,然后我们需要在本地仓库添加一些文件。最重要的一个文件是composer.json,我们可以直接新建这个文件并编写,当然我们还可以使用composer init命令按步骤自动生成。 解释下几个步骤: Package name,也就是包名包含2部分,<供应商名称>/<包的名称>,一般来说供应商名可以填写你的github用户名。 Require,可以看到在图中我们并没有设置require字段,我建议如果你知道你的代码依赖自己在composer.json生成后手动添加,因为在composer init中操作会去搜索你需要的包,比较耗时。 最终我们生成的composer.json文件应该是这个样子的。 { "name&

  • sidfate
    sidfate
5 min read
dp

DP 观察者模式

还记得上一章提到小俞写的三个项目吗,一个博客,一个cms内容管理,一个商城。小俞有段时间实在太忙了,已经没有精力去同时管理自己的三个项目,于是乎他把商城项目交付给了小易帮忙管理。 一段时间内商城的运作一切正常,突然有一天,小易的邮箱收到好几封用户的投诉邮件,邮件的内容大致相同。大多都是在说下单后出了问题了,以前下单会收到订单的短信和微信的通知,但是现在收不到了,下单后本来还有一个红包可以领取,现在也没了,用户都不知道自己有没有下单成功了。 小易赶忙打开代码找到了下单的操作,看到了之前小俞的代码。 class Order { public function buy($code) { // 购买的数据流程 echo "下单中..."; $this->code

  • sidfate
    sidfate
4 min read
dp

DP 工厂模式

这是一个漫长的故事,故事的起因是小俞心血来潮搞了一个个人博客。小俞的博客因为一开始没啥人气,想想自己写一个登录注册的完整系统还是麻烦了点,最终选择了先使用微信的第三方登录。 注意,引入第三方登录对于需要登录注册的个人网站是很有效的驻留用户的手段。 小俞创建了一个User接口以及一个实现User接口的WxUser类。 interface User { public function login(); } class WxUser implements User { public function login() { // weixin users login } } // clinet $wxUser = new WxUser(); $wxUser->login(); 小俞的博客上线之后,又趁热打铁写了一个cms内容管理,一个商城,

  • sidfate
    sidfate
7 min read
php

Laravel Contracts

Contracts Laravel的Contracts(契约)是一系列框架用来定义核心服务的接口,一系列的标准,用来解耦具体需求对实现的依赖关系。这个依赖问题在之前的依赖注入和服务容器的文章中提到过,你可以把Contracts理解成例子中的Mail接口。 框架对每个契约都提供了相应的实现。例如,Laravel为队列提供了各种驱动的实现,为邮件提供了由 SwiftMailer驱动的实现。 在Illuminate/Foundation/Application.php中你可以看到默认Contracts实现的绑定。 /** * Register the core class aliases in the container. * * @return void */ public function registerCoreContainerAliases() { $aliases = [ 'app' =>

  • sidfate
    sidfate
2 min read
php

Laravel 服务容器和依赖注入

依赖注入(DI) 当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合。这个时候解决方式是,A类应该去依赖B类的接口,把具体的类的实例化交给外部。 就拿在业务需求中经常会用到的发送邮件举例,假如我们现在在Business业务类中需要发送邮件,下面的代码可以实现。 <?php class Email { public function send() { echo "send an email"; } } class Business { protected $mailer; public function __construct(

  • sidfate
    sidfate
4 min read
python

Python 爬取豆瓣电影TOP250并做数据分析

主要内容 爬取豆瓣电影TOP页面的电影数据 根据电影的分类进行数据统计 实现可以通过分类标签查找标签下的所有电影 前提准备 本爬虫中使用了requests库来获取页面信息,然后使用lxml的etree进行文档结构解析并抓取有用信息。获取的数据存储在MySQL中,这里使用了我的mysql类库Esql,数据库的配置信息放在了config.py中。最后使用了numpy以及matplotlib做数据分析。 Esql(https://github.com/Sidfate/Py-MySQL) 脚本头部: #!/usr/bin/env python #encoding: utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') import

  • sidfate
    sidfate
3 min read
spider

Python redis储存爬虫信息

起因 有同学说我的个人网站首页背景图会自动切换想法不错,但是背景图好像太过单一和模糊了。于是乎想到去网上爬一些壁纸来用,最好还能每天不带重样的,感觉diaodiao的。爬虫还是用python做,那么问题来了,python爬取的图片怎么传给页面显示呢,这次我们就用redis去储存爬虫爬取的程序,然后让node去获取redis,在通过服务端渲染到页面。 这里顺便安利下这次动手的网站泼辣有图,它的图片都是可以免费让人用的,而且图片质量当壁纸还是不错的。 经过 ok,打开页面,几番尝试,一顿操作,发现图片的信息可以通过接口调用,有2个关键接口。 获取版本号的接口 调用地址是 http://www.polaxiong.com/collections/get_edition_num,这个版本号主要是用来获取图片集的,

  • sidfate
    sidfate
3 min read
linux

Linux 部署node项目

前提 这篇文章主要讲的是linux系统下一个express的node项目的部署,express是一个web开发的node框架。 过程 部署工具推荐使用pm2,还有个是forever,但是相对而言pm2用起来更方便的,所以首先我们安装pm2 $ npm install pm2 -g 然后使用pm2创建进程,例如我们这里启动一个express项目,关于pm2的其他使用看这里 $ pm2 start bin/www express默认监听端口是3000,现在你应该已经可以通过http://yourdomain:3000访问你的node项目了,如果还不行看这里。我们最后还可以使用nginx服务器做代理,修改nginx.conf http { upstream nodejs { server 127.0.

  • sidfate
    sidfate
< 1 min read

Python zip暴力破解

前提 python提供了对zip文件的操作库zipfile。其中 ZipFile 类中的 extractall() 方法提供了 pwd 参数作为 zip 文件的密码。更多关于 zipfile python 中的 optparse 模块可以用来处理命令行参数。其主要使用流程:首先,必须 import OptionParser 类,创建一个 OptionParser 对象,然后,使用 add_option 来定义命令行参数,每个命令行参数就是由参数名字符串和参数属性组成的。最后,

  • sidfate
    sidfate
1 min read
php

ModernPHP 密码与时间相关

密码 password_hash()函数生成密码的hash值。该函数的第一个参数是纯文本密码,第二个参数选择所用的hash算法,目前支持的算法有PASSWORD_DEFAULT(采用bcrypt算法,PHP5.5.0默认)和PASSWORD_BCRYPT(使用 CRYPT_BLOWFISH 算法),第三参数指定所有的选项,选项有salt(手动指定的盐,7.0已被废弃)和cost(工作因子)。工作因子的默认值是10。 password_verify()函数可以验证密码和指定的哈希值,验证成功返回true,失败返回false。 password_needs_

  • sidfate
    sidfate
4 min read
php

ModernPHP PDO

简介 PDO(PHP Data Objects,PHP数据对象)是一系列的PHP类,抽象了不同数据库的具体实现,提供了统一的接口来操作不同的数据库。 数据库连接 PDO类的构造方法的第一个参数为字符串,指定了DSN(Data Source Name,数据源名称),提供数据连接的详细信息。DSN的开头是数据库驱动器的名称(例如mysql或sqlite),然后接一个":"号,后面是其他连接信息(主机名、端口号,数据库名和字符集等),更多内容可以查看pdo.drivers。PDO类构造方法的第二个参数和第三个参数分别是数据库的用户名和密码。举一个使用的列子: <?php

  • sidfate
    sidfate
5 min read
php

ModernPHP 过滤、验证和转义

html 使用htmlentities()函数过滤html输入,它会将字符转换成html实体。但是在默认情况下,htmlentities()函数不会转义单引号,也检测不出输入字符串的字符集。所以正确的使用方式是额外传入2个参数,即第一个参数是输入的字符串,第二个参数设为ENT_QUOTES常量,转义单引号,第三个参数设为输入字符串的字符集。 <?php $str = "A 'quote' is <b>bold</b>"; // Outputs: A 'quote' is

  • sidfate
    sidfate
2 min read
php

ModernPHP PSR

简介 PSR是PHP Standards Recommendation(PHP推荐标准)的简称。到目前为止,有四个被广泛认同的标准: PSR-1:基本代码风格 PSR-2:代码风格指南 PSR-3:日志记录器接口 PSR-4:自动加载 也许你还见过PSR-0(自动加载标准),PHP-FIG废弃了该推荐规范,用PSR-4替代了它。 PSR-1 php标签 必须把PHP代码放在或标签中。 编码 必须使用UTF-8 without BOM的编码。 目的性 一个PHP文件可以定义符号(类,性状,函数和常量等),或者执行副作用的操作(

  • sidfate
    sidfate
6 min read
php

ModernPHP FIG

对于PHP这门语言,众所周知的是其组件和框架的数量极其的多,毕竟世界上最好的语言。 如果你正在为项目选择PHP框架,你一定会为其多种多样的框架而头疼,例如有小巧精致的CI(CodeIgniter),最近几年都很火很全面的Laravel,国产框架ThinkPHP,或者企业使用广泛的Yii等等。 然后你可能会试着了解下每个框架的特性来个选出你想要的,你发现Symfony的辅助库很棒,大大减少了自己去封装时间,然而你考虑到你的项目的大小由此选择了CI,这时你会想到将Symfony的辅助库搬到CI框架中话就好了,但是你只能专门为你的项目编写一个一次性的适配器。 所以,看出问题了吗,单独开发的框架没有考虑到和其他框架的通信,而一旦你选择了这样的框架,你只能束缚在它的生态系统中了。 为了解决这个问题,一些PHP框架的开发者在php|tek碰头并组建了PHP Framework Interop Group(框架协同工作组,简称PHP-FIG,)。PHP-FIG制定了推荐规范,PHP框架可以自愿的遵守这些规范,改进与其他框架通信和共享的功能。PHP-FIG是框架代表自发组织的,

  • sidfate
    sidfate
3 min read