精华内容
下载资源
问答
  • 服务器处理处理了第一个数据,将处理结果经过一定处理以后发送给客户端5.客户端接收到结果,自动将处理结果显示并发送到服务器6.服务器接收到处理结果 把它转发到服务器处理端7.处理端继续处理结果...8.循环4-7...

    其实也就是类似于dedecms生成静态页。

    想法:

    1.客户端发送请求

    2.服务器端接受请求,开始统计所需处理的数据量

    3.把所需处理数据按一定规则排列,发送到服务器处理端

    4.服务器处理端处理了第一个数据,将处理结果经过一定处理以后发送给客户端

    5.客户端接收到结果,自动将处理结果显示并发送到服务器

    6.服务器接收到处理结果 把它转发到服务器处理端

    7.处理端继续处理结果...

    8.循环4-7步骤,直到处理结束

    实验过程:

    1.创建数据库和表

    create databases handle;

    create table user(

    id int unsigned not null auto_increment primary key,

    name varchar(8),

    sex tinyint(1) default '1',

    score int not null,

    state tinyint(1)

    );

    2.向表中添加数据(这里就不示例了)

    3.创建index.html客户端,a.php服务端1,b.php服务端2

    Index.html:

    客户端

    开始请求

    //创建一个模态框

    function display(value){

    $('span').html(value);

    }

    //ajax

    function send(dizhi){

    $.ajax({

    type: "get",

    url: dizhi,

    success: function(msg){

    var arr=JSON.parse(msg);

    console.log(arr);

    //alert(arr.value);

    var tishi="已经处理 "+arr.now +"个,共"+arr.all+"个";

    display(tishi);

    if(arr.now!=arr.all){

    send("a.php?now="+arr.now+"&all="+arr.all);

    }else{

    alert("完成!");

    }

    }

    });

    }

    a.php:

    require('./dbconfig.php');

    $link=mysql_connect(HOST,USER,PASS) or die('数据库链接失败');

    mysql_select_db(DBNAME);

    /*

    查询数据

    $sql="select * from user";

    $result=mysql_query($sql);

    $row=mysql_fetch_assoc($result);

    var_dump($row);

    */

    /*

    循环插入

    for($i=3;$i<=100;$i++){

    $sql= "insert into user(name,score,state) values('z".$i."',".$i.",1)";

    mysql_query($sql);

    }

    */

    /*查询需要处理的数据总数*/

    //isset($_GET['state'])?$_GET['state']:0;

    if(isset($_GET['state'])){

    $sql="select count(*) from user";

    $result=mysql_query($sql);

    $all=mysql_result($result,0);

    $now=0;

    header("Location: b.php?all={$all}&now=0");

    }else{

    header("Location: b.php?all={$_GET['all']}&now={$_GET['now']}");

    }

    /*返回当前处理的数据*/

    b.php:

    require('./dbconfig.php');

    $link=mysql_connect(HOST,USER,PASS) or die('数据库链接失败');

    mysql_select_db(DBNAME);

    /*返回当前处理的数据*/

    //$id=$_GET['id'];//获取将要处理的id

    $now=$_GET['now'];//已经处理的个数

    $all=$_GET['all'];//总共要处理的个数

    $sql="select score from user limit {$now},1";

    $result=mysql_query($sql);

    $value=mysql_result($result, 0);

    $now++;

    $arr=array(

    'now'=>$now,

    'all'=>$all,

    'value'=>$value

    );

    //print_r($arr);

    echo json_encode($arr);

    dbconfig.php:

    define('HOST','127.0.0.1');

    define('USER', 'root');

    define('PASS','root');

    define('DBNAME','handle');

    展开全文
  • 有业务需求需要一次性循环n条数据,插入或更新数据库时,如果单纯的循环,插入/更新,会消耗太多的数据库资源以下是一种简单的解决方案数据库的insert是可以批量更新的,当有大量数据循环insert时,可以将数据先保留不...

    有业务需求需要一次性循环n条数据,插入或更新数据库时,如果单纯的循环,插入/更新,会消耗太多的数据库资源

    243f31b77ef94527dff6ea2cb5521ca1.png

    以下是一种简单的解决方案

    数据库的insert是可以批量更新的,当有大量数据循环insert时,可以将数据先保留不执行插入命令,到最后一条时一次性插入,例如tp的addAll()方法; (推荐学习:PHP视频教程)

    数据库的update 如果使用case when 的话,也是可以批量更新的。

    本文主要讲关于批量insert;

    生成一个订单

    正常情况的语句为:INSERT INTO order (`goods_id`,`num`,`price`) VALUES (1,1,'10.00');

    //封装成函数

    function add_order($goods_id,$num,$price){

    $db->query("INSERT INTO order (`goods_id`,`num`,`price`) VALUES ($goods_id,$num,$price)");

    }

    假设有一个用户,一次性将购物车的1000个商品结算成订单,生成1000个订单时;for ($i=0;$i<1000;$i++){

    $db->query("INSERT INTO order (`goods_id`,`num`,`price`) VALUES ($goods_id,$num,$price)");

    }

    //这样的话会导致服务器资源占用过大,网站卡死

    //所以,我们可以

    $sql = "INSERT INTO order (`goods_id`,`num`,`price`) VALUES ";

    for ($i=0;$i<1000;$i++){

    if($i==0){

    $sql.="($goods_id,$num,$price)";

    }else{

    $sql.=",($goods_id,$num,$price)";

    }

    }

    $db->query($sql);

    大概意思就是这样了,批量更新实现比较麻烦一点,就不发了,以下是批量更新的sql执行语句UPDATE tiyan.dm_user_cupboard SET `res_id` = CASE `id` WHEN 1041 THEN '1' WHEN 1058 THEN '1' WHEN 1055 THEN '1' END,`food_code` = CASE `id` WHEN 1041 THEN '68' WHEN 1058 THEN '47' WHEN 1055 THEN '49' END,`food_name` = CASE `id` WHEN 1041 THEN '红枣' WHEN 1058 THEN '莲藕' WHEN 1055 THEN '洋葱' END,`num` = CASE `id` WHEN 1041 THEN '2' WHEN 1058 THEN '3' WHEN 1055 THEN '2' END,`level` = CASE `id` WHEN 1041 THEN '2' WHEN 1058 THEN '2' WHEN 1055 THEN '2' END,`update_time` = CASE `id` WHEN 1041 THEN '2017-12-09 21:40:06' WHEN 1058 THEN '2017-12-09 21:40:06' WHEN 1055 THEN '2017-12-09 21:40:06' END WHERE id IN ( 1041,1058,1055 )

    展开全文
  • 我会写两个脚本:文件index.php:function progress(percent){document.getElementById('done').innerHTML=percent+'%';}0%文件job.php:set_time_limit(0); // ignore php timeoutignore_user_abort(true); ...

    我会写两个脚本:

    文件index.php:

    function progress(percent){

    document.getElementById('done').innerHTML=percent+'%';

    }

    0%

    文件job.php:

    set_time_limit(0); // ignore php timeout

    ignore_user_abort(true); // keep on going even if user pulls the plug*

    while(ob_get_level())ob_end_clean(); // remove output buffers

    ob_implicit_flush(true); // output stuff directly

    // * This absolutely depends on whether you want the user to stop the process

    // or not. For example: You might create a stop button in index.php like so:

    // Stop!

    // Start

    // But of course, you will need that line of code commented out for this feature to work.

    function progress($percent){

    echo '';

    }

    $total=count($mobiles);

    echo '

    '; // webkit hotfix

    foreach($mobiles as $i=>$mobile){

    // send sms

    progress($i/$total*100);

    }

    progress(100);

    echo ''; // webkit hotfix

    展开全文
  • 原标题:PHP处理大量数据的问题如果有文章推荐,或者你们要看什么的技术文章,请在留言处留言,感谢支持例如从两张表中分别查出上百万条数据,现在需要把这些数据组装在一起然后在插入到另外一张表中,请问除了使用...

    原标题:PHP处理大量数据的问题

    如果有文章推荐,或者你们要看什么的技术文章,请在留言处留言,感谢支持

    例如从两张表中分别查出上百万条数据,现在需要把这些数据组装在一起然后在插入到另外一张表中,请问除了使用数组组装外还能怎么处理,如果使用数组的话怎么才能保证不超出内存限制。

    mysql_query函数查询的方式是查询出全部结果后缓存到内存中,这样就会出现超内存的现象,使用另外一个函数mysql_unbuffered_query可以解决这个问题,mysql_unbuffered_query不会缓存结果集,而是查询出来数据后立马对结果集进行操作,也就是便查询边返回,这样就不会出现超出内存的现象,但是使用mysql_unbuffered_query的是时候不能使用 mysql_num_rows() 和 mysql_data_seek()。并且向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。例如:

    使用缓存结果集的代码:

    functionselecttest(){

    try{

    $pdo= newPDO( "mysql:host=localhost;dbname=test", 'root', '123456'); //不使用缓存结果集方式

    //$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);$sth= $pdo->prepare( 'select * from test');

    $sth->execute();

    echo'最初占用内存大小:'. memory_get_usage() . "n";

    $i= 0;

    while( $result= $sth->fetch(PDO::FETCH_ASSOC)) {

    $i+= 1;

    if( $i> 10) {

    break; } sleep( 1); print_r( $result);

    echo'占用内存大小:'. memory_get_usage() . "n"; }} catch( Exception$e) {

    echo$e->getMessage();}}

    执行时将会报超出内存的错误:

    Fatal error: Allowed memory size of 134217728bytes exhausted (tried to allocate 204800000bytes)

    inE:ProgramDevelopmentRuntimeEnvironmentxampphtdocs testtest.php on line 56Call Stack: 0.0005135392

    1. {main}() E:ProgramDevelopmentRuntimeEnvironmentxampphtdocs testtest.php: 00.00051355682. test->selecttest() E:ProgramDevelopmentRuntimeEnvironmentxampphtdocs testtest.php: 850.00501425283. PDOStatement->execute() E:ProgramDevelopmentRuntimeEnvironmentxampphtdocs testtest.php: 56

    将上面代码中的$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);一行的注释去掉后将不在缓存结果集,这时运行该函数的结果如下:

    最初占用内存大小: 144808Array( [id] => 1[a] => v [b] => w [c] => i)占用内存大小: 145544Array( [id] => 2[a] => b [b] => l [c] => q)占用内存大小: 145544Array( [id] => 3[a] => m [b] => p [c] => h)占用内存大小: 145536Array( [id] => 4[a] => j [b] => i [c] => b)占用内存大小: 145536

    可以看到,这时返回一条数据内存占用非常的小,也就700多字节,这样就不会出现超出内存的错误了。返回搜狐,查看更多

    责任编辑:

    展开全文
  • use PhpOffice\PhpSpreadsheet\IOFactory;use PhpOffice\PhpSpreadsheet\Spreadsheet;class Xlsx{public static function load($filePath){$inputFileType = IOFactory::identify($filePath);$excelReader = IOFacto...
  • 分享给大家供大家参考,具体如下:PHP批量任务处理PHP在批量处理任务的时候会超时,其实解决方法很简单了,就是把任务分割,一次处理一部分,任务进度可以放在服务端也可以放在客户端,不是很复杂的话放在客户端,用js来...
  • I am using php and mysql to get the data. Thanks in advance 解决方案 Just like @symbcbean said, the process of creating a file and appending the data with each query offset is very slow. So i came up...
  • phpExcel将读取的单元格信息保存在内存中,我们可以通过复制代码 代码如下:...1、将单元格数据序列化后保存在内存中复制代码 代码如下:PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;2、...
  • 我这里只是构建了一个数组来给大家演示,平常你在操作数据库输出数据也是一样的。转为array//仓库库存扣除测试public function cangku_stock(){//set_time_limit(0); //表示永久运行,这里我是测试array的时候用到的...
  • 环境mysql: 5.6.34php: 5.6nginx: php-fpm适用场景需要处理一定数据集业务从mysql读取一定数据的业务导出一次需要处理一定的mysql业务操作更新删除等更多需要处理一定数据集的操作pdo 关键设置$dbh = new \PDO($dsn,...
  • 前言本文主要介绍了关于PHP利用PDO从mysql读取大量数据处理的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。环境mysql: 5.6.34php: 5.6nginx: php-fpm适用场景需要处理一定数据集业务...
  • 当有业务需求需要一次性循环n条数据,插入或更新数据库时,如果单纯的循环,插入/更新,会消耗太多的数据库资源一下是一种简单的解决方案数据库的insert 是可以批量更新的,当有大量数据循环insert时,可以将数据先保留不...
  • $fp = fopen('php://output', 'a'); //打开output流 mb_convert_variables('GBK', 'UTF-8', $columns); fputcsv($fp, $columns); //将数据格式化为CSV格式并写入到output流中 $pagesize = '1000000'; //从数据库...
  • php处理百万级以上的数据提高查询速度的方法:1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order ...
  • 在做一API,APP端想抽取简要数据进行缓存在手机端,所以设计了一个接口提供给APP调取,经过测试,这个JSON格式的数据包在在2M左右(尽可能的精简并且做了序列化处理),导致response时间大概要10秒左右,这样很不理想,...
  • 1.for循环插入大量数据到数据库2.事务提交大量数据3.将SQL语句进行拼接values(),()...然后再一次性插入代码如下
  • 这篇文章主要为大家详细介绍了PHP 事务处理数据实现方法,具有一定的参考价值,可以用来参考一下。感兴趣的小伙伴,下面一起跟随512笔记的小编小韵来看看吧!代码如下:public function insertUser ($userArray){...
  • 这篇文章主要是从原理, 手册和源码分析在PHP中查询MySQL返回大量结果时, 内存占用的问题, 同时对使用MySQL C API也有涉及.昨天, 有同事在PHP讨论群里提到, 他做的一个项目由于MySQL查询返回的结果太多(达10万条), ...
  • 由于误删数据,需要恢复,但是不能影响线上服务: public function insertData() { $number = 11020095; $interval = 500000; $file_name = ' /tmp/table_name_12220095.sql'; for ($i = 1; $i ; $i++) { $samll = $...
  • php分批更新数据

    2021-04-11 12:25:26
    php分批更新数据2018-02-2859有的时候我们可能会遇到要刷新数据的操作,但是一次更新太多数据的话会使出现502的现象,那么我们常用到的方法就是批量自动刷新。我最近就遇到要批量下载远程图片到本地然后更新图片地址...
  • 官方解释yieldyield生成器是php5.5之后出现的,官方文档这样解释:yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。生成器的核心是一个yield...
  • 01 分布式限流:Nginx+ZooKeeper ...在 x Nginx 中,如何使用未定义的服务器名称来阻止处理请求? 使用 “ 反向代理服务器 ” 请列举 x Nginx 服务器的最佳用途。 请解释 x Nginx 服务器上的 r Master 和 和 r Wo
  • 场景如下:数据库里有大量记录,php程序需要取出来做一些运算,是一次取出所有还是一次取出部分?示例代码如下://一次读取$start = '2012-06-11 00:00:00';$end = '2012-06-18 00:00:00';$rows = $db->query(...
  • php里面提供有非一次全部加载数据的API,是像处理流媒体那样,随用随取随丢、数据并不会积累在内存的查询方法。这个问题在PHP的官方网站上叫缓冲查询和非缓冲查询(BufferedandUnbufferedqueries)。PHP的查询缺省...
  • 中将max_input_vars调大改为5000就可以了原因追查:from的enctype="multipart/form-data"php版本5.6.6问题:部分POST数据接收不到追源代码发现是php中max_input_vars配置造成的; 相关函数为rfc1867_post_handler,...
  • 遇到这样的错误起初让我很诧异,但转眼一想,也不奇怪,因为我正在开发的这个程序是要用一个foreach循环语句在一个有4万条记录的表里全表搜索具有特定特征的数据,也就是说,一次要把4万条数...
  • 官方解释yieldyield生成器是php5.5之后出现的,官方文档这样解释:yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。生成器的核心是一个yield...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 117,659
精华内容 47,063
关键字:

php处理大量数据