处理大型远程文件时出现超时问题

时间:2011-10-28 08:22:29

标签: php file-get-contents

我遇到了一个脚本问题我需要从远程API收集信息我的脚本工作正常只有几行数据说200行,但是当我尝试运行更大的数据集时,页面最终会显示当我查看我的日志时,超时消息是唯一有用的thigg,它表示错误代码为500。

我已经尝试增加内存限制,执行时间和输入时间,看看这是否可以解决问题,但到目前为止我还没有发布我的脚本,如果有人能看到我做错了什么或者远程处理大文件的方法我会非常感激。

<?php
set_time_limit (0); 
ini_set('memory_limit','128M');
ini_set('max_execution_time','999');
ini_set('max_input_time','999');

load site settings
require_once ('config.php');

$id = mysql_real_escape_string($_GET['pr']);
$q = mysql_query("SELECT * FROM ".PREFIX."pings WHERE holderID='$id'") or die(mysql_error()); 
while(false !== ($r = mysql_fetch_assoc($q))) { 


   $response = file_get_contents("https://secure.comcetera.com/npl?user=".PINGUSERNAME."&pass=".PINGPASSWORD."&apiver=2.3&msisdn=".$r['r1']);      
   $data = split("\n",$response);

    if ($data[0]=="QUERYOK")
    {
        list($number,$network, $msg)=split(" ",$data[1]);
        if($msg ==''){$msg='OK';}
        $sql = mysql_query("SELECT network FROM ".PREFIX."networks WHERE code='".$network."'");
        $row = mysql_fetch_object($sql);
        mysql_query("UPDATE ".PREFIX."pings SET response='$msg', network='$row->network', dateUpdated='$dateandtime' WHERE r1='".$r['r1']."' ");
        //echo "Carrier for $number is $r->network";
    }
    else
    {
        mysql_query("UPDATE ".PREFIX."pings SET response='".$data[0]."', dateUpdated='$dateandtime' WHERE r1='".$r['r1']."' ");
    }

}
mysql_query("UPDATE ".PREFIX."pings_holder SET pinged='Yes' WHERE holderID  ='$id' ");
$_SESSION['success'] = 'Records Pinged '.$error;

header('Location: '.DIR);
exit();
    ?>

2 个答案:

答案 0 :(得分:0)

最好通过命令行运行脚本,对于处理大量数据的脚本来说,这通常更好。

您需要确保您的FTP用户具有shell访问权限,然后使用Putty之类的内容在您的服务器上执行php脚本。

答案 1 :(得分:0)

最好将这样的脚本作为单独的进程执行,客户端只启动进程。如果客户端不等待关闭浏览器怎么办? 看来您的脚本只更新数据库条目并报告已完成,因此没有API调用结果发送到客户端,您只需触发处理脚本

exec("php pingRecords.php > /dev/null &");

并向客户报告已经开始。

您最好使用curl_multi函数并行化API调用。 Curl似乎也有明显更好的表现,请参阅“file_get_contents VS CURL, what has better performance?