一直想写点Swoole的东西,毕竟它重新定义了php,却一直不知道怎么下手写

Swoole涉及的知识点非常多,互为表里,每次想写都发现根本理不出一个头绪

Swoole是一个php的扩展,它的核心目的就是解决php在实现server服务中可能遇到的一系列问题,这些问题用源生的php往往并不能很高效(执行效率)的解决,一般也不会使用php来解决,所以会有说swolle重新定义的php的说法。

其实swoole也提供了一个框架,swoole framework是基于swoole extension设计的一个框架,要用好这个框架,还是要先了解swoole extension。

扩展的英文名称是Extension,php扩展是用C语言作为开发语言,基于Zend引擎提供的API,编译成的一个动态库。

如果曾经做过类似动态库调用开发的童鞋可能会更好理解一些,例如Android中的NDK开发

在php的配置文件中配置好extension的属性后,就可以引用这个动态库了。

也就是说,swoole本身是用C语言编写的,它可以让php获得一些额外的function。

然后是运行方式,swoole的许多功能都只能运行在cli模式下,而cli模式往往是很多刚接触swoole的phper遇到的第一个问题。

有时候其实只是需要转变一下思路

我们现在整理一下最常见的php代码执行方式:

安装apache、php

配置apache对那个目录进行php解析

用浏览器访问那个目录的php文件

更多的细节这里就不提了,毕竟我相信每个phper对这个都是很熟悉的。

但这里就开始出现了第一个问题,我们知道,php是一个脚本语言,脚本语言的核心特点在于不用编译,随时执行,而执行脚本的工具就是解析器,而php的解析器就是zend引擎。

严格来说,zend并不是唯一的选择,不过,zend是最官方的。另外,Zend Studio和Zend Engine不是同一个东西,本文中的Zend全部指Zend Engine。

换个角度讲,只要有解析器,写好的php脚本就是可以执行的,而zend引擎与apache之间并没有绝对的关系

实际上,apahce是调用了zend对php脚本进行执行,然后将执行结果输出给了浏览器

所以所谓cli模式(CommandLine,命令行模式),其实就是在命令行下直接调用zend引擎对php脚本进行解析并执行,并获得程序输出结果的php脚本执行方式。

其实php也可以作为shell脚本来使用哦,就像bash shell一样

既然问题讲清楚了,在一个系统中具体怎么操作呢?

本文以CentOS 7.5作为系统环境,swoole是针对linux系统开发的,windows下并不适用。学习swoole的一个前题是懂得基本的linux系统使用。

当安装好php的时候,找到php的安装目录,如果是默认安装的话,可以试试whereis命令

# 某种简单的方法 whereis php > /usr/local/bin/php;

locate whereis find这些命令都可以试试,目的是找到php

然后我们来写一个最经典的php脚本:

<?php //vi hello_cli.php echo'Hello PHP Cli';

编写纯php脚本时,php标签不要封口

然后我们在shell里执行它:

/usr/local/bin/php hello_cli.php > Hello PHP Cli

这段代码中的第一个php,是一个可执行文件,它接受一个php脚本文件作为输入参数,并解析执行这个php脚本文件(通过zend)。

没有错,第一个cli模式下的php程序就被你执行成功了!

默认情况下,php都会被安装在了$PATH的目录下,那就可以直接省略路径前缀了,下文中调用php的时候,全都省略了路径前缀。

因为swoole是pecl的项目,所以使用pecl安装是最简单的方法,强烈推荐第一次接触的童鞋先使用pecl安装,在熟悉了swoole之后,再考虑使用编译安装的方式以获取更多进阶功能。

pecl这个工具基本都会被安装在与php相同的目录下(往往也都是$PATH目录)

pecl install swoole

执行以下命令查看是否安装成功:

php -m | grep swoole > swoole

如果正确的输出了swoole,那么恭喜你,这次安装很成功

另一个常见的比较麻烦的问题是,有些童鞋的电脑里安装了多个php,而安装的时候没有正确的安装到预期的php的扩展目录中,就会导致无法正常工作,解决方案就是弄清楚各个php安装目录及配置关系,选择正确的目录进行安装。

其实本文还没正式开始介绍swoole,都是在学习swoole之前的准备工作,swoole的上手门槛比一般的php应用要高的多,如果没有网络开发和操作系统方面的一些知识,学习它并不是一件容易的事情,学习曲线很陡峭。

这句话我在群里说了无数次

很多新手会诟病swoole的手册写的太模糊,其实是前置知识不足,而手册也给出了需要的前置知识列表,以下引用至官网的手册-学习swoole需要哪些知识?

多进程/多线程

了解Linux操作系统进程和线程的概念

了解Linux进程/线程切换调度的基本知识

了解进程间通信的基本知识,如管道、UnixSocket、消息队列、共享内存

socket

了解SOCKET的基本操作如accept/connect、send/recv、close、listen、bind

了解SOCKET的接收缓存区、发送缓存区、阻塞/非阻塞、超时等概念

IO复用

了解select/poll/epoll

了解基于select/epoll实现的事件循环,Reactor模型

了解可读事件、可写事件

TCP/IP网络协议

了解TCP/IP协议

了解TCP、UDP传输协议

调试工具

使用gdb调试Linux程序

使用strace跟踪进程的系统调用

使用tcpdump跟踪网络通信过程

其他Linux系统工具,如ps、lsof、top、vmstat、netstat、sar、ss等

Swoole 遇上 PHP会是怎样的结果呢的更多相关文章

  1. 当 Swoole 遇上 ThinkPHP5 世界你好

    本文假设你已经有了 Linux 操作系统的 PHP 环境,强烈推荐使用 Vagrant 来搭建开发环境 安装 Swoole PECL 拓展 可以通过 pecl 命令或者通过源码包编译安装,本文采用 p ...

  2. PHP 当Swoole 遇上 ThinkPHP5

    本文假设你已经有了 Linux 操作系统的 PHP 环境,强烈推荐使用 Vagrant 来搭建开发环境 安装 Swoole PECL 拓展可以通过 pecl 命令或者通过源码包编译安装,本文采用 pe ...

  3. MVC遇上bootstrap后的ajax表单模型验证

    MVC遇上bootstrap后的ajax表单验证 使用bootstrap后他由他自带的样式has-error,想要使用它就会比较麻烦,往常使用jqueyr.validate的话只有使用他自己的样式了, ...

  4. 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)

      邀请函: 尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实 ...

  5. 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)

        我们将在广州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战技巧. 时间:2 ...

  6. 敏捷遇上UML——软创基地马年大会(深圳站 2014-3-15)

    邀请函: 尊敬的阁下: 我们将在深圳为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战 ...

  7. 初识genymotion安装遇上的VirtualBox问题

    想必做过Android开发的都讨厌那慢如蜗牛的 eclipse原生Android模拟器吧! 光是启动这个模拟器都得花上两三分钟,慢慢的用起来手机来调试,但那毕竟不是长久之计,也确实不方便,后来知道了g ...

  8. SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败解决方案

    SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败的问题,可作如下尝试: 更新失败后,在windows的[事件查看器→应用程序]中找到来源为MsiInstaller,事件ID为1 ...

  9. 当创业遇上O2O,新一批死亡名单,看完震惊了!

    当创业遇上O2O,故事就开始了,总投入1.6亿.半年开7家便利店.会员猛增至10万……2015半年过去后,很多故事在后面变成了一场创业“事故”,是模式错误还是烧钱过度?这些项目的失败能给国内创业者带来 ...

随机推荐

  1. Java学习——基本数据类型

    Java两大数据类型 内置数据类型 引用数据类型 变量就是申请内存存储值,内存管理系统根据变量的类型分配相应的存储空间存储该类型的数据. 内置数据类型 8中基本类型(四个整数型,两个浮点型),一种字符 ...

  2. Uint8Array 对象

    8 位无符号整数值的类型化数组.内容将初始化为 0.如果无法分配请求数目的字节,则将引发异常. 语法 uint8Array = new Uint8Array( length ); uint8Array ...

  3. WCF笔记

    http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iparameterinspector.aftercall ...

  4. Hadoop学习(2)-- HDFS

    随着信息技术的高度发展,数据量越来越多,当一个操作系统管辖范围存储不下时,只能将数据分配到更多的磁盘中存储,但是数据分散在多台磁盘上非常不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,因此诞 ...

  5. Java基础之处理事件——使窗口处理自己的事件(Skethcer 1 handing its own closing event)

    控制台程序. 为表示事件的常量使用标识符可以直接启用组件对象的特定事件组.调用组件的enableEvent()方法,并把想要启用事件的标识符传送为参数,但这只在不使用监视器的情况下有效.注册监听器会自 ...

  6. nginx:403 forbidden 二种原因

    出现403 forbidden的两种原因:1.是缺少索引文件(index.html/inde.php):2.是权限问题 一.缺少索引文件index.html/inde.php 比如下面的配置: ser ...

  7. 理解运算符 || 和 && 及方法

    || 前面为true的话直接返回前面的值,前面为false的话返回后面的值.如下: console.log(0 || 1); console.log(1 || 0); console.log(1 || ...

  8. 利用JAVA计算TFIDF和Cosine相似度-学习版本

    写在前面的话,既然是学习版本,那么就不是一个好用的工程实现版本,整套代码全部使用List进行匹配效率可想而知. [原文转自]:http://computergodzilla.blogspot.com/ ...

  9. typedef NS_OPTIONS 位移的枚举

    typedef NS_OPTIONS里面的枚举可以并存使用  用 | 来并存

  10. Effective C++ 2.构造 析构 赋值运算

    //条款07:为多态基类声明virtual析构函数 // 1.若基类的析构函数不定义为虚函数,由于基类的指针或引用可以指向派生类的对象,则在删除基类对象的时候可能会出错,导致破坏数据结构. // 2. ...