PHP

[原创首发]关于如何正确使用PHP框架及如何选择框架之我见.

用PHP 开发程序这么多年了,今天想和大家谈谈如何正确使用PHP框架.

即关于PHP开发什么时候用框架,用不用框架,用什么框架,不同项目是否用不同框架,是否要学习多个框架,付出多少学习成本等问题.

先说一下,我用过的框架有:Swoole, Laravel, phalcon ,symfony, codeigniter, thinkphp.

这几个框架都有什么特点? 有没有做什么项目都通吃的框架?

先说一下swoole,swoole是用C写的PHP扩展,性能很高,通常用于写后台服务和网络通信程序.,但是对于一般的普通web程序它不太适合.并且学习难度大.当然如果你追求性能,写后台服务和接口还是适合的.

再说一下 Phalcon这个框架,同样的C写的全栈框架,以php扩展方式发布,性能可以说是最好的.但是因为一是英文的文档,要求你英文比较好.phalcon在国内用的人比较少,所以中文文档不多.phalcon写web程序和接口都是很好的.但不适合写后台服务.还有一点是这个框架虽然好,但是因为是C写的,如果有一些bug,就要等官方修复,或需要你懂C语言自己来修复.还有一点扩展性不好,如果你想加新功能,比如mongodb数据库支持,它是支持的,但是需要是老的php mongo扩展,用新的php mongodb扩展的话,就需要写php代码来实现,这就降低了性能.所以说这框架很好,但还是有一些不便.

其次是Laravel这个框架,最近可是风头正旺,号称最好的框架,以优雅著称.也像phalcon一样,用到了最新的一些概念:如composer,依赖注入,服务定位等.国内用的人也不少,中文文档及资料也比较多.但是我想说的是性能是这个框架的硬伤,新安装的laravel 5.1 框架 输出一个hello world 每秒rps 才达到几十, 而最 新发布的laravel 5.5 及性能居然还不及laravel 5.1版.究其原因是因为这个框架一启动就加载了一百多个文件,这就是性能很低的原因(IO开销很贵的!). 这个框架再好,但是性能太低,就需要拿硬件来支撑.除非你是土壕,否则还是不建议用Laravel 这个框架.

再说一下 thinkphp

            

PHP函数式编程的初步认识

最近朋友推荐这本书:Functional PHP ,很多对于程序设计方面的思路值得多思考和借鉴。函数式编程不是一个框架或工具,而是一种编写代码的方式。FP 是一种软件开发风格,主要强调功能的使用,个人觉得对于重构代码很有帮助。书中也谈到了例如 PHP5.3 中引入的闭包函数和高阶函数,在实际开发过程中善于活学活用也是函数式的灵魂所在。

PHP 新版本的解读

增加了严格的键入和标量类型声明类型声明允许你用合适的类或标量类型( boolean,integer,string,MyClass 等)限定任何函数参数。这些在PHP 5中被部分支持为“类型提示”,但没有标量支持。在PHP 7中,你也可以声明函数返回值的类型。
作为一种动态语言,PHP 将总是试图将错误类型的值强制转换为期望的标量类型。
例如,当给定一个字符串时,需要一个整数参数的函数将强制该值为一个整数,文件顶部引用强制类型检测模式

declare(strict_types=1);

参数异常会抛出如下错误e

PHP Warning: Uncaught TypeError: Argument 1 passed to increment() must be of the type integerstring

Ramda函数式编程之PHP

0x00 何为函数式编程

网上已经有好多详细的接受了,我认为比较重要的有:

  1. 函数是“第一等公民”,即函数和其它数据类型一样处于平等地位
  2. 使用“表达式”(指一个单纯的运算过程,总是有返回值),而不是“语句”(执行操作,没有返回值)
  3. 没有”副作用“,即不修改外部值

0x01 开始函数式编程

在此之前,请先了解PHP中的匿名函数和闭包,可以参考我写得博客
函数式编程有两个最基本的运算:合成和柯里化。

函数合成

函数合成,即把多个函数的运算合成一个函数,如
A=f(x)
B=g(x)
C=f(g(x))
那么C即是A和B的合成。
用代码表示为:

$compose = function ($f,$g){
    return function ($x) use($f,$g){ //这里返回一个函数的函数,即高阶函数

Swoole| Swoole 中 Process

date: 2018-1-8 20:56:08
title: Swoole| Swoole 中 Process

这篇 blog 折腾了很久才写出来, 问题主要还是在 理解 上. 有时候就是这样,

理解了之后就很简单, 不理解就很难; 知道了就很简单, 不知道往往就很难. 所以 stay hungry stay foolish stay young 真的很重要

本来计划开发 swoft 框架 中的 Process 模块, 所以需要对 swoole 的 Process 模块要有比较深入的了解才行. 不过根据 swoole

关于 php json API接口开发的注意问题

关于 php json接口开发的注意问题

一是注意跨域问题.需要加 Access-Control-Allow-Origin:*  http头.(针对于前端浏览器脚本调用接口)

二是如果请求的header里  Content-Type: 是 application/json,则需要用 file_get_contents("php://input");接收.如果用 swoole 框架的话,需要用$request->rawContent()接收.

如果请求header里Contente-Type是 multipart/form-data,或application/x-www-form-urlencoded或application/octet-stream
则需要用 $_POST($_GET)或$_FILES来接收.

Ps :js 代码调用接口示例如下

1.要加contentType: "application/json; charset=utf-8",

2.需要使用JSON.stringify 转换json对象或把对象转为字符形式,如'{"aa":22}'(json两边加单引号)

var submit_sync = function() {  
    $.ajax({  
        type: "post",  
        url: 'add-post-json.php',  
        
                

php nginx 实时输出

PHP 里开启实时输出方法是ob_implicit_flush()
但它大部分情况下都不管用,

因为php.ini配置里output_buffering输出缓冲大部分是On开启的,
还有zlib.output_compression也经常会被开启,

除了 PHP 这一层,还有 Nginx 的缓冲设置proxy_buffering,和压缩gzip也大都是开启的。
为了一两个页面的需求,修改整个服务器的网站配置,恐怕没有人会做这种选择。

这里推荐一下简单的方法:

set_time_limit(0);
ob_end_clean();
ob_implicit_flush();

header('X-Accel-Buffering: no'); // 关键是加了这一行。

echo '现在是:'.date('H:i:s').'<br>';
sleep(5);
echo '五秒后:'.date('H:i:s');

 

    

PHP中类静态调用和范围解析操作符的区别

<?php
//在子类或类内部用“::”调用本类或父类时,不是静态调用方法,而是范围解析操作符。


class ParentClass {
    public static $my_static = 'parent var ';
    public function test() {
        self::who();    // 输出 'parent' 是范围解析,不是静态调用
        $this->who();    // 输出 'child'
        static::who();  // 输出 'child' 延迟静态绑定 是范围解析,不是静态调用
    } 

    public function who() {
        echo 'parent<br>';
    }
}