在PHP中处理大量数据而无需浏览器超时 [英] Processing large amounts of data in PHP without a browser timeout

查看:267
本文介绍了在PHP中处理大量数据而无需浏览器超时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一组移动号码,大约50,000。我尝试使用第三方API处理和发送批量短信到这些号码,但浏览器将冻结几分钟。



处理数据涉及检查手机号码类型(如CDMA),为所有号码分配唯一的ID以供进一步参考,检查



我想到在数据库中排队数据,并使用cron每分钟批量发送大约5k,但这需要时间如果有很多消息。

解决方案

我在其他选项上使用Codeigniter 2



我会写两个脚本:



文件 index.php

 < iframe src =job.phpframeborder =0scrolling =nowidth =1height =1> ;< / iframe> 
< script type =text / javascript>
function progress(percent){
document.getElementById('done')。innerHTML = percent +'%';
}
< / script>< div id =done> 0%< / div>

档案 job.php

  set_time_limit(0); // ignore php timeout 
ignore_user_abort(true); //继续前进,即使用户拉出插头*
while(ob_get_level())ob_end_clean(); // remove output buffers
ob_implicit_flush(true); // output stuff directly
// *这完全取决于你是否希望用户停止进程
//或者不是。例如:您可以在index.php中创建一个停止按钮,如下所示:
//< a href =javascript:window.frames [0] .location ='';> Stop! a>
//< a href =javascript:window.frames [0] .location ='job.php';>开始< / a>
//但是当然,你需要注释掉这行代码才能使这个特性起作用。

function progress($ percent){
echo'< script type =text / javascript> parent.progress('。$ percent。');< / script& ';
}

$ total = count($ mobiles);
echo'<!DOCTYPE html>< html>< head>< / head>< body>'; // webkit hotfix
foreach($ mobiles as $ i => $ mobile){
// send sms
progress($ i / $ total * 100);
}
progress(100);
echo'< / body>< / html>'; // webkit hotfix


I have array of mobile numbers, around 50,000. I'm trying to process and send bulk SMS to these numbers using third-party API, but the browser will freeze for some minutes. I'm looking for a better option.

Processing of the data involves checking mobile number type (e.g CDMA), assigning unique ids to all the numbers for further referencing, check for network/country unique charges, etc.

I thought of queuing the data in the database and using cron to send about 5k by batch every minute, but that will take time if there are many messages. What are my other options?

I'm using Codeigniter 2 on XAMPP server.

解决方案

I would write two scripts:

File index.php:

<iframe src="job.php" frameborder="0" scrolling="no" width="1" height="1"></iframe>
<script type="text/javascript">
    function progress(percent){
        document.getElementById('done').innerHTML=percent+'%';
    }
</script><div id="done">0%</div>

File 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:
//     <a href="javascript:window.frames[0].location='';">Stop!</a>
//     <a href="javascript:window.frames[0].location='job.php';">Start</a>
// But of course, you will need that line of code commented out for this feature to work.

function progress($percent){
    echo '<script type="text/javascript">parent.progress('.$percent.');</script>';
}

$total=count($mobiles);
echo '<!DOCTYPE html><html><head></head><body>'; // webkit hotfix
foreach($mobiles as $i=>$mobile){
    // send sms
    progress($i/$total*100);
}
progress(100);
echo '</body></html>'; // webkit hotfix

这篇关于在PHP中处理大量数据而无需浏览器超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆