注意事项
1、所有的配置文件都必须放到应用的Config目录下。
2、配置文件的名称必须和启动脚本的名称完全一致。
3、大部分选项都是可选的,至于必配项会在圆括号内加以特别说明,需要开发者特别留意。
4、除了数据库配置文件以外,其余所有的配置文件都可以保持原始默认配置不动, 因为它是针对应用的一个默认全局初始化设置,完全可以在各个业务实例内部调用 setXXX 方法实现同样的配置效果,这个在实际开发中使用的几率较大且更灵活。
应用配置说明
01、每个应用默认都包含有四类配置文件:
- global.php: 全局配置文件,一般无需修改,除非有新增全局子配置文件。
- main.php: 全局子配置文件,主要用来配置和任务相关的全局参数。
- database.php:全局子配置文件,主要用来配置和数据库相关的全局参数。
- xxxx.php: 这里的xxxx代表各个业务worker实例,用来配置各个业务worker实例相关的参数。
02、每个业务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
03、global.php
全局配置文件,一般无需修改,除非有新增全局子配置文件。
04、main.php
全局子配置文件,主要用来配置和任务相关的全局参数。
<?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)
'.........' => ...., //是否启动其他的AppWorker实例 (可选项,自由设定)
),
//全局任务配置参数:每条任务也可以单独配置自己的context成员,最终采用merge合并覆盖策略
'task' => array(
//任务爬取间隔,单位秒,最小支持0.001秒 (可选项,默认1秒)
'crawl_interval' => 1,
//任务队列最大task数量, 0代表无限制 (可选项,默认0)
'max_number' => 0,
//特指每个下载器进程可以建立到解析器的最大连接数 (可选项,默认1,最小值为1,最大值为1000)
'max_connections' => 1,
//当前socket连接累计最大请求数,如果当前socket连接的累计请求数超过最大请求数时,
//parser端会主动关闭连接,同时客户端会自动尝试重连,0代表无限制 (可选项,默认0)
'max_request' => 0,
//通信数据压缩算法
'compress' => [
'enabled' => true, //是否启用通信数据压缩 (可选项,默认true)
'algorithm' => 'gzip', //通信数据压缩算法:gzip 或 deflate (可选项,默认gzip)
],
//限定爬取站点域,留空表示不受限
'limit_domains' => [],
//根据预期任务总量和误判率引擎会自动计算布隆过滤器最优的bitmap长度以及hash函数的个数
'bloomfilter' => [
'expected_insertions' => 10000, //预期任务总量
'expected_falseratio' => 0.01, //预期误判率
],
//特别注意: 此处配置的context是全局context,我们也可以为每条任务设置私有context,
//其上下文成员完全相同,全局context与任务私有context最终采用合并覆盖的策略,
//context上下文成员主要是针对任务设置的,但同时拥有很大灵活性,可以间接影响依赖性服务,
//比如可以通过设置context上下文成员来影响HTTP请求时的各种上下文参数 (可选项,默认为空)
//HTTP引擎默认采用Guzzle客户端,兼容支持Guzzle所有的请求参数选项,具体参考Guzzle手册。
//特别注意:个别上下文成员的用法是和Guzzle官方不一致的,一方面主要就是屏蔽其技术性概念,
//另一方面面向开发者来说,关注点主要是能进行简单的配置即可,所以不一致的会注释特别说明。
'context' => array(
//是否缓存下载数据(可选项,默认false)
'cache_enabled' => false,
//缓存下载数据存放目录 (可选项,默认位于系统临时目录下)
'cache_directory' => sys_get_temp_dir() . '/DownloadCache4PHPCreeper/',
//在特定的生命周期内是否允许重复抓取同一个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,
//设置http请求头:默认引擎会自动伪装成常见的各种随机User-Agent
'headers' => [
'User-Agent' => 'Mozilla/5.0 Chrome/124.0.0.0 Safari/537.36',
'Accept' => 'text/html,*/*',
],
//cookies成员的配置格式和guzzle官方不大一样,屏蔽了cookieJar,取值[false|array]
'cookies' => [
//'domain' => 'domain.com',
//'k1' => 'v1',
//'k2' => 'v2',
],
//无头浏览器,如果是动态页面考虑启用,否则应当禁用 [默认使用chrome且为禁用状态]
//更多其他无头参数详见手册[常见问题]章节
'headless_browser' => ['headless' => false],
//要不要提取子URL,注意提取成功后并不会入队,
//可配合onParserFindUrl回调API自行入队[默认true]
'extract_sub_url' => true,
//除了内置参数之外,还可以自由配置自定义参数,在上下游业务链应用场景中十分有用
'user_define_key1' => 'user_define_value1',
'user_define_key2' => 'user_define_value2',
//更多其他上下文参数详见手册[应用配置]和[常见问题]章节
),
),
//初始任务配置参数:既支持一维数组形式的单任务,也支持二维数组形式的多任务
'task_init' => [
'active' => true, //激活或冻结当前任务,冻结后任务将会被直接丢弃
'url' => 'http://www.weather.com.cn/weather/101010100.shtml',
'method' => 'get',
'type' => 'text', //已丧失原本的概念设定,可以自由设定类型
'rule_name' => 'r1', //如果留空,将使用md5($task_id)作为规则名
'refefer' => '',
'rule' => [
//在这里配置具体的抽取规则,如果规则留空,默认将返回原始的下载内容
//关于如何编写抽取规则,请移步抽取规则一节。
],
'context' => [], //任务私有context
],
);
05、database.php
全局子配置文件,主要用来配置和数据库相关的参数。
<?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起,使用更为安全的分布式红锁
),
);
06、AppProducer.php
配置第一个生产器业务实例
<?php
return array(
'name' => 'producer1', //当前实例名称,也可以代码级 $worker->setName()设定,注意代码级优先级较高 (可选项,默认none)
'count' => 1, //当前实例数量,即启动进程数量,也可以代码级 $worker->setCount()设定,注意代码级优先级较高 (可选项,默认1)
'interval' => 1, //生产任务的时间间隔,单位秒,最小支持0.001秒 (可选项,默认1秒)
);
07、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
),
),
),
);
08、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
),
),
);