应用配置说明
[!WARNING|style:callout|label:注意事项|iconVisibility:default|labelVisibility:default|className:block-warning] 1、首先除了数据库配置文件以外,其余所有的配置文件都可以保持原始默认配置不动,
因为它是针对应用的一个默认全局初始化设置,完全可以在各个业务实例内部调用
setXXX方法实现同样的配置效果,这个在实际开发中应该使用几率较大且更灵活。
2、所有的配置文件都必须放到应用的Config目录下;
3、配置文件的名称必须和启动脚本的名称完全一致;
4、大部分选项都是可选的,至于必配项会在圆括号内加以特别说明,需要开发者特别留意;
0x01、每个应用默认都包含有四类配置文件:
- global.php: 全局配置文件,一般无需修改,除非有新增全局子配置文件。
- main.php: 全局子配置文件,主要用来配置和任务相关的参数。
- database.php:全局子配置文件,主要用来配置和数据库相关的参数。
- XXX.php:业务实例配置文件,XXX代表各个业务worker实例,全部位于应用各自的Config目录下。
0x02、每个业务worker实例各自拥有一个独立的配置文件:
假设我们为Weather应用编写了3个不同的业务worker实例,那么其对应的配置文件分别是:
/path/to/PHPCreeper-Application/Application/Spider/Weather/Config/AppProducer.php
/path/to/PHPCreeper-Application/Application/Spider/Weather/Config/AppDownloader.php
/path/to/PHPCreeper-Application/Application/Spider/Weather/Config/AppParser.php
那么这3个业务worker实例对应的启动脚本分别如下:
/path/to/PHPCreeper-Application/Application/Spider/Weather/Start/AppProducer.php
/path/to/PHPCreeper-Application/Application/Spider/Weather/Start/AppDownloader.php
/path/to/PHPCreeper-Application/Application/Spider/Weather/Start/AppParser.php
0x03、global.php
全局配置文件,一般无需修改,除非有新增全局子配置文件。
0x04、main.php
return array(
'language' => 'zh', //设置语言环境,目前暂支持中文和英文 (可选项,默认zh)
'multi_worker' => true, //是否启用多worker运作模式 (可选项,默认true)
'start' => array(
'AppProducer' => true, //是否启动AppProducer实例 (可选项,默认true)
'AppDownloader' => true, //是否启动AppDownloader实例 (可选项,默认true)
'AppParser' => true, //是否启动AppParser实例 (可选项,默认true)
'.........' => ...., //是否启动其他的worker实例 (愿意配哪个就配哪个)
),
//全局任务配置参数:每条任务也可以单独配置自己的context成员,最终采用merge合并覆盖策略
'task' => array(
'crawl_interval' => 1, //任务爬取间隔,单位秒,最小支持0.001秒 (可选项,默认1秒)
'max_depth' => 1, //最大爬取深度, 0代表爬取深度无限制 (可选项,默认1)
'max_number' => 1000, //任务队列最大task数量, 0代表无限制 (可选项,默认0)
//当前Socket连接累计最大请求数,0代表无限制 (可选项,默认0)
//如果当前Socket连接的累计请求数超过最大请求数时,
//parser端会主动关闭连接,同时客户端会自动尝试重连
'max_request' => 1000,
//通信数据压缩算法
'compress' = [
'enabled' => true, //是否启用通信数据压缩 (可选项,默认true)
'algorithm' => 'gzip', //通信数据压缩算法:gzip 或 deflate (可选项,默认gzip)
],
//限定爬取站点域,留空表示不受限
'limit_domains' => [],
//特别注意: 此处配置的context是全局context,我们也可以为每条任务设置私有context,
//其上下文成员完全相同,全局context与任务私有context最终采用合并覆盖的策略,
//context上下文成员主要是针对任务设置的,但同时拥有很大灵活性,可以间接影响依赖性服务,
//比如可以通过设置context上下文成员来影响HTTP请求时的各种上下文参数 (可选项,默认为空)
//HTTP引擎默认采用Guzzle客户端,兼容支持Guzzle所有的请求参数选项,具体参考Guzzle手册。
//特别注意:个别上下文成员的用法是和Guzzle官方不一致的,一方面主要就是屏蔽其技术性概念,
//另一方面面向开发者来说,关注点主要是能进行简单的配置即可,所以不一致的会注释特别说明。
'context' => array(
//是否缓存下载数据(可选项,默认false)
'cache_enabled' => false,
//缓存下载数据存放目录 (可选项,默认位于系统临时目录下)
'cache_directory' => '/tmp/task/download/' . date('Ymd'),
//在特定的生命周期内是否允许重复抓取同一个URL资源(可选项,默认false)
'allow_url_repeat' => false,
//要不要跟踪完整的TASK数据包,开启后终端会显示完整的任务数据包 [默认false]
'track_task_package' => true,
//在v1.6.0之前,如果rulename留空,默认会使用 md5($task_url)作为rulename
//自v1.6.0开始,如果rulename留空,默认会使用 md5($task_id) 作为rulename
//所以这个配置参数是仅仅为了保持向下兼容,但是不推荐使用,因为有潜在隐患
//换句话如果使用的是v1.6.0之前旧版本,那么才有可能需要激活本参数 [默认false]
'force_use_md5url_if_rulename_empty' => false,
//强制使用多任务创建API的旧版本参数风格,保持向下兼容,不再推荐使用 [默认false]
'force_use_old_style_multitask_args' => false,
//cookies成员的配置格式和guzzle官方不大一样,屏蔽了cookieJar,取值[false|array]
'cookies' => [
//'domain' => 'domain.com',
//'k1' => 'v1',
//'k2' => 'v2',
],
//除了内置参数之外,还可以自由配置自定义参数,在上下游业务链应用场景中十分有用
'user_define_arg1' => 'user_define_value1',
'user_define_arg2' => 'user_define_value2',
),
),
//初始任务配置参数:既支持一维数组形式的单任务,也支持二维数组形式的多任务
'task_init' => [
'url' => 'http://www.weather.com.cn/weather/101010100.shtml',
'method' => 'get',
'type' => 'text', //类型自由定制
'rule_name' => 'r1', //如果留空,将使用md5($task_id)作为规则名
'refefer' => '',
'rule' => [
//在这里配置具体的抽取规则,如果规则留空,默认将返回原始的下载内容
//关于如何编写抽取规则,请移步抽取规则一节
],
'context' => [], //任务私有context
],
);
0x05、database.php
全局子配置文件,主要用来配置和数据库相关的参数,其中针对redis的配置可支持一维或二维数组,如果省略,默认将连接 tcp://127.0.0.1:6379
服务器,基于爬虫应用特殊性和单一性,而且基本上主要用到队列服务,所以依赖redis的内核实现并不支持redis集群,但是支持redis分区。另注意:分布式或分离式部署时,必须保证所有的worker共享相同的配置。
<?php
return array(
'redis' => array(
'prefix' => 'Weather', //所有的redis实例必须使用相同的前缀,否则将使用内置的PHPCreeper前缀
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
'auth' => false, //当需要密码鉴权时,auth必须且只能配置为true
'pass' => 'guest', //鉴权密码
'connection_timeout' => 5, //连接超时时间,0代表使用默认超时时间
//'read_write_timeout' => 0, //数据传输超时,0代表使用默认超时时间
//'use_red_lock' => true, //自v1.6.4起,使用更为安全的分布式红锁
),
);
0x06、AppProducer.php
配置第一个生产器业务实例
<?php
return array(
'name' => 'producer1', //当前实例名称,也可以代码级 $worker->setName()设定,注意代码级优先级较高 (可选项,默认none)
'count' => 1, //当前实例数量,即启动进程数量,也可以代码级 $worker->setCount()设定,注意代码级优先级较高 (可选项,默认1)
'interval' => 1, //生产任务的时间间隔,单位秒,最小支持0.001秒 (可选项,默认1秒)
);
0x07、AppDownloader.php
配置第一个下载器业务实例
<?php
return array(
'name' => 'downloader1', //当前实例名称,也可以代码级 $worker->setName()设定,注意代码级优先级高 (可选项,默认none)
'count' => 2, //当前实例数量,即启动进程数量,也可以代码级 $worker->setCount()设定,注意代码级优先级高 (可选项,默认1)
//配置远程parser业务实例的socket地址,只能是一维数组或二维数组,即支持集群部署 (必配项)
'socket' => array(
'client' => array(
'parser' => array(
'scheme' => 'ws', //必须和远程parser业务实例监听的协议一致,默认ws
'host' => '127.0.0.1', //远程parser业务实例主机地址,默认127.0.0.1
'port' => 8888, //远程parser业务实例主机端口,默认8888
),
),
),
);
0x08、AppParser.php
配置第一个解析器业务实例
<?php
return array(
'name' => 'parser1', //当前实例名称,也可以代码级 $worker->setName()设定,注意代码级优先级高 (可选项,默认none)
'count' => 3, //当前实例数量,即启动进程数量,也可以代码级 $worker->setCount()设定,注意代码级优先级高 (可选项,默认1)
//配置socket监听 (必配项)
'socket' => array(
'server' => array(
'scheme' => 'websocket', //默认websocket,支持frame、text以及自定义协议
'host' => '0.0.0.0', //默认0.0.0.0
'port' => 8888, //默认8888
),
),
);