循环一定计数卷曲岗位

时间:2014-11-29 15:57:56

标签: php loops curl

我是新来的,为我的问题找到答案,希望得到你的好意见。提前谢谢。

我编写了一个HTTP API来使用curl发送短信。一切都工作正常,除了我没有循环和发布某些电话号码的卷曲。例如:用户在我的网站上使用Excel工作表上传50000个电话号码,我从数据库中获取所有手机号码,然后通过CURL发布。

现在我发送请求的短信网关通过http api一次只接受最多10000个号码。

因此,从50000个提取的数字中我想将数字拆分为10000并循环并发送卷曲帖子。

这是我的代码

    //have taken care of sql injection on live site
    $resultRestore = mysql_query("SELECT * FROM temptable WHERE userid = '".$this->user_id."' AND  uploadid='".$uploadid."' ");
    $rowRestoreCount = mysql_num_rows($resultRestore);
    @mysql_data_seek($resultRestore, 0); 
    $phone_list = "";
    while($rowRestore = mysql_fetch_array($resultRestore))
    {
        $phone_list .= $rowRestore['recphone'].","; 
    }

    $url = "http://www.smsgatewaycenter.com/library/send_sms_2.php?UserName=".urlencode($this->param[userid])."&Password=".urlencode($this->param[password])."&Type=Bulk&To=".urlencode(substr($phone_list, 0, -1))."&Mask=".urlencode($this->sendname)."&Message=Hello%20World";
    //echo $url;
    $ch = curl_init($url);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $curl_scraped_page = curl_exec($ch);
    curl_close($ch); 

现在,从$phone_list,我需要为每10000个数字循环,我怎样才能实现这个目标?

已经过了两天,我尝试了几件事而没有得到结果。

请帮助......

1 个答案:

答案 0 :(得分:0)

注意:我将首先提出有关使用 mysql 功能的强制性警告。请考虑切换为mysqliPDO

有许多不同的方法可以做到这一点。就个人而言,我会重新配置您的脚本,以便一次只从数据库中获取10,000个数字并将其放入循环中。它可能看起来像这样(请注意,为简单起见,我没有更新mysq *调用mysqli *)。 请记住,我没有通过编译器执行此操作,因为我的大多数代码都无法实际测试

// defines where the query starts from
$offset= 0; 
// defines how many to get with the query
$limit = 10000; 
// set up base SQL to use over and over updating offset
$baseSql = "SELECT * FROM temptable WHERE userid = '".$this->user_id."' AND  uploadid='".$uploadid."' LIMIT ";
// get first set of results
$resultRestore = mysql_query($baseSql . $offset . ', '. $limit);
// now loop
while (mysql_num_rows($resultRestore) > 0)
{
    $rowRestoreCount = mysql_num_rows($resultRestore);
    $phone_list = "";
    while($rowRestore = mysql_fetch_array($resultRestore))
    {
        $phone_list .= $rowRestore['recphone'].","; 
    }

    $url = "http://www.smsgatewaycenter.com/library/send_sms_2.php?UserName=".urlencode($this->param[userid])."&Password=".urlencode($this->param[password])."&Type=Bulk&To=".urlencode(substr($phone_list, 0, -1))."&Mask=".urlencode($this->sendname)."&Message=Hello%20World";
    //echo $url;
    $ch = curl_init($url);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $curl_scraped_page = curl_exec($ch);
    curl_close($ch); 

    // now update for the while loop

    // increment by value of limit
    $offset += $limit; 
    // now re-query for the next 10000
    // this will continue until there are no records left to retrieve
    // this should work even if there are 50,123 records (the last loop will process 123 records)
    $resultRestore = mysql_query($baseSql . $offset . ', '. $limit);


}

您也可以在sql查询中不使用偏移量和限制来实现此目的。这可能是一种更简单的方法:

// define our maximum chunk here
$max = 10000;

$resultRestore = mysql_query("SELECT * FROM temptable WHERE userid = '".$this->user_id."' AND  uploadid='".$uploadid."' ");
$rowRestoreCount = mysql_num_rows($resultRestore);
@mysql_data_seek($resultRestore, 0); 
$phone_list = "";

// hold the current number of processed phone numbers
$count = 0;

while($rowRestore = mysql_fetch_array($resultRestore))
{
    $phone_list .= $rowRestore['recphone'].","; 

    $count++;
    // when count hits our max, do the send
    if ($count >= $max)
    {
        $url = "http://www.smsgatewaycenter.com/library/send_sms_2.php?UserName=".urlencode($this->param[userid])."&Password=".urlencode($this->param[password])."&Type=Bulk&To=".urlencode(substr($phone_list, 0, -1))."&Mask=".urlencode($this->sendname)."&Message=Hello%20World";
        //echo $url;
        $ch = curl_init($url);  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $curl_scraped_page = curl_exec($ch);
        curl_close($ch);

        // now reset count back to zero
        $count = 0;
        // and reset phone_list
        $phone_list = '';
    }
}

// if we don't have # of phones evenly divisible by $max then handle any leftovers
if ($count > 0)
{

    $url = "http://www.smsgatewaycenter.com/library/send_sms_2.php?UserName=".urlencode($this->param[userid])."&Password=".urlencode($this->param[password])."&Type=Bulk&To=".urlencode(substr($phone_list, 0, -1))."&Mask=".urlencode($this->sendname)."&Message=Hello%20World";
    //echo $url;
    $ch = curl_init($url);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $curl_scraped_page = curl_exec($ch);
    curl_close($ch);
}

我注意到您正在检索$ curl_scraped_pa​​ge中的信息。在上述任何一种情况下,如果您在$ curl_scraped_pa​​ge上进行任何处理,则需要考虑新的循环。

同样,请考虑切换到mysqli或PDO,并记住,有可能更有效和灵活的方法来实现这一点,而不是你在这里做的。例如,您可能希望记录成功的发送,以防脚本中断并将其合并到您的脚本中(例如,通过从数据库中仅选择那些尚未收到此文本的数字)。这将允许您重新运行您的脚本,但只发送给尚未收到文本的人,而不是再次击中所有人(或者您的SMS网关可能为您处理?)

修改

另一种方法是将所有检索到的数字加载到一个数组中,然后将数组分块并处理每个数据块。

$numbers = array();
while ($rowRestore = mysql_fetch_array($resultRestore))
{
    $numbers[] = $rowRestore['recphone'];
}
// split into chunks of 10,000
$chunks = array_chunk($numbers, 10000);
// loop and process the chunks
foreach ($chunks AS $chunk)
{
    // $chunk will be an array, so implode it with comma to get the phone list
    $phone_list = implode(',', $chunk);

    // note that there is no longer a need to substr -1 the $phone_list because it won't have a trailing comma using implode()
    $url = "http://www.smsgatewaycenter.com/library/send_sms_2.php?UserName=".urlencode($this->param[userid])."&Password=".urlencode($this->param[password])."&Type=Bulk&To=".urlencode($phone_list)."&Mask=".urlencode($this->sendname)."&Message=Hello%20World";
    //echo $url;
    $ch = curl_init($url);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $curl_scraped_page = curl_exec($ch);
    curl_close($ch);

}