Swoole

PHP用Swoole实现爬虫(一)

旧城冷巷雨未停 提交于 2019-11-27 06:45:33
基本概念 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 swoole PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。 技术方案 本来,公司的意愿是,写几个PHP脚本,使用linux定时任务crontab既可。后来我一琢磨,正好现在不是业务改动频繁期,而且,服务化是迟早要做的事情,因此,便开始我的爬坑旅程。 PHP是有一套比较成熟的异步常驻内存的框架的, workerman ,倒不是不采取,而是既然决定采用新的方案,正好也不赶工期,为何不挑战一下新技术呢? 爬坑之旅(一) swoole协议选取 由于公司之前是没有进行过tcp连接的优化基础的大神在,因此我们采用是朴实的方案,http协议。 swoole是原生支持http服务器的,参见官网,开启一个http server是很简单的: $serv = new Swoole\Http

swoole http server 性能优化

巧了我就是萌 提交于 2019-11-27 06:45:23
上线了一个基于 swoole http server 的服务以后,发现这个服务的请求耗时监控毛刺十分严重,接口耗时波动比较大,经过一段时间的分析,发现这个服务 response 包十分大,有些 response 包高达1 ~ 2M,甚至更大,这样就很清楚了,因为包太多,导致服务相应波动比较大。 这里稍微解释下,为什么 response 包会导致相应时间波动,这里主要有两个方面的影响,第一是包大会导致 swoole 之间进程通信更加耗时,并占用更多资源,第二是包大会导致 swoole 的 reactor 线程发包更加耗时,关于 reactor 的解释,摘自 Swoole的主进程是一个多线程的程序。其中有一组很重要的线程,称之为Reactor线程。它就是真正处理TCP连接,收发数据的线程。 Swoole的主线程在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,并由这个线程负责监听此socket。在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。在socket可写时将数据发送给TCP客户端。 那么怎么优化呢? 其实很简单,那就是直接在 swoole 里开启 gzip,这里摘自 swoole 文档 启用Http GZIP压缩。压缩可以减小HTML内容的尺寸,有效节省网络带宽,提高响应时间。必须在write/end发送内容之前执行gzip

workman 和swoole 区别 和异同

一曲冷凌霜 提交于 2019-11-27 06:44:18
workerman workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。workerman的目标是让PHP开发者更容易的开发出基于socket的高性能的应用服务,而不用去了解PHP socket以及PHP多进程细节。 workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行其中 workerman有两种进程模型 1、基本的master worker模型 2、master gateway worker模型master worker模型工作流程及进程间关系如下: master worker模型说明:master进程为主进程,启动过程中读取conf配置,根据每个应用配置中的ip和端口创建监听socket,然后再根据配置中的进程数创建对应数量的子进程即worker进程,worker进程会自动继承master进程创建的监听socket,使得worker进程能够独立的接受并处理客户端的连接。而后master进程进入监听信号的逻辑中,监听worker进程退出信号(worker进程退出后

基于Swoole扩展开发异步高性能的MySQL代理服务器

蹲街弑〆低调 提交于 2019-11-26 19:21:21
MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵。开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减少connect/close的网络开销。 此Server考虑到了设置了数据库连接池尺寸,区分忙闲,mysqli断线重连,并设置了负载保护。基于swoole扩展开发,io循环使用epoll,是全异步非阻塞的,可以应对大量TCP连接。 程序的逻辑是:启动时创建N个MySQL连接,收到客户端发来的SQL后,分配1个MySQL连接,将SQL发往数据库服务器。然后等待数据库返回查询结果。当数据库返回结果后,再发给对应的客户端连接。 核心的数据结构是3个PHP数组。idle_pool是空闲的数据库连接,当有SQL请求时从idle_pool中移到busy_pool中。当数据库返回结果后从busy_pool中再移到idle_pool中,以供新的请求使用。当SQL请求到达时如果没有空闲的数据库连接,那会自动加入到wait_queue中。一旦有SQL完成操作,将自动从wait_queue中取出等待的请求进行处理。 如此循环使用。由于整个服务器是异步的单进程单线程所以完全不需要锁。而且是完全异步的,效率非常高。 当然本文的代码,如果要用于生产环境,还需做更多的保护机制和压力测试。在此仅抛砖引玉

swoole server 超时控制以及踩过的坑

谁说胖子不能爱 提交于 2019-11-26 18:45:27
在选定swoole作为PHP微服务的底层以后,我找了很久swoole server端的超时控制,但是,swoole的官方文档里,没有写server端的超时控制(类似于php-fpm的request_terminate_timeout配置),swoole源码里的example写了 examples/process/func_timeout.php <?php declare(ticks = 1); Swoole\Async::set([ 'enable_signalfd' => false, ]); class FunctionTimeoutException extends RuntimeException { } function test() { sleep(1); } $serv = new Swoole\Http\Server("127.0.0.1", 9502); $serv->set(['worker_num' => 1]); $serv->on('WorkerStart', function($serv, $workerId) { pcntl_signal(SIGALRM, function () { Swoole\Process::alarm(-1); throw new FunctionTimeoutException; }); }); $serv->on(

构建swoole docker镜像(基于alpine基础镜像)

安稳与你 提交于 2019-11-25 17:03:38
这里默认你已经安装好docker,并准备好以下环境 一.环境 Ubuntu 18.04.1 LTS php:7.2.4-cli-alpine3.7 ( https://hub.docker.com/_/php/ 拉取) swoole-4.2.1 ( https://pecl.php.net/package/swoole 下载) docker version $ docker version Client: Version: 18.05.0-ce API version: 1.37 Go version: go1.9.5 Git commit: f150324 Built: Wed May 9 22:16:13 2018 OS/Arch: linux/amd64 Experimental: false Orchestrator: swarm Server: Engine: Version: 18.05.0-ce API version: 1.37 (minimum version 1.12) Go version: go1.9.5 Git commit: f150324 Built: Wed May 9 22:14:23 2018 OS/Arch: linux/amd64 Experimental: false 二.基于pecl构建 $ mkdir build-swoole &&