Beanbun 是用 PHP 编写的多进程网络爬虫框架,具有良好的开放性、高可扩展性。
Beanbun 是一个简单可扩展的爬虫框架,支持守护进程模式与普通模式,守护进程模式基于 Workerman,下载器基于 Guzzle。
框架名称来自于作者家的猫,此猫名叫门丁,“门丁”是北方的一种面点。门丁 -> 豆包 -> bean bun
- 支持守护进程与普通两种模式(守护进程模式只支持 Linux 服务器)
- 默认使用 Guzzle 进行爬取
- 支持分布式
- 支持内存、Redis 等多种队列方式
- 支持自定义URI过滤
- 支持广度优先和深度优先两种爬取方式
- 遵循 PSR-4 标准
- 爬取网页分为多步,每步均支持自定义动作(如添加代理、修改 user-agent 等)
- 灵活的扩展机制,可方便的为框架制作插件:自定义队列、自定义爬取方式...
Beanbun 可以通过 composer 进行安装。
$ composer require kiddyu/beanbun
创建一个文件 start.php,包含以下内容
<?php
require_once(__DIR__ . '/vendor/autoload.php');
use Beanbun\Beanbun;
$beanbun = new Beanbun;
$beanbun->seed = [
'http://www.950d.com/',
'http://www.950d.com/list-1.html',
'http://www.950d.com/list-2.html',
];
$beanbun->afterDownloadPage = function($beanbun) {
file_put_contents(__DIR__ . '/' . md5($beanbun->url), $beanbun->page);
};
$beanbun->start();
在命令行中执行
$ php start.php
接下来就可以看到抓取的日志了。
上面的例子中,爬虫是以普通模式运行的,上面的代码放在网站项目中,也可以正常执行,如果我们想让爬虫一直执行,就需要使用守护进程模式。同样是上面的代码,我们只需要把执行的命令增加一个 start 参数,即会变成守护进程模式。
$ php start.php start
需要说明的是,普通模式下不依赖队列,爬虫只爬取 seed 中得地址,依次爬取完成后,程序即结束。而守护进程模式需要另外开启队列(内存队列、Redis 队列等),但拥有更多的功能,如可以自动发现页面中的链接加入队列,循环爬取。以下是守护进程模式下的说明。
启动
// 启动爬虫,开启所有爬虫进程
$ php start.php start
停止
// 停止爬虫,关闭所有爬虫进程
php start.php stop
清理
// 删除日志文件,清空队列信息
php start.php clean
在守护模式中,如果需要使用数据库、redis 等连接,需要在各种回调函数中建立连接,否则可能会发生意想不到的错误。
建议使用单例模式,并在 [startWorker](#startworker) 中关闭之前建立的连接。
爬取糗事百科热门列表页,采用守护进程模式。在开始爬取前,我们需要一个队列,在这里使用框架中带有的内存队列。
首先建立一个队列文件 queue.php,写入下列内容
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// 启动队列
\Beanbun\Queue\MemoryQueue::server();
建立爬虫文件 start.php,写入下列内容
<?php
use Beanbun\Beanbun;
use Beanbun\Lib\Helper;
require_once(__DIR__ . '/vendor/autoload.php');
$beanbun = new Beanbun;
$beanbun->name = 'qiubai';
$beanbun->count = 5;
$beanbun->seed = 'http://www.qiushibaike.com/';
$beanbun->max = 30;
$beanbun->logFile = __DIR__ . '/qiubai_access.log';
$beanbun->urlFilter = [
'/http:\/\/www.qiushibaike.com\/8hr\/page\/(\d*)\?s=(\d*)/'
];
// 设置队列
$beanbun->setQueue('memory', [
'host' => '127.0.0.1',
'port' => '2207'
]);
$beanbun->afterDownloadPage = function($beanbun) {
file_put_contents(__DIR__ . '/' . md5($beanbun->url), $beanbun->page);
};
$beanbun->start();
接下来在命令行中执行
$ php queue.php start
$ php start.php start
先启动队列进程,再启动爬虫。
Beanbun 对象实例化后,可以对对象的一些属性进行设置,这样爬虫爬取网页时,就会按照这些设置进行爬取。
定义当前爬虫名称,string 类型,可选设置。
示例
$beanbun->name = 'demo';
定义当前爬虫运行方式,bool 类型,可选设置。
true 为守护进程模式,false 为普通模式。
CLI 模式下默认为 true,http请求下或CLI模式下没有`start`参数,默认为 false。
示例
$beanbun->daemonize = false;
定义当前爬虫进程数,仅守护进程模式下有效。int 类型,可选设置,默认为 5。
示例
$beanbun->count = 10;
定义爬虫入口,string 或 array 类型,必选设置。
示例
$beanbun->seed = 'http://www.950.com/';
// or
$beanbun->seed = [
'http://www.950d.com/',
'http://www.950d.com/list-1.html',
[
'http://www.950d.com/list-2.html',
[
'timeout' => 10,
'headers' => [
'user-agent' => 'beanbun-spider',
]
]
]
];
定义当前爬取网页url的正则表达式,符合表达式规则的 url 才会被加入队列, array 类型,可选设置。
示例
$beanbun->urlFilter = [
'/http:\/\/www.950d.com\/list-(\d*).html/'
];
定义当前爬虫最大抓取网页数量,如抓取达到此数则停止抓取,为0时不限制抓取数量,默认为0。int 类型,可选设置。
示例
$beanbun->max = 100;
定义当前每个爬虫进程抓取网页的间隔时间,默认为1,最低为0.01。double 类型,可选设置。
示例
$beanbun->interval = 0.1;
定义爬虫全局下载单个网页超时时间,单位为秒,默认为5秒。int 类型,可选设置。
如果为单个网页单独设置了超时时间(如在 options 内),则覆盖此项。
示例
$beanbun->timeout = 10;
定义爬虫全局下载单个网页 user-agent 属性,string 类型,可选设置。
`pc`时随机生成 PC 浏览器 user-agent,
`ios`时随机生成 iOS 浏览器 user-agent,
`android`时随机生成 android 浏览器 user-agent,
`mobile`时随机生成 iOS 或 android 浏览器 user-agent,
默认值为`pc`,如不为以上值,则直接使用定义值。如果为单个网页单独设置了 user-agent(如在 options 内),则覆盖此项。
示例
$beanbun->userAgent = 'ios';
// or
$beanbun->userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0';
定义当前爬虫日志文件路径,仅守护进程模式下有效。string 类型,可选设置。
示例
$beanbun->logFile = __DIR__ . '/beanbun_access.log';
定义爬虫执行钩子,也是爬虫每次爬取网页的执行顺序。array 类型,可选设置。
默认为['startWorkerHooks', 'beforeDownloadPageHooks', 'downloadPageHooks', 'afterDownloadPageHooks', 'discoverUrlHooks', 'afterDiscoverHooks', 'stopWorkerHooks',
]
示例
$beanbun->hooks = [
'startWorkerHooks',
'beforeDownloadPageHooks',
'downloadPageHooks',
'afterDownloadPageHooks',
'discoverUrlHooks',
'afterDiscoverHooks',
'customHooks',
'stopWorkerHooks',
];
返回当前爬虫进程id,int 类型
示例
// 下载页面后写一条日志,记录进程下载页面成功
$beanbun->afterDownloadPage = function($beanbun) {
$beanbun->log("beanbun worker id {$beanbun->id} download page success!");
};
// 2017-01-01 00:00:00 beanbun worker id 0 download page success!
返回当前爬取网页的队列信息,array 类型
示例
// 下载页面后写一条日志,记录爬取页面地址
$beanbun->afterDownloadPage = function($beanbun) {
$beanbun->log("beanbun worker download {$beanbun->queue['url']} success!");
};
// 2017-01-01 00:00:00 beanbun worker download http://www.950d.com/ success!
返回当前爬取网页url信息,string 类型
示例
// 下载页面后写一条日志,记录爬取页面地址
$beanbun->afterDownloadPage = function($beanbun) {
$beanbun->log("beanbun worker download {$beanbun->url} success!");
};
// 2017-01-01 00:00:00 beanbun worker GET http://www.950d.com/ success!
返回当前爬取网页method信息,string 类型
示例
// 下载页面后写一条日志,记录爬取页面地址
$beanbun->afterDownloadPage = function($beanbun) {
$beanbun->log("beanbun worker {$beanbun->method} {$beanbun->queue['url']} success!");
};
// 2017-01-01 00:00:00 beanbun worker GET http://www.950d.com/ success!
返回当前爬取网页的附加信息,array 类型
示例
// 下载页面后写一条日志,记录user-agent信息
$beanbun->afterDownloadPage = function($beanbun) {
$beanbun->log("user-agent is {beanbun->options['headers']['user-agent']}.");
};
// 2017-01-01 00:00:00 user-agent is Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0.
返回当前下载网页的网页内容,string 类型
示例
// 下载页面后把网页内容保存在文件中
$beanbun->afterDownloadPage = function($beanbun) {
file_put_contents(__DIR__ . '/' . md5($beanbun->url), $beanbun->page);
};
// or 页面内容为JSON格式,转换成数组格式以备后用
$beanbun->afterDownloadPage = function($beanbun) {
$beanbun->page = json_decode($beanbun->page, true);
}
回调函数是在 Beanbun 爬取并处理网页的过程中设置的一些系统钩子, 通过这些钩子可以完成一些特殊的处理逻辑。
所有回调函数唯一参数为 Beanbun 对象实例本身。
下图是采集爬虫爬取并处理网页的流程图, 矩形方框中标识了采集爬虫运行过程中所使用的回调函数:
在每个爬虫进程启动时执行。(多进程时,每个进程都会执行一次,如果一个爬虫只想执行一次,可用 id 判断)
示例
// 启动爬虫进程后写一条日志,记录进程启动成功
$beanbun->startWorker = function($beanbun) {
$beanbun->log("beanbun worker id {$beanbun->id} start success.");
};
// 2017-01-01 00:00:00 beanbun worker id 0 start success.
在每个爬虫进程正常关闭时执行。
示例
// 关闭爬虫进程时写一条日志,记录进程关闭成功
$beanbun->stopWorker = function($beanbun) {
$beanbun->log("beanbun worker id {$beanbun->id} stop success.");
};
// 2017-01-01 00:00:00 beanbun worker id 0 stop success.
在每次爬取网页前时执行此回调。
示例
// 爬取网页前给网页请求加上代理
$beanbun->beforeDownloadPage = function($beanbun) {
$beanbun->options['proxy'] = '123.123.123.123:88';
};
// or
functioin addProxy($beanbun) {
$beanbun->options['proxy'] = '123.123.123.123:88';
}
$beanbun->beforeDownloadPage = 'addProxy';
执行爬取,并把网页内容写入 page 属性。默认使用 Guzzle 进行网页爬取,如需替换爬取过程,则使用此回调。
示例
// 改成用 file_get_contents 进行爬取
$beanbun->downloadPage = function($beanbun) {
$beanbun->page = file_get_contents($beanbun->url);
};
爬取网页后执行此回调。
示例
// 下载页面后把网页内容保存在文件中
$beanbun->afterDownloadPage = function($beanbun) {
file_put_contents(__DIR__ . '/' . md5($beanbun->url), $beanbun->page);
};
// or 页面内容为JSON格式,转换成数组格式以备后用
$beanbun->afterDownloadPage = function($beanbun) {
$beanbun->page = json_decode($beanbun->page, true);
}
爬取网页完毕后,把 page 内容中的链接加入队列。默认把发现的新 url 根据 urlFilter 进行过滤。如需替换发现新链接的方法,则使用此回调。
示例
// 输出下载页面后发现的所有链接,不加入队列
$beanbun->discoverUrl = function($beanbun) {
$urls = Helper::getUrlByHtml($beanbun->page, $beanbun->url);
print_r($urls);
};
发现新的 url 加入队列后,执行此回调。
示例
// 发现新的 url 加入队列后,在日志中记录当前队列长度。
$beanbun->afterDiscover = function($beanbun) {
$beanbun->log("the queue number is {$beanbun->queue()->count()}.");
};
// 2017-01-01 00:00:00 the queue number is 28.
启动爬虫。无参数。如在守护进程模式下启动,进程将被阻塞,此行之后的代码不会被执行。
示例
$beanbun = new Beanbun;
$beanbun->seed = 'http://www.950d.com/';
$beanbun->start();
记录一条日志,日志前会自动加入当前时间,日志尾部会自动加入换行符。
在守护进程模式下会写入日志文件,普通模式下会直接输出。参数为 string 类型。
示例
$beanbun->beforeDownloadPage = function($beanbun) {
$beanbun->log('this is a log.');
};
// 2017-01-01 00:00:00 this is a log.
立刻抛出一条 BeanbunException 异常。 参数为 string 类型。参数可选。
示例
// 如下载网页内容小于 100 字符,则抛出异常,直接下载下一个网页。
$beanbun->afterDownloadPage = function($beanbun) {
if (strlen($beanbun->page) < 100) {
$beanbun->error();
}
};
返回队列对象实例。
示例
// 如下载网页内容小于 100 字符,则把地址重新加入队列。
$beanbun->afterDownloadPage = function($beanbun) {
if (strlen($beanbun->page) < 100) {
$beanbun->queue()->add($beanbun->url);
}
};
此方法用来设置队列,接受两个参数,第一个参数为回调函数,需返回一个队列对象,队列对象需继承自 Beanbun\Queue\QueueInterface 接口;第二个参数将作为参数传入第一个参数。
示例
// 使用框架带有的内存队列
$beanbun->setQueue('memory', [
'host' => '127.0.0.1',
'port' => '2207',
]);
// $beanbun->queue() 将返回 new \Beanbun\Queue\MemoryQueue(['host' => '127.0.0.1', 'port' => '2207']);
// or
$beanbun->setQueue(function($args){
return new \customQueue($args);
}, $args);
// $beanbun->queue() 将返回 new \customQueue($args);
返回下载器实例。因框架默认使用 Guzzle 作为下载器,所以默认返回 \GuzzleHttp\Client 实例。
示例
// 如下载网页内容小于 100 字符,则手动再重新下载一次。
$beanbun->afterDownloadPage = function($beanbun) {
if (strlen($beanbun->page) < 100) {
$request = $beanbun->downloader()->request($beanbun->method, $beanbun->url, $beanbun->options);
$beanbun->page = $request->getBody();
}
};
此方法用来设置下载器,接受两个参数,第一个参数为回调函数,需返回下载器对象;第二个参数将作为参数传入第一个参数。
示例
// 使用 php-curl-class 作为下载器。
// $ composer require php-curl-class/php-curl-class
$beanbun->setDownloader(functioin(){
return new \Curl\Curl;
});
// 修改下载网页过程
$beanbun->downloadPage = function($beanbun) {
$method = strtolower($beanbun->method);
$beanbun->page = $beanbun->downloader()->$method($beanbun->url);
};
此方法可以加载中间件,中间件会在爬虫进程启动前执行。
可接受两个参数,第一个参数为可执行函数或对象,第二个参数为 string 类型。
如第一个参数为可执行函数,则直接执行;如为实例对象,则执行以第二个参数为名的方法,默认执行 handle 方法。
以上函数或方法均会传入一个参数,即 Beanbun 实例本身。
示例
$beanbun->middleware('customFunction');
// or
$beanbun->middleware(function($beanbun) {
$beanbun->log('middleware loading is complete.');
});
// or
$beanbun->middleware(new \CustomMiddleware);
// or
$beanbun->middleware(new \CustomMiddleware, 'load');
在爬虫进程添加一个定时器。接受三个参数:
第一个参数为 double 类型,为定时器程序执行的间隔时间,单位为秒,最小0.01;
第二个参数为要执行的程序;
第三个参数作为参数传入第二个参数的程序。
方法返回一个定时器 id,int 类型,可用来销毁此定时器。
示例
use Beanbun\Beanbun;
// 每隔一天重新把首页加入队列
$beanbun->startWorker = function($beanbun) {
if ($beanbun->id == 0) {
Beanbun::timer(86400, function() use($beanbun){
$beanbun->queue()->add('http://www.950d.com/');
});
}
};
删除一个定时器,接受一个参数,int 类型,为定时器 id。
示例
use Beanbun\Beanbun;
$beanbun->beforDownloadPage = function($beanbun) {
Beanbun::timerDel($timer_id);
};
如果爬虫在守护进程模式下运行,那么需要开启一个单独的队列来对需要爬取的 url 等数据进行管理。框架默认包含了内存和 Redis 两种队列来供使用。另外用户也可以编写自己的队列类,需要继承自 QueueInterface 接口。每个队列名称都会记录在总得名为 beanbun 的队列信息中。下面列出一些通用方法。
入队,即把待爬取的网址加入队列末尾。接受两个参数,
第一个参数 $url 为需要爬取的 url,string 类型,必填;
第二个参数 $options 为请求此 url 时可配置的参数,array 选填。
$options 参数:
$options['method']: 请求类型, String类型, 可不填, 默认值是 GET。
$options['headers']:请求的Headers,其中的 user-agent 默认使用 [Beanban::userAgent](#useragent)
更多其他参数可参考 Guzzle 的 [Request Options](http://docs.guzzlephp.org/en/latest/request-options.html)
示例
// 取出页面中所有的 url 加入队列,均以 POST 来请求
$beanbun->discoverUrl = function ($beanbun) {
$urls = Helper::getUrlByHtml($beanbun->page, $beanbun->url);
foreach ($urls as $url) {
$beanbun->queue()->add($url, [
'method' => 'POST'
]);
}
};
出队,从队列首取出一条待爬取 url。返回类型为 array。
示例
// 取出下一条待爬数据输出后再放回队列末尾
$beanbun->afterDownloadPage = function ($beanbun) {
$queue = $beanbun->queue()->next();
print_r($queue);
$beanbun->queue()->add($queue['url'], $queue['options']);
};
// Array
// (
// [url] => http://www.beanbun.org/one.html
// [options] => Array
// (
// [method] => POST
// )
// )
队列长度,即还有多少条待爬 url,默认最大为 10000。返回类型为 int。
示例
// 每次爬取完成后记录队列长度到日志
$beanbun->afterDownloadPage = function ($beanbun) {
$beanbun->log("the queue number is {$beanbun->queue()->count()}.");
};
// 2017-01-01 00:00:00 the queue number is 28.
记录已爬取。接受一个参数,为队列信息。
示例
// 每次爬取完成后取出下一条记录为已爬取
$beanbun->afterDownloadPage = function ($beanbun) {
$queue = $beanbun->queue()->next();
$beanbun->queue()->queued($queue);
};
验证某 url 是否爬取过。返回类型为 bool。
示例
// 每次爬取前验证 url 是否爬取过
$beanbun->beforeDownloadPage = function ($beanbun) {
if ($beanbun->queue()->isQueued($beanbun->queue)) {
$beanbun->log('this url has crawled over.');
} else {
$beanbun->log('this url has not crawled.');
}
};
// 2017-01-01 00:00:00 this url has not crawled.
已爬取数量。返回类型为 int。
示例
// 每次爬取前验证 url 是否爬取过
$beanbun->beforeDownloadPage = function ($beanbun) {
if ($beanbun->queue()->isQueued($beanbun->queue)) {
$beanbun->log('this url has crawled over.');
} else {
$beanbun->log('this url has not crawled.');
}
};
// 2017-01-01 00:00:00 this url has not crawled.
清空队列信息。并删除在 beanbun 队列中的信息。
示例
// 停止爬虫时,自动清空队列信息
$beanbun->stopWorker = function ($beanbun) {
$beanbun->queue()->clean();
};
框架提供的内存队列,使用方便,多个爬虫可共用一个内存队列服务端,除 Beanbun 外不依赖任何外部应用,但没有提供持久化方案,是在 Workerman\GlobalData 基础上做的二次开发。
队列构造方法。接受一个 $config 参数,array 类型,选填。
$config 参数:
$config['name'],string 类型,队列名称,默认使用 [Beanbun::name](#name)
$config['host'],string 类型,内存队列ip,默认 127.0.0.1
$config['port'],string 类型,内存队列端口,默认 2207
$config['algorithm'],string 类型,爬取方式,depth 为深度优先,breadth 为广度优先,默认为 depth
示例
$beanbun->setQueue('memory', [
'host' => '127.0.0.1',
'port' => '2217',
'algorithm' => 'breadth'
]);
静态方法,开启内存队列服务端。接受两个参数。
第一个参数为服务端 ip,默认是 0.0.0.0
第二个参数为监听端口,默认是 2207
更多信息可参考 [Workerman\GlobalData Server](http://doc3.workerman.net/component/global-data-server.html)
示例
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// 启动队列,改成监听 2217 端口
\Beanbun\Queue\MemoryQueue::server('0.0.0.0', '2217');
使用 Redis 作为队列。
队列构造方法。接受一个 $config 参数,array 类型,选填。
$config 参数:
$config['name'],string 类型,队列名称,默认使用 [Beanbun::name](#name)
$config['host'],string 类型,内存队列ip,默认 127.0.0.1
$config['port'],string 类型,内存队列端口,默认 6379
$config['algorithm'],string 类型,爬取方式,depth 为深度优先,breadth 为广度优先,默认为 depth
示例
// 使用远程 redis 队列
$beanbun->setQueue('redis', [
'host' => '123.123.123.123',
'port' => '6379'
]);
Helper 类中定义了一些辅助方法,帮助用户更方便的爬取网页
返回网页中的完整链接。接受两个参数,第一个参数为网页 html,第二个参数为网页的 url
示例
use Beanbun\Lib\Helper;
$url = 'http://www.beanbun.org/1/2/demo.html';
$html =<<<STR
<ul>
<li><a href="/one.html">第一个链接</a></li>
<li><a href="two.html">第二个链接</a></li>
<li><a href="../three.html">第三个链接</a></li>
</ul>
STR;
$urls = Helper::getUrlByHtml($html, $url);
print_r($urls);
// Array
// (
// [0] => http://www.beanbun.org/one.html
// [1] => http://www.beanbun.org/1/2/two.html
// [2] => http://www.beanbun.org/1/three.html
// )
根据相对地址和页面地址返回完整链接。接受两个参数,第一个参数为相对 uri,第二个参数为网页的 url
示例
use Beanbun\Lib\Helper;
$href = '/one.html';
$url = 'http://www.beanbun.org/1/2/demo.html';
echo Helper::formatUrl($href, $url);
// http://www.beanbun.org/one.html
根据设备随机获取user-agent,接受一个参数,即设备类型,有 pc/ios/android/mobile 可选
示例
use Beanbun\Lib\Helper;
echo Helper::randUserAgent('pc');
// Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)11
echo Helper::randUserAgent('mobile');
// Mozilla/5.0 (iPad; CPU OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/34.0.1847.18 Mobile/11B554a Safari/9537.53444
框架提供的数据库操作类,修改自 Medoo。支持 MySQL, MariaDB, MSSQL (Windows/Linux/UNIX), Oracle, SQLite, PostgreSQL, Sybase。依赖相应的 pdo 扩展。
DbConnection 的配置参数,array 类型。
示例
use Beanbun\Lib\Db;
Db::$config = [
'zhihu' => [
'server' => '127.0.0.1',
'port' => '3306',
'username' => 'zhihu',
'password' => 'xxxxxx',
'database_name' => 'zhihu',
'database_type' => 'mysql',
'charset' => 'utf8',
],
'qiushibaike' => [
'server' => '127.0.0.1',
'port' => '3306',
'username' => 'qiushibaike',
'password' => 'xxxxxx',
'database_name' => 'qiushibaike',
'database_type' => 'mysql',
'charset' => 'utf8',
],
];
根据名称返回 DbConnection 实例。接受一个参数,string 类型,即实例名称
示例
use Beanbun\Lib\Db;
Db::instance('zhihu');
根据名称关闭 DbConnection 连接。接受一个参数,string 类型,即实例名称
示例
use Beanbun\Lib\Db;
Db::close('zhihu');
关闭所有 DbConnection 连接。
示例
use Beanbun\Lib\Db;
Db::closeAll();
use Beanbun\Lib\Db;
// select
Db::instance('zhihu')->select("account", [
"user_name",
"email"
], [
"user_id[>]" => 100
]);
// insert
Db::instance('zhihu')->insert("account", [
"user_name" => "foo",
"email" => "foo@bar.com",
"age" => 25
]);
// update
Db::instance('zhihu')->update("account", [
"type" => "user",
// All age plus one
"age[+]" => 1,
// All level subtract 5
"level[-]" => 5,
// All score multiplied by 2
"score[*]" => 2,
// Like insert, you can assign the serialization
"lang" => ["en", "fr", "jp", "cn", "de"],
"(JSON) fav_lang" => ["en", "fr", "jp", "cn", "de"],
// You can also assign # for using SQL functions
"#uid" => "UUID()"
], [
"user_id[<]" => 1000
]);
// delete
Db::instance('zhihu')->delete("account", [
"AND" => [
"type" => "business",
"age[<]" => 18
]
]);
// 事务
Db::instance('zhihu')->action(function($database) {
$database->insert("account", [
"name" => "foo",
"email" => "bar@abc.com"
]);
$database->delete("account", [
"user_id" => 2312
]);
// If you want to find something wrong, just return false to rollback the whole transaction.
if ($database->has("post", ["user_id" => 2312]))
{
return false;
}
});
更多用法,请参考 Medoo 文档。