小丁的屋舍
PHP | Faker模拟数据批量生成
2022-08-08
查看标签
2530次浏览

说到“Faker”,是不是会联想到那个LOL界的大魔王?但是这里的此“Faker”非上面说的“Faker”。这个“Faker”也可以号称一个大魔王,测试数据生成的大魔王!Faker 是一个 PHP 库,可用来生成虚假数据。它已在 GitHub 上获得 26.5k Star。

Github:https://github.com/fzaninotto/Faker

简介

Faker 灵感来自 Perl 语言的 Data::Faker 和 Ruby 的 Faker 两个项目的混合。现在受欢迎度已经超过了另外两个。

Faker 要求 PHP 版本 >= 5.3.3.

下载

  • Composer 下载
    composer require fzaninotto/faker
  • Github 下载

使用

使用Faker\Factory::create()来创建和初始化一个faker生成器。这个生成器可以生成数据。生成数据的方式是通过访问你想要的数据类型的属性名。

生成虚假数据

<?php
require '../vendor/autoload.php';
$faker = Faker\Factory::create('zh_CN'); //选择中文
//可用循环输出多个
echo $faker->name(),'<br>';             //武振国
echo $faker->address(),'<br>';          //昆明滨城区
echo $faker->phonenumber(),'<br>';      //17770379727
echo $faker->email(),'<br>';            //molestias_eveniet@foxmail.com
echo $faker->bank();                    //中国农业银行

有了这个类库,测试起来就舒服很多了。
觉得生成的数据不够随机的可以去改源码,例如这里就是address方法生成的城市名数组,可以把你的家乡也加进去!

<?php
namespace Faker\Provider\zh_CN;
class Address extends \Faker\Provider\Address 
{
    protected static $cites = array(
        '北京','上海','天津','重庆',
        '哈尔滨','长春','沈阳','呼和浩特',
        '石家庄','乌鲁木齐','兰州','西宁',
        '西安','银川','郑州','济南',
        '太原','合肥','武汉', '长沙',
        '南京','成都','贵阳','昆明',
        '南宁','拉萨','杭州','南昌',
        '广州','福州','海口',
        '香港','澳门'
        );
        
    protected static $states = array(
        '北京市','天津市','河北省','山西省',
        '内蒙古自治区','辽宁省','吉林省',
        '黑龙江省','上海市','江苏省',
        '浙江省','安徽省','福建省','江西省',
        '山东省','河南省','湖北省','湖南省',
        '广东省','广西壮族自治区','海南省',
        '重庆市','四川省','贵州省','云南省',
        '西藏自治区','陕西省','甘肃省','青海省',
        '宁夏回族自治区','新疆维吾尔自治区',
        '香港特别行政区','澳门特别行政区','台湾省'
        );
        
    protected static $stateAbbr = array(
        '京','皖','渝','闽',
        '甘','粤','桂','黔',
        '琼','冀','豫','黑',
        '鄂','湘','吉','苏',
        '赣','辽','蒙','宁',
        '青','鲁','晋','陕',
        '沪','川','津','藏',
        '新','滇','浙','港',
        '澳','台'
        );
}

即使这个例子展示了一个属性读取,每个对$faker->name的声明都会产生一个随机结果。这是因为 Faker 使用__get()魔法,将Faker\Generator->$property的声明转发到了Faker\Generator->format($property)。

<?php
for ($i = 0; $i < 10; $i++) {
  echo $faker->name, "\n";
}
  // Adaline Reichel
  // Dr. Santa Prosacco DVM
  // Noemy Vandervort V
  // Lexi O'Conner
  // Gracie Weber
  // Roscoe Johns
  // Emmett Lebsack
  // Keegan Thiel
  // Wellington Koelpin II
  // Ms. Karley Kiehn V

与数据库一起使用

<?php
require_once __DIR__.'/vendor/autoload.php';
set_time_limit(0);
$faker = Faker\Factory::create();

$host = "127.0.0.1";
$user = 'root';
$passwrod = 'root';
$dbName = 'demo';

$link = new mysqli($host,$user,$passwrod,$dbName);//连接数据库
if($link->connect_error){
    die('连接失败:'.$link->connect_error);
}

$num = 100;//添加数据条数
$table = 'text';//需要操作表名称

for($i = 0;$i < $num;$i++)
{
    //设置对应表字段信息
    $data[$i]['name'] = $faker->userName;
    $data[$i]['password'] = '123456';
    $data[$i]['email'] = $faker->email;
    $data[$i]['truename'] = $faker->name();
}

//逐步添加数据
for($i = 0;$i < $num;$i++)
{
    //获取字段信息
    $key = array_keys($data[$i]);
    $key_str = implode(',',$key);
    
    //获取字段对应数据
    $val = array_values($data[$i]);
    $var_str = implode("','",$val);
    $var_str = "'".$var_str."'";
    
    //拼接sql语句
    $sql = "insert into $table ($key_str) values($var_str)";
    
    //执行sql语句
    mysqli_query($link,$sql);
}

blog.csdn.net_20200519170342104.png
blog.csdn.net_20200519170421634.png

格式器

每个生成器属性(例如名字,地址,乱数假文)都被叫做“格式器”。一个Faker生成器有很多的格式器,被打包在“providers”中。这里是一些默认的格式器。

Faker\Provider\Base

randomDigit             // 7
randomDigitNot(5)       // 0, 1, 2, 3, 4, 6, 7, 8, or 9
randomDigitNotNull      // 5
randomNumber($nbDigits = NULL, $strict = false) // 79907610
randomFloat($nbMaxDecimals = NULL, $min = 0, $max = NULL) // 48.8932
numberBetween($min = 1000, $max = 9000) // 8567
randomLetter            // 'b'
// returns randomly ordered subsequence of a provided array
randomElements($array = array ('a','b','c'), $count = 1) // array('c')
randomElement($array = array ('a','b','c')) // 'b'
shuffle('hello, world') // 'rlo,h eoldlw'
shuffle(array(1, 2, 3)) // array(2, 1, 3)
numerify('Hello ###') // 'Hello 609'
lexify('Hello ???') // 'Hello wgt'
bothify('Hello ##??') // 'Hello 42jz'
asciify('Hello ***') // 'Hello R6+'
regexify('[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'); // sm0@y8k96a.ej

Faker\Provider\en_US\Person

title($gender = null|'male'|'female')     // 'Ms.'
titleMale                                 // 'Mr.'
titleFemale                               // 'Ms.'
suffix                                    // 'Jr.'
name($gender = null|'male'|'female')      // 'Dr. Zane Stroman'
firstName($gender = null|'male'|'female') // 'Maynard'
firstNameMale                             // 'Maynard'
firstNameFemale                           // 'Rachel'
lastName
这些方法都接受了$timezone参数默认传递到date_default_timezone_get()。你可以对每个方法传递一个timezone字符串参数,或者是在使用$faker::setDefaultTimezone($timezone)时,为所有的time方法自定义一个timezone。

Faker\Provider\Internet

email                   // 'tkshlerin@collins.com'
safeEmail               // 'king.alford@example.org'
freeEmail               // 'bradley72@gmail.com'
companyEmail            // 'russel.durward@mcdermott.org'
freeEmailDomain         // 'yahoo.com'
safeEmailDomain         // 'example.org'
userName                // 'wade55'
password                // 'k&|X+a45*2['
domainName              // 'wolffdeckow.net'
domainWord              // 'feeney'
tld                     // 'biz'
url                     // 'http://www.skilesdonnelly.biz/aut-accusantium-ut-architecto-sit-et.html'
slug                    // 'aut-repellat-commodi-vel-itaque-nihil-id-saepe-nostrum'
ipv4                    // '109.133.32.252'
localIpv4               // '10.242.58.8'
ipv6                    // '8e65:933d:22ee:a232:f1c1:2741:1f10:117c'
macAddress              // '43:85:B7:08:10:CA'

Faker\Provider\UserAgent

userAgent              // 'Mozilla/5.0 (Windows CE) AppleWebKit/5350 (KHTML, like Gecko) Chrome/13.0.888.0 Safari/5350'
chrome                 // 'Mozilla/5.0 (Macintosh; PPC Mac OS X 10_6_5) AppleWebKit/5312 (KHTML, like Gecko) Chrome/14.0.894.0 Safari/5312'
firefox                // 'Mozilla/5.0 (X11; Linuxi686; rv:7.0) Gecko/20101231 Firefox/3.6'
safari                 // 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_7_1 rv:3.0; en-US) AppleWebKit/534.11.3 (KHTML, like Gecko) Version/4.0 Safari/534.11.3'
opera                  // 'Opera/8.25 (Windows NT 5.1; en-US) Presto/2.9.188 Version/10.00'
internetExplorer       // 'Mozilla/5.0 (compatible; MSIE 7.0; Windows 98; Win 9x 4.90; Trident/3.0)'

如果你有如下的需求:引导数据库,创建好看的XML文档,充实你的压力测试,或者从生产服务中匿名化数据,Faker 可以满足你的要求

结束

关于本项目的更多详细信息,可去查看这里https://github.com/fzaninotto/Faker

文/小丁&互联网
图/互联网